如果只用几行代码,就能把 Elasticsearch 中的数据交给 LLM,生成各种有趣内容会怎样?
现在,有了 ES|QL 的 COMPLETION
指令,这件事轻而易举。
本文将演示一个「Chuck Norris 段子生成器」:
我们先检索一部电影的简介,再让 GPT 模型写出一条闻所未闻的 Chuck Norris 段子,连 Rambo 都会自叹不如。
Chuck Norris(查克・诺里斯)是美国知名动作演员、武术家,1940 年出生,以硬朗的银幕形象和格斗技能闻名。他早年投身武术领域,曾获多项空手道赛事冠军,后来转型影视圈,代表作包括《德州巡警》(电视剧)、《三角洲部队》系列(电影)等,塑造了众多果敢勇猛的硬汉角色,在 20 世纪 80-90 年代的动作影视领域颇具影响力。 更广泛为人熟知的是,21 世纪后围绕他产生的大量 “查克・诺里斯笑话”(Chuck Norris Facts)—— 这类幽默段子以夸张、荒诞的手法调侃他的 “超强能力”,比如 “查克・诺里斯不需要闹钟,因为时间不敢迟到”“他的影子都怕他” 等。这些段子在网络上广泛传播,让他超越影视角色,成为一种流行文化符号,本文中结合电影生成相关段子,正是延续了这一流行文化梗。
示例数据集可从 Kaggle 下载:
https://www.kaggle.com/datasets/ursmaheshj/top-10000-popular-movies-tmdb-05-2023
下载后,可通过 Kibana 的 Data Visualizer 或 _bulk
API 导入到 Elasticsearch。
在使用 COMPLETION
之前,先通过 _inference
API 注册一个推理端点。以下示例把 GPT-4o 接入 Elastic:
PUT _inference/completion/my-gpt-4o-endpoint
{
"service": "openai",
"service_settings": {
"api_key": "<your_api_key>",
"model_id": "gpt-4o-2024-11-20"
}
}
完成后,就可以在 ES|QL 查询中直接引用 my-gpt-4o-endpoint
。
下面这条 ES|QL 查询做了所有事情:
POST _query
{
"query": """
FROM movies METADATA _score
| WHERE MATCH(title, ?query)
OR MATCH(overview, ?query)
| SORT _score DESC
| LIMIT 1
| EVAL prompt = CONCAT(?instruction, overview)
| COMPLETION chuck_norris_fact = prompt
WITH { "inference_id": "my-gpt-4o-endpoint" }
| KEEP title, overview, chuck_norris_fact
""",
"params": [
{ "instruction": "Generate a Chuck Norris Fact from the following description:\n" },
{ "query": "rambo III" }
]
}
示例响应(节选):
{
"values": [
"Rambo III",
"Combat has taken its toll on Rambo, ... Trautman is captured.",
"Chuck Norris once entered a monastery to find inner peace—five minutes later, he left because the monks couldn't handle his level of enlightenment. When Chuck heard Rambo needed help in Afghanistan, Chuck rescued Trautman, won the war, and trained a goat to ride a helicopter, all before Rambo finished tying his bandana."
]
}
没错,模型真这么说的。
FROM movies METADATA _score
| WHERE MATCH(title, ?query)
OR MATCH(overview, ?query)
| SORT _score DESC
| LIMIT 1
MATCH
同时搜索 title
和 overview
,按 _score
排序,仅保留第一条文档。
| EVAL prompt = CONCAT(?instruction, overview)
把静态指令 ?instruction
与电影简介 overview
拼在一起,生成 LLM 所需的 prompt
。
| COMPLETION chuck_norris_fact = prompt
WITH { "inference_id": "my-gpt-4o-endpoint" }
| KEEP title, overview, chuck_norris_fact
COMPLETION
把 Prompt 发给推理端点,并返回新字段 chuck_norris_fact
。
整条查询就是一个简洁的 RAG(Retrieval Augmented Generation)流程,完全在 Elasticsearch 内完成。
COMPLETION
目前仍处于技术预览,但它已经能实现摘要、内容生成、数据补充甚至「讲故事」等多种玩法。
不妨自己试试:
• 换一部你喜欢的电影
• 调整指令,让 LLM 写诗、写笑话,甚至把 SQL 错误改成五言绝句
欢迎分享你的创意!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。