海外からのアクセス:www.kdjingpai.com
Ctrl + D このサイトをブックマークする
現在の場所図頭 " コース情報

12ファクター・エージェント 3.コンテキスト・ウィンドウをコントロールする

2025-07-22 45

大きな言語モデルにコンテキストを渡すために、標準化されたメッセージベースのフォーマットを使う義務はない。

どんな瞬間でも、あなたがAIインテリジェンスの大きな言語モデルに与えるインプットは、"これまでに起こったすべてのことがここにあり、次に何をすべきかがここにある "というものだ。

すべてがコンテクスチュアル・エンジニアリングなのだ。 大規模言語モデルはステートレス関数彼らはインプットをアウトプットに変換する。最高のアウトプットを得るためには、最高のインプットを与える必要がある。

質の高いコンテクストを作るということ:

  • モデルに与えるヒントや指示
  • 取得したドキュメントや外部データ(例えば ラグ)
  • 過去の状態、ツールの呼び出し、結果、その他の履歴
  • 過去のニュースや出来事で、関連はあるが独立した情報源から得たもの(記憶)
  • どのような構造化データを出力するかの指示

12ファクター・エージェント 3.コンテクスト・ウィンドウをコントロールする-1

コンテクスチュアル・エンジニアリングについて

このガイドの目的は、現在のモデルからパフォーマンスを最大限に引き出す方法を探ることである。なお、このガイドでは以下の点には触れていない:

  • 温度、top_p、frequency_penalty、presence_penalty などのモデルパラメータの変更。
  • 独自の補完モデルや埋め込みモデルをトレーニングする
  • 既存モデルの微調整

繰り返しになるが、大規模な言語モデルにコンテキストを渡す最良の方法が何かはわからないが、あらゆる可能性を試せる柔軟性が必要だということはわかる。

標準およびカスタムコンテキストフォーマット

ほとんどのビッグ・ランゲージ・モデルのクライアントは、以下に示すような標準化されたメッセージベースのフォーマットを使用する:

[
{
"role": "system",
"content": "你是一个乐于助人的助手..."
},
{
"role": "user",
"content": "你能部署后端吗?"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "1",
"name": "list_git_tags",
"arguments": "{}"
}
]
},
{
"role": "tool",
"name": "list_git_tags",
"content": "{\"tags\": [{\"name\": \"v1.2.3\", \"commit\": \"abc123\", \"date\": \"2024-03-15T10:00:00Z\"}, {\"name\": \"v1.2.2\", \"commit\": \"def456\", \"date\": \"2024-03-14T15:30:00Z\"}, {\"name\": \"v1.2.1\", \"commit\": \"abe033d\", \"date\": \"2024-03-13T09:15:00Z\"}]}",
"tool_call_id": "1"
}
]

このアプローチはほとんどのユースケースでうまくいくが、今日の大規模な言語モデルのパフォーマンスを本当に最大化したいのであれば、次のような方法で可能な限り節約する必要がある。 トークン そして、大規模な言語モデルにコンテキストを入力する効率的な方法に注目する。

標準化されたメッセージ・ベースのフォーマットの代わりに、ユースケースに最適化されたカスタム・コンテキスト・フォーマットを構築することができます。例えば、カスタム・オブジェクトを使用し、必要に応じて、1つまたは複数のユーザー、システム、ヘルパー、またはツール・メッセージにパッケージ化/散布することができます。

これは、コンテクスト・ウィンドウ全体を1つのユーザー・メッセージに入れる例である:

[
{
"role": "system",
"content": "你是一个乐于助人的助手..."
},
{
"role": "user",
"content": |
这是目前为止发生的所有事情:
        
<slack_message>
来自: @alex
频道: #deployments
内容: 你能部署后端吗?
</slack_message>
<list_git_tags>
intent: "list_git_tags"
</list_git_tags>
<list_git_tags_result>
tags:
- name: "v1.2.3"
commit: "abc123"
date: "2024-03-15T10:00:00Z"
- name: "v1.2.2"
commit: "def456"
date: "2024-03-14T15:30:00Z"
- name: "v1.2.1"
commit: "ghi789"
date: "2024-03-13T09:15:00Z"
</list_git_tags_result>
下一步该怎么做?
}
]

モデルは、あなたが提供したスキーマから、あなたが求めているのは次のようなものだと推測するかもしれない。 what's the next stepしかし、プロンプトのテンプレートに明示的に追加しておいて損はない。

コード例

以下のようなコードで構築できる:

class Thread:
events: List[Event]
class Event:
# 可以只使用字符串,也可以是显式的 - 由你决定
type: Literal["list_git_tags", "deploy_backend", "deploy_frontend", "request_more_information", "done_for_now", "list_git_tags_result", "deploy_backend_result", "deploy_frontend_result", "request_more_information_result", "done_for_now_result", "error"]
data: ListGitTags | DeployBackend | DeployFrontend | RequestMoreInformation |  
ListGitTagsResult | DeployBackendResult | DeployFrontendResult | RequestMoreInformationResult | string
def event_to_prompt(event: Event) -> str:
data = event.data if isinstance(event.data, str) \
else stringifyToYaml(event.data)
return f"<{event.type}>\n{data}\n</{event.type}>"
def thread_to_prompt(thread: Thread) -> str:
return '\n\n'.join(event_to_prompt(event) for event in thread.events)

コンテキストウィンドウの例

この方法を使うと、コンテキスト・ウィンドウは次のようになる:

Slackの最初のリクエスト:

<slack_message>
来自: @alex
频道: #deployments
内容: 你能将最新的后端部署到生产环境吗?
</slack_message>

Gitタグを列挙した後

<slack_message>
来自: @alex
频道: #deployments
内容: 你能将最新的后端部署到生产环境吗?
Thread: []
</slack_message>
<list_git_tags>
intent: "list_git_tags"
</list_git_tags>
<list_git_tags_result>
tags:
- name: "v1.2.3"
commit: "abc123"
date: "2024-03-15T10:00:00Z"
- name: "v1.2.2"
commit: "def456"
date: "2024-03-14T15:30:00Z"
- name: "v1.2.1"
commit: "ghi789"
date: "2024-03-13T09:15:00Z"
</list_git_tags_result>

エラーとリカバリーの後:

<slack_message>
来自: @alex
频道: #deployments
内容: 你能将最新的后端部署到生产环境吗?
Thread: []
</slack_message>
<deploy_backend>
intent: "deploy_backend"
tag: "v1.2.3"
environment: "production"
</deploy_backend>
<error>
运行 deploy_backend 时出错: 连接部署服务失败
</error>
<request_more_information>
intent: "request_more_information_from_human"
问题: "我连接部署服务时遇到问题,你能提供更多详细信息和/或检查一下该服务的状态吗?"
</request_more_information>
<human_response>
data:
回复: "我不确定发生了什么,你能检查一下最新工作流的状态吗?"
</human_response>

ここから、次のステップに進むかもしれない:

nextStep = await determine_next_step(thread_to_prompt(thread))
{
"intent": "get_workflow_status",
"workflow_name": "tag_push_prod.yaml",
}

このXMLのようなフォーマットはほんの一例に過ぎない。ポイントは、アプリケーションに合ったカスタムフォーマットを構築できるということだ。さまざまなコンテキスト構造を試す柔軟性があれば、何を保存するか、何をより大きな言語モデルに渡すかを決めるだけでなく、より良い品質を得ることができる。

コンテクスト・ウィンドウをコントロールできる最大の利点:

  1. 情報密度大規模な言語モデルを最大限に理解できるように情報を整理する。
  2. エラー処理大規模な言語モデルの復旧に役立つ形式でエラーメッセージを含める。エラーや失敗した呼び出しが解決したら、コンテキスト・ウィンドウから非表示にすることを検討してください。
  3. 安全性:: ビッグ・ランゲージ・モデルに渡される情報を制御し、機密データをフィルタリングする。
  4. 熟練ユースケースのベストプラクティスを学びながら、フォーマットを調整する。
  5. トークン効率大規模言語モデルのトークン効率と理解のためのコンテキスト形式の最適化

コンテキストには、プロンプト、コマンド、RAGドキュメント、履歴、ツールコール、メモリが含まれます。

コンテキストウィンドウは、大きな言語モデルと対話するための主要なインターフェイスです。情報を整理して提示する方法をコントロールすることで、あなたの知能のパフォーマンスを大幅に向上させることができます。

例 - メッセージの密度 - 同じメッセージでトークンの数が少ない:

12ファクター・エージェント 3.コンテキスト・ウィンドウをコントロールする - 2

私の言葉を鵜呑みにしないでほしい。

12ファクター・エージェントのリリースから約2ヶ月後、コンテキスト・エンジニアリングはかなりポピュラーな言葉になり始めた。

12 - ファクター・エージェント 3. コンテキスト・ウィンドウをコントロールする - 3   12ファクター・エージェント 3.コンテキスト・ウィンドウをコントロールする -4

加えてレナドロイド 2025年7月にも、かなり良いものをリリースしている。 コンテクスチュアル・エンジニアリング早見表.

12ファクター・エージェント 3.コンテキスト・ウィンドウをコントロールする - 5

ここで繰り返されるテーマは、何が最善のアプローチなのかはわからないが、あらゆる可能性を試せる柔軟性が必要だということだ。

おすすめ

AIツールが見つからない?こちらをお試しください!

キーワードを入力する アクセシビリティこのサイトのAIツールセクションは、このサイトにあるすべてのAIツールを素早く簡単に見つける方法です。

受信箱

お問い合わせ

トップに戻る

ja日本語