最近、私たちは API 仕様の全てを単一のテキストファイルにまとめた Meta-Prompt を公開しました。これは LLM 向けのドキュメントと考えることができ、Reader、Embeddings、Reranker などの API インテグレーションを自動生成するのに使用できます。
私たちのプロンプトを ChatGPT/Claude にコピー&ペーストするか、llm
コマンドにシステムプロンプトとしてパイプするだけで簡単に使えます。その後、構築したいものを指定するプロンプトを追加します(以下で実演します)。Web スクレイピング、エンベディング処理、さらには完全な RAG システムを構築するアプリケーションを LLM を使って素早く作成したい場合に最適です。しかも、ハルシネーションを最小限に抑えることができます。
tagなぜ Meta-Prompt が必要なのか?
Jina の API を使用するコードを LLM に生成させたいとしましょう。GPT-4 にそれをお願いしてみましょう:
良さそうに見えますよね?from jina import Client
もちゃんとありますし。
ただし、小さな問題があります:Jina パッケージはメンテナンスモードであり、これは私たちの API にアクセスする正しい方法ではありません。たとえ Jina パッケージをインストールしたとしても、生成されたプログラムを実行しようとすると、クラッシュしてしまいます:
では、単純に GPT に Jina の API をウェブで検索させればいいのでしょうか?結果はこうなります:
しかし、コードを見てみると、関連する Jina の API をすべて使用しているわけではありません。Reader の存在を明らかに見つけられず、代わりにスクレイピングのために BeautifulSoup をインストールさせています。さらに、BeautifulSoup でスクレイピングができる(はずの)場合でも、Jina Embeddings のレスポンス形式を正確にパースできず、クラッシュを引き起こしています:
しかし、ChatGPT がウェブ検索を使って適切に実行できたとしても、Claude のような他の多くの LLM は現在ウェブ検索をサポートしていないため、選択肢が大幅に制限されてしまいます。
ここで Meta-Prompt が真価を発揮します。Meta-Prompt を使用すると、Jina の API のコンテキストと仕様をすべて LLM に読み込むことができます。これにより、LLM は幻覚や不要な回避策なしに Jina の API を直接活用するコードを生成でき、最初から動作するコードを提供します。
tagMeta-Prompt を使用した実験
Meta-Prompt の能力を試すため、いくつかの実験を行い、結果を評価しました。特に指定がない限り、LLM として Claude-3.5-Sonnet を使用しました。
すべての実験において、生成されたコードを実行する前に、JINA_API_KEY
や ANTHROPIC_API_KEY
などの関連 API キーを環境変数として指定しました。
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:CLI から Hacker News を可視化する
コマンドラインの達人であれば、cURL を使って CLI から Meta-Prompt を使用できます。まず、llm
Python パッケージをインストールする必要があります:
pip install llm
そして Claude-3 プラグインをインストールします:
llm install llm-claude-3
最後のセットアップとして、Anthropic API キーを指定します:
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 を学んでいるので、レポジトリとウィキをナレッジベースとして使用します。シンプルに保つため、データベースは使用せず、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 をもっと投入すれば解決できない問題はありませんよね。そこで、元の出力を「解体」するためのプロンプトをもう1つ追加しましょう:
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
ディレクトリを反復処理します。 - メタプロンプトと各プロンプトテキストを Claude-3.5-Sonnet(
llm
経由)に渡します。 - その出力を再び Claude に渡し、今度はコードだけを残すようにプロンプトします。
- それを
apps
ディレクトリのファイルに書き込みます。
デモをお見せしたいところですが、見せるものはあまりありません。単にどのプロンプトファイル名を処理しているかを記録し、それ以外は画面に興味深い出力を表示することなく静かに動作します。
アプリファクトリーを次のレベルに引き上げるには、Factorio のように、アプリのアイデアを生成し、そこからファクトリーに入力するプロンプトを生成するもう 1 つのスクリプトを書くこともできます。私たちはまだそれを実装していませんが、読者の皆さんへの課題として残しておきます。
tagMeta-Prompt を使って分かったこと
Meta-Prompt を使用することで、自分たちのプロンプトに何を入れるべきか、そして異なる LLM がどのように異なる出力を生成するかについて、多くのことを学びました。
tag一般的な観察
- API の専門化:タスク特化型 API(例:書籍関連のクエリには Google Books)を使用することで、汎用検索 API よりも一貫した結果が得られ、トークン使用量を削減し信頼性を向上させることができます。
- 再利用可能なカスタムプロンプト:非対話型のセットアップでは、プロンプトを
.txt
ファイルとして保存し CLI にパイプすることで、余分な説明テキストを排除してコードのみの出力を効率的に得ることができます。 - 構造化された出力:出力(通常は JSON 形式)を保存し必要に応じて再読み込みすることで、トークンを節約し、トークン使用が高コストになる可能性のある埋め込み生成などのタスクを効率化できます。
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
コマンドを使用できると伝えると、存在しない Python のllm()
関数を呼び出そうとすることがよくあります。 - 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 をご覧ください。