使用 ES|QL COMPLETION + 一个 LLM 在 5 分钟内编写一个 Chuck Norris 事实生成器

作者:来自 Elastic Aurélien Foucret

发现如何使用 ES|QL COMPLETION 命令,通过一个 LLM 在几行代码中将你的 Elasticsearch 数据转化为创意输出。

Elasticsearch 有对行业领先的 Gen AI 工具和服务商的原生集成。查看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic Vector Database 构建生产级应用。

为了为你的用例构建最佳搜索解决方案,可以立即开始免费的 cloud 试用,或者在本地机器上尝试 Elastic。


如果你能只用几行代码,就把 Elasticsearch 数据转化为创意输出,会怎么样?借助 ES|QL 中的新 COMPLETION 命令,现在你可以做到。

我们来构建一个有趣的东西来展示它:Chuck Norris 事实生成器。我们会结合电影描述和 GPT 模型来生成连 Rambo 都会惊叹的传奇事实。

你需要准备什么

  • 一个 LLM(比如我们下面示例中的 OpenAI 的 GPT-4o)

  • 一份电影描述的数据集

你可以从 Kaggle 下载一个示例数据集,并使用 Kibana 中的 Data Visualizer 或 _bulk API上传到你的 Elasticsearch 集群。

设置 inference endpoint

在你能运行 COMPLETION 命令之前,你需要通过 _inference API 为你要用的模型创建一个 inference endpoint。

以下是如何用 OpenAI 设置 GPT-4o 的方法:

bash 复制代码
`

1.  PUT _inference/completion/my-gpt-4o-endpoint
2.  {
3.    "service": "openai",
4.    "service_settings": {
5.      "api_key": "<your_api_key>",
6.      "model_id": "gpt-4o-2024-11-20"
7.    }
8.  }

`AI写代码

一旦完成这些,你就可以在查询中直接引用 my-gpt-4o-endpoint

查询

神奇的地方就在这里。这个单一的 ES|QL 查询处理了整个工作流:它会根据你的输入找到一部电影,从它的描述中构建提示词,然后调用 LLM 生成一个传奇的 Chuck Norris 笑话。下面是支持我们 Chuck Norris 笑话生成器的完整 ES|QL 查询。它接受一个电影查询,检索最相关的描述,把它转化为提示词,并在一个管道式的查询中发送给 LLM。

python 复制代码
`

1.  POST _query
2.  {
3.    "query": """
4.        FROM movies METADATA _score
5.        | WHERE MATCH(title, ?query) OR MATCH(overview, ?query)
6.        | SORT _score DESC
7.        | LIMIT 1
8.        | EVAL prompt=CONCAT(?instruction, overview)
9.        | COMPLETION chuck_norris_fact = prompt WITH { "inference_id": "my-gpt-4o-endpoint" }
10.        | KEEP title, overview, chuck_norris_fact
11.    """,
12.    "params": [
13.      { "instruction": "Generate a Chuck Norris Fact from the following description:\\\n" },
14.      { "query": "rambo III" }
15.    ]
16.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

返回的结果如下:

bash 复制代码
`

1.  {
2.    "took": 1626,
3.    "is_partial": false,
4.    "documents_found": 1,
5.    "values_loaded": 2,
6.    "columns": [
7.      {
8.        "name": "title",
9.        "type": "text"
10.      },
11.      {
12.        "name": "overview",
13.        "type": "text"
14.      },
15.      {
16.        "name": "chuck_norris_fact",
17.        "type": "keyword"
18.      }
19.    ],
20.    "values": [
21.        "Rambo III",
22.        "Combat has taken its toll on Rambo, but he's finally begun to find inner peace in a monastery. When Rambo's friend and mentor Col. Trautman asks for his help on a top secret mission to Afghanistan, Rambo declines but must reconsider when Trautman is captured.",
23.        "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."
24.    ]
25.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

是的,模型真的这么说了。💪🐐🚁

解析查询

让我们逐步解析查询并拆解发生的事情。

步骤 1:检索相关的电影数据

我们从为用户查询搜索最相关的电影开始。

我们使用 MATCH 函数在 title 和 overview 字段中搜索由查询参数提供的文本,只保留第一个结果,并使用 metadata _score 字段按相关性排序:

sql 复制代码
`

1.  FROM movies METADATA _score
2.  | WHERE MATCH(title, ?query) OR MATCH(overview, ?query)
3.  | SORT _score DESC
4.  | LIMIT 1

`AI写代码

这将把我们的数据集缩小到最佳匹配,得到电影的标题和描述,这些将成为 LLM 的上下文。

步骤 2:从上下文构建提示

现在我们通过把作为查询参数提供的静态指令(用 ?instruction 表示)与电影的 overview 拼接起来,为 LLM 创建输入提示:

ini 复制代码
`| EVAL prompt = CONCAT(?instruction, overview)`AI写代码

这会创建一个新的 prompt 列,将提供的指令与返回文档的 overview 字段结合起来,对于我们的请求看起来大致如下:

vbnet 复制代码
`

1.  Generate a Chuck Norris Fact from the following description:
2.  Combat has taken its toll on Rambo, but he's finally begun to find inner peace in a monastery. When Rambo's friend and mentor Col. Trautman asks for his help on a top secret mission to Afghanistan, Rambo declines but must reconsider when Trautman is captured.

`AI写代码

你可以轻松更换不同的指令,通过调整 instruction 参数来改变 LLM 生成内容的语气或风格。而且因为 prompt 只是另一个 ES|QL 表达式,你可以用任何生成字符串的函数来组合它------无论是简单拼接、条件逻辑,还是根据文档内容进行格式化。

步骤 3:使用 LLM 生成文本

最后,我们使用新的 COMPLETION 命令,将 prompt 传给连接到模型的 inference endpoint,并选择要返回的字段:

ini 复制代码
`

1.  | COMPLETION chuck_norris_fact = prompt WITH { "inference_id": "my-gpt-4o-endpoint" }
2.  | KEEP title, overview, chuck_norris_fact

`AI写代码

结果?一个 Chuck Norris 事实,基于你的电影数据生成,无需额外工具。

这个示例也展示了 ES|QL 管道结构的全部威力。每一步自然衔接到下一步,让你可以在一个声明式查询中表达完整的检索增强生成(retrieval augmented generation - RAG)流程。它干净、可组合,并且完全在 Elasticsearch 内部运行。

接下来做什么?

虽然 COMPLETION 命令仍处于技术预览阶段,这个新功能开启了全新的可能性 ------ 从摘要和内容生成,到丰富信息和讲故事。自己试试吧!指向你最喜欢的电影,调整 prompt,或者随心所欲地从 SQL 错误生成俳句。力量掌握在你手中。

告诉我们你构建了什么!💬

原文:Using ES|QL COMPLETION + an LLM to write a Chuck Norris fact generator in 5 minutes - Elasticsearch Labs

相关推荐
arvin_xiaoting1 天前
#zsh# #Ubuntu# 一键安装zsh、oh-my-zsh、常用插件
linux·ubuntu·elasticsearch
bemyrunningdog1 天前
IntelliJ IDEA合并分支到master全攻略
大数据·elasticsearch·intellij-idea
dessler1 天前
Elasticsearch(ES)分片(Shard)和 副本分片(Replica Shard)
linux·运维·elasticsearch
paj1234567891 天前
elasticsearch-8.12.2集群部署
java·elasticsearch
liliangcsdn1 天前
如何基于ElasticsearchRetriever构建RAG系统
大数据·elasticsearch·langchain
相与还2 天前
IDEA和GIT实现cherry pick拣选部分变更到新分支
git·elasticsearch·intellij-idea
Elastic 中国社区官方博客2 天前
Simple MCP Client - 连接到 Elasticsearch MCP 并进行自然语言搜索
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
会飞的小蛮猪2 天前
ELK运维之路(Logstash测试案例1)
elasticsearch·kibana·logstash
tcwgq2 天前
Centos Stream 8 搭建Cas Server
linux·elasticsearch·centos
yumgpkpm2 天前
CMP (类Cloudera) CDP7.3(400次编译)在华为鲲鹏Aarch64(ARM)信创环境中的性能测试过程及命令
大数据·hive·hadoop·python·elasticsearch·spark·cloudera