我們最近發布了 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 金鑰:
export ANTHROPIC_API_KEY=
現在,讓我們寫一個 prompt 來視覺化 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:使用 Meta-Prompt 建立應用工廠
現在我們可以非交互式地生成腳本和應用程式,我們可以輕鬆地自動化一個「應用工廠」——一個遍歷提示並產生 Python 腳本作為輸出的腳本。你現在可以在 GitHub gist 中獲取應用工廠腳本:

簡而言之,它的功能是:
- 遍歷包含提示文件的
prompts
目錄。 - 通過
llm
將 Meta-Prompt 和每個提示文本傳遞給 Claude-3.5-Sonnet。 - 將輸出再次傳遞給 Claude,這次使用告訴它只保留代碼的提示。
- 將其寫入
apps
目錄中的文件。
我們本想展示一個演示,但沒什麼可看的。它只會記錄正在處理的提示文件名,除此之外,它會靜默運行,不會向螢幕輸出任何有趣的內容。
要將應用程式工廠提升到下一個層次,你可以完全採用 Factorio 的方式,編寫另一個腳本來生成應用程式想法,然後從中生成提示來輸入工廠。我們還沒有這樣做,但我們把它留給你,讀者,作為練習。
tag使用 Meta-Prompt:我們發現了什麼?
通過使用 Meta-Prompt,我們學到了很多,包括如何編寫自己的提示,以及不同的 LLM 如何生成不同的輸出。
tag一般觀察
- API 專業化:使用特定任務的 API(例如用於書籍相關查詢的 Google Books)比使用通用搜索 API 能確保更一致的結果,這可以減少 token 使用並提高可靠性。
- 自定義提示的可重用性:對於非互動式設置,將提示保存為
.txt
檔案並將其通過管道輸入 CLI,可以有效地只輸出代碼,避免額外的解釋文本造成混亂。 - 結構化輸出:存儲輸出(通常是 JSON 格式)並在需要時重新載入可以節省 token 並簡化任務,比如生成 embeddings,這種情況下 token 使用可能會很昂貴。
tag使用不同 LLM 的見解
GPT
- 提示保留問題:GPT-4o 有時會在長指令中遺失細節,導致它在討論過程中"忘記"關鍵元素。當你必須提醒它一些簡單的事情時,這會導致大量的挫折感。
- API 整合挑戰:在像整合 Milvus Lite 與 jina-embeddings-v3 這樣的情況下,即使我們提供了 Milvus Lite API 指令,GPT-4o 還是完全且反覆地失敗,生成的代碼創建的數據庫缺少剛剛生成的 embeddings,使語義搜索應用變得不可能。
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 確保生成的代碼從一開始就準確且可用。無論是驗證陳述、生成 embeddings、構建輕量級 RAG 系統,還是自動化應用程式創建,Meta-Prompt 都能將自然語言指令轉換為可操作、正確的代碼,繞過了與 LLM 反覆溝通以獲得實際可用結果的典型過程。
無論你是將 Meta-Prompt 複製到 ChatGPT 中,還是使用自定義 LLM 命令,它都提供了一種直接、可靠的方式來利用 Jina 的功能。我們的實驗和見解顯示 Meta-Prompt 是一個將其穩健地整合到你的項目中的可靠工具。
如果你準備好探索 Meta-Prompt 能做什麼,請前往 docs.jina.ai 查看最新的文件和資源。