我们最近发布了 Meta-Prompt,这是一个概述所有 API 规范的单个文本文件。你可以将其视为面向 LLM 的文档,并使用它来自动生成我们的 API 集成,包括 Reader、Embeddings、Reranker 等。
使用方法很简单,只需将我们的提示复制粘贴到 ChatGPT/Claude 中,或者将其作为系统提示通过管道传递给 llm 命令,然后添加你自己的提示来指定想要构建的内容(我们将在下文演示)。如果你想使用 LLM 快速构建用于网络爬取、处理嵌入或者甚至是完整的 RAG 系统的应用程序,这是一个很好的方法。而且所有这些都能最大限度地减少幻觉。
tag为什么我需要 Meta-Prompt?
假设你想使用 LLM 生成使用 Jina API 的代码。让我们让 GPT-4 来试试看:
看起来不错,对吧?它包含了 from jina import Client 和其他所有内容。
但有一个小问题:Jina 包目前处于维护模式,它并不是访问我们 API 的正确方式。即使你确实安装了 Jina 包,当你尝试运行生成的程序时,它也会崩溃:
那么怎么办?我们可以让 GPT 在网上搜索 Jina 的 API,对吧?以下是我们得到的结果:
然而,如果你查看代码,你会发现它并没有使用所有相关的 Jina API。它显然没有发现 Reader 是一个可用的工具,而是让我们安装 BeautifulSoup 来进行爬取。而且,即使它(据说)可以用 BeautifulSoup 进行爬取,它也没有准确解析 Jina Embeddings 的响应格式,导致崩溃:
然而,即使 ChatGPT 能够通过搜索正确完成这项任务,许多其他 LLM(如 Claude)目前还不支持网络搜索,这严重限制了你的选择。
这就是 Meta-Prompt 大放异彩的地方。使用 Meta-Prompt,你可以将 Jina 的 API 的所有上下文和规范加载到 LLM 中。这意味着 LLM 可以直接生成利用 Jina API 的代码,而不会产生幻觉或不必要的变通方案,让你一次就能得到可用的代码。
tagMeta-Prompt 实验
为了测试 Meta-Prompt 的性能,我们进行了一些实验并评估了结果。除非特别说明,我们使用的是 Claude-3.5-Sonnet 作为 LLM。
对于所有实验,我们在运行生成的代码之前都将相关的 API 密钥(如 JINA_API_KEY 和 ANTHROPIC_API_KEY)设置为环境变量。
tag实验 1:使用 ChatGPT 中的 Meta-Prompt 验证声明
我们正在撰写这篇文章时恰逢美国大选之后,比以往任何时候都有更多的虚假信息在流传。我们如何从信息流中分离出有价值的信号,只获取好的内容而不要谎言呢?
假设我们想要检查 BBC.com 上关于一项新的英国法律的报道是否准确,具体是这样一个说法:
"英国政府已宣布一项新法律,该法律将要求社交媒体公司验证其用户的年龄。"
我们可以将 Meta-Prompt 复制粘贴到 ChatGPT 中,然后输入我们自己的提示来生成相关代码,比如:
Write the JavaScript code to check the validity
of the following statement on bbc.com:
"The UK government has announced a new law
that will require social media companies to
verify the age of their users."
然后我们可以运行该代码运行 node grounding.js(在安装好必要的包如 axios 之后)。我们会得到如下输出,显示该声明是真实的,并附带来源:
tag实验 2:从命令行可视化 Hacker News
如果你更喜欢命令行操作,你可以通过 cURL 使用 Meta-Prompt。首先,你需要安装 llm Python 包:
pip install llm
然后安装 Claude-3 插件:
llm install llm-claude-3
最后一步设置是指定你的 Anthropic API key:
export ANTHROPIC_API_KEY=<your key>
现在,让我们编写一个提示来可视化 Hacker News 首页的每个句子:
grab every sentence from hackernews frontpage and
visualize them in a 2d umap using matplotlib
我们可以用以下命令将其管道传递给 llm 命令:
curl docs.jina.ai | llm -s "grab every sentence from hackernews frontpage and visualize them in a 2d umap using matplotlib" -m claude-3.5-sonnet
如果我们提取并运行生成的代码,我们会得到类似这样的结果:
requirements.txt。在这个例子中我们需要 UMAP 和 Matplotlib,但你的具体需求可能会有所不同。tag实验 3:使用 JSON 存储构建简单的 RAG 系统
为了进一步推进,让我们创建一个简单的 RAG 系统。在我的业余时间,我正在学习 SolidPython,因此我们将使用该仓库和 wiki 作为知识库。为了保持简单,我们不使用数据库,而是将数据存储在 JSON 文件中。
以下是存储在 prompt.txt 文件中的提示:
Create a simple RAG system using pages from these sources:
- repo: <https://github.com/jeff-dh/SolidPython>
- wiki: <https://github.com/jeff-dh/SolidPython/wiki> (and all the subpages)
Scrape no other pages.
Instead of using vector database, use JSON file
You can access an LLM with the CLI command: llm 'your prompt' -m claude-3.5-sonnet
After segmenting and indexing all the pages, present a prompt for the user to ask a
question. To answer the question, find the top three segments and pass them to the LLM
with the prompt:
--- prompt start ---
Based on these segments:
- {segment 1}
- {segment 2}
- {segment 3}
Answer the question: {question}
--- prompt end ---正如你所见,我们可以通过在提示中指定来为 LLM 提供额外的工具。如果没有这个,Claude 通常会产生一种不太理想(甚至是有问题的)方式来将 LLM 添加到 RAG 系统中。
由于这是一个很长的提示(包含很多可能会破坏我们运行的任何管道的标点符号),我们将使用文本 $(cat prompt.txt) 而不是提示本身来运行我们的命令:
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet
呼!输出真是不少。但是(就像 Hacker News 的例子一样)从这个大文本块中提取和运行代码是很麻烦的。当然,没有什么问题是不能通过扔更多的 LLM 来解决的,对吧?所以让我们添加另一个提示来"解块"原始输出:
leave just the code in this file, remove all surrounding explanatory text.
do not wrap code in backticks, just return "pure code"现在我们把它添加到我们的命令管道并运行:
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet | llm -s 'leave just the code in this file, remove all surrounding explanatory text. do not wrap code in backticks, just return "pure code"' -m claude-3.5-sonnet > app.py
> app.py 将所有输出重定向到文件,所以视频中没有什么可显示的。然后我们可以用 python app.py 运行这个程序。如你所见,它可以回答问题并维持工作记忆:
tag实验 4:使用元提示构建应用程序工厂
现在我们可以以非交互方式生成脚本和应用程序,我们可以轻松地自动化一个"应用程序工厂"——一个遍历提示并生成 Python 脚本作为输出的脚本。您现在可以在 GitHub gist 中获取应用程序工厂脚本:

简而言之,它做以下工作:
- 遍历包含提示文件的
prompts目录。 - 通过
llm将元提示和每个提示文本传递给 Claude-3.5-Sonnet。 - 获取输出并再次传递给 Claude,这次使用的提示是让它只保留代码。
- 将其写入
apps目录中的文件。
我们本想展示一个演示,但没什么可看的。它只是记录它正在处理哪个提示文件名,除此之外就是静默操作,屏幕上没有有趣的输出。
要将应用程序工厂提升到下一个层次,你可以采用完整的 Factorio 方式,编写另一个脚本来生成应用程序创意,然后生成提示输入到工厂中。我们还没有这样做,但我们把它作为一个练习留给你,读者。
tag使用 Meta-Prompt:我们发现了什么?
我们从使用 Meta-Prompt 中学到了很多,包括如何编写我们自己的提示,以及不同的 LLM 如何生成不同的输出。
tag一般性观察
- API 专业化:使用特定任务的 API(例如,使用 Google Books 进行图书相关查询)比通用搜索 API 能确保更一致的结果,这可以减少 token 使用量并提高可靠性。
- 可重用的自定义提示:对于非交互式设置,将提示保存为
.txt文件并通过 CLI 传输它们,可以高效地仅输出代码,避免额外的解释性文本造成混乱。 - 结构化输出:存储输出(通常是 JSON 格式)并根据需要重新加载它们,可以节省 token 并简化任务,比如生成嵌入向量时,token 使用可能会很昂贵。
tag使用不同 LLM 的见解
GPT
- 提示保留问题:GPT-4o 有时会在遇到冗长指令时丢失细节,导致在讨论过程中"忘记"关键元素的问题。当你必须提醒它一些简单的事情时,这会导致很多挫折感。
- API 集成挑战:在像将 Milvus Lite 与 jina-embeddings-v3 集成这样的情况下,即使我们提供了 Milvus Lite API 说明,GPT-4o 也会完全且反复失败,生成的代码创建的数据库缺少刚刚生成的嵌入向量,使语义搜索应用变得不可能。
Claude
- 代码输出限制:Claude-3.5 经常生成看似完整但存在潜在问题的脚本,比如缺少错误处理或未考虑缺失的 API 密钥。此外,它有时会依赖预设示例,而不是根据具体指令生成定制响应。
- 静默输出:对于 LLM 生成的代码来说,拥有一些后台运行日志确实很有帮助,这样可以确保模型没有搞砸。除非你直接指定要这样做,否则用 Claude 创建的应用程序通常会静默运行,让你完全不知道发生了什么。
- 与 CLI 的交互:你需要清楚地指定 CLI 命令就是CLI命令。如果你告诉 Claude 它可以使用
llm命令,它经常会尝试调用一个不存在的 Pythonllm()函数。 - Claude 3.5-Sonnet 是最佳选择:Claude-3.5-Haiku 在初始测试中似乎也表现不错,但 Opus 和 Sonnet-3 只是总结了 Jina API 说明,没有考虑用户提示。
tag结论
使用 Meta-Prompt 提供了将 Jina 的 API 与 LLM 集成的新方法,让你能够运行实验并构建一次就能工作的应用程序。不再有崩溃、错过的 API 连接或幻觉函数——Meta-Prompt 确保生成的代码是准确的,并且可以直接使用。无论是验证声明、生成嵌入向量、构建轻量级 RAG 系统,还是自动化应用程序创建,Meta-Prompt 都能将自然语言指令转化为可执行的、正确的代码,绕过与 LLM 反复交互以获得实际可用的代码的过程。
无论你是将 Meta-Prompt 复制到 ChatGPT 中,还是将其与自定义 LLM 命令一起使用,它都提供了一种直接、可靠的方式来利用 Jina 的功能。我们的实验和见解表明,Meta-Prompt 是一个可靠的工具,可以稳固地集成到你的项目中。
如果你准备好探索 Meta-Prompt 能做什么,请访问 docs.jina.ai 获取最新的文档和资源。






