チャットエージェントがやっているのは隠蔽された履歴管理ということで、実証実験も兼ねて履歴管理されていない非対話モードのgemini-cliという格好の素材を使って自分で履歴管理しつつ、マルチエージェントを実現するためのツールであるpipeというツールを作ってみました。
複数の利用方法が可能です。
- CLI
- WebUI
- AIエージェント
1. 履歴管理の透明化と柔軟な制御
従来のチャットエージェントでは、過去の会話履歴はブラックボックス化されており、「なぜLLMが期待通りの応答をしないのか?」という疑問が生じても、その原因を特定するのは困難でした。これは、従来のシステム開発でログが見えない、変数の状態が追えないといった状況に似ています。
pipeは、この課題に対し「完全なコンテキスト制御」というソリューションを提供します。プロンプトは構造化されたJSONスキーマで再構築され、会話履歴は人間が読めるJSONセッションファイルとして保存されます。これにより、開発者は以下のメリットを享受できます。
- 非対話型エージェントの対話的利用: 履歴を自由に編集、再試行、洗練できるため、ステートレスなLLMをあたかも対話型エージェントのように扱うことが可能になります。特定の時点に戻ってプロンプトを修正し、異なる応答を試すといった柔軟なワークフローが実現します。
- プロンプトデバッグの劇的な容易さ: 履歴が可視化され、編集可能であるため、LLMがなぜ特定の応答をしたのかを詳細に分析し、問題のあるプロンプトをピンポイントで修正できます。Web UIによる視覚的な履歴管理と編集機能は、このプロセスをさらに直感的にします。
-
履歴の圧縮制御: 長い会話履歴は、LLMのコンテキストウィンドウを圧迫し、「Lost in the Middle」問題を引き起こす可能性があります。
pipeでは試験的に圧縮も用意しています。しかし、これは圧縮を良しとしてのものでなく、圧縮後の動作検証という意味合いが強いです。これはベクトル/グラフDBを積んでいないことにも起因しています。
2. 構造化されたプロンプトにより、LLMに意図を正確に伝達
pipeは、LLMへの指示を単なるテキストの羅列ではなく、構造化されたJSONスキーマとして再構築します。これにより、従来のチャットエージェントでは難しかった、LLMへの意図の正確な伝達と、曖昧さの排除を実現します。
--dry-runフラグを使用すればpipeが生成する最終的なJSONプロンプトを確認できます。このJSONオブジェクトは、LLMに送信される構造化された入力を示しており、session_goal、roles、constraints、conversation_history、current_taskといったメタコンテキストが明確に定義されています。
下記が生成されたJSONのサンプル(見やすい様にprettyされていることに注意)です。
{
"description": "Comprehensive JSON request for an AI sub-agent, clearly separating immutable constraints from dynamic context, with a flexible thinking pipeline.",
"session_goal": {
"description": "The immutable purpose and background for this entire conversation session.",
"purpose": "src/components/atoms/Button の実装",
"background": "Reactプロジェクト開始に向けたコンポーネント準備"
},
"roles": {
"description": "A list of personas or role definitions that the AI sub-agent should conform to.",
"definitions": [
"# Role: Software Engineer\\n\\nYou are a professional software engineer. Your primary goal is to write clean, efficient, and maintainable code based on the provided instructions and context. Adhere to best practices and coding standards relevant to the specified language.\\n"
]
},
"constraints": {
"description": "Constraints the agent must adhere to when generating responses.",
"language": "Japanese",
"hyperparameters": {
"description": "Contextual instructions to control the AI model's generation process. The model should strive to follow these instructions.",
"temperature": {
"type": "number",
"value": 0.2,
"description": "Be precise and factual. A lower value is preferred for deterministic output."
},
"top_p": {
"type": "number",
"value": 0.5,
"description": "Consider a broad range of possibilities, but adhere strictly to the temperature setting."
},
"top_k": {
"type": "number",
"value": 5,
"description": "Limit the generation to the top 5 most likely tokens at each step."
}
},
"processing_config": {
"description": "Configuration for the agent's internal processing and reasoning.",
"multi_step_reasoning_active": false
}
},
"main_instruction": {
"description": "The mandatory, high-level processing sequence for every input. If 'processing_config.multi_step_reasoning_active' is true, Step 4 must invoke the 'advanced_reasoning_flow'.",
"flowchart": "```mermaid\\ngraph TD\\n A[Start] --> B[Step 1: Identify Task from 'current_task'];\\n B --> C[Step 2: Gather Context (History & Constraints)];\\n C --> D[Step 3: Summarize Context & Plan];\\n D --> E[Step 4: Execute Thinking Process (Conditionally Advanced)];\\n E --> F[Step 5: Generate Final Response];\\n F --> G[End];\\n```"
},
"conversation_history": {
"description": "Historical record of past interactions in this session, in chronological order.",
"turns": []
},
"current_task": {
"description": "The specific task that the AI sub-agent must currently execute.",
"instruction": "React、Atomic Design, Vanilla Extractを使ってButtonコンポーネントを作りたい"
}
}
この構造化されたプロンプトにより、LLMは単なる指示だけでなく、その背景にある目的、制約、過去の経緯、そして自身の思考プロセスまでを深く理解し、より的確で一貫性のある応答を生成することが可能になります。
3. CLIによる自動化とオープンソースの自由度
pipeは、コマンドラインインターフェース(CLI)を提供することで、LLMとの対話ワークフローの自動化を容易にします。gemini-cliのような非対話モードのツールがデフォルトでは履歴を持たないという課題に対し、pipeはユーザー自身が履歴管理を制御できるソリューションを提供します。
また、単なるコマンドラインツールであるが故にスクリプトやAIエージェントから利用するといった使い方も可能です。マルチプロセスなプログラムやスクリプトを書くだけで並列処理も可能です。
- 自動化の容易さ: CLIやWebUIを通じてセッションの開始、続行、圧縮といった操作をスクリプト化できるため、反復的なタスクや複雑なワークフローを効率的に自動化できます。
-
バックエンドの柔軟性:
pipeはデフォルトでgemini-cliをベースとしていますが、好きなものに変更して使うなり、モデルを変更するなりして下さい。 -
JSON Schemaのカスタマイズ:
pipeが生成するプロンプトのJSON Schemaは、ユーザーのニーズに合わせて自由にカスタマイズ可能です。これにより、特定のLLMの特性に合わせた最適化や、独自のメタコンテキストの追加など、高度なプロンプトエンジニアリングを実現できます。 -
オープンソースの恩恵:
pipeはCC0 1.0 Universal Public Domain Dedicationライセンスで公開されており、誰でも自由に利用、カスタマイズ、再配布が可能です。
結論
現状では完全なプロダクトというよりも実験的な意味合いも強いpipeですが、自動化やマルチプロセスを試してみたいという方には規模も小さく試しやすいと考えています。既存のAIエージェントはチャット形式で簡単に使える反面、自動化が難しく構造化されたプロンプトを常に送るのことも現実的ではありませんでした。
初回のみpurposeとbackgroundという静的な目的を追加で入力する必要はありますが、2回目以降はチャット形式で利用することが可能になります。ベクトル/グラフDBは搭載していませんが、従来のチャットエージェントでは難しかったタスク分割が容易になることでエージェントの使い捨てという選択肢が取りやすくなり、結果的にRAGを使う必要性も薄れると考えています。
pipe自体が全面的にGeminiにコードを書いてもらったので、ツッコミどころも多いとは思いますが、同様にAIエージェントが改修しやすいという側面もあります。興味があれば自分好みにカスタマイズして使ってみて下さい。ツールの上辺だけでなくもう少しLLMに近いところを触ることで新たな発見があるでしょう。