Univoco、コーディングエージェントの障害対策を強化
- •Univocoは本番環境で検索、検索取得、編集の失敗が出た後、私有文書向けコーディングエージェントを強化した
- •Loop制御は、1ターンで12ステップと170k入力トークンを使った事例を含む反復検索を止めた
- •`lookup_docs`は生成なしでミリ秒単位で動き、`rag_lookup`は10〜30秒かかり、作り話をする可能性がある
Univocoのエンジニア、ジョー・バックル(Joe Buckle)はJuly 31、独自の文書レイアウトエンジン向けにコードを書く検索拡張型コーディングエージェントを、同社チームがどう強化したかを明かした。対象エンジンには実質的に公開文書がなく、公開インターネット上の記憶は役に立たなかった。エージェントは私有文書インデックスと検索ツールに依存していたため、検索取得、ツールの振り分け、編集チェックが崩れると失敗が表面化した。
最初の失敗は文字通りの検索から起きた。エージェントはファイル内容から`json`を検索し、既存の`sampleData.json`を見落とした。該当語がファイル名にしかなかったためで、エージェントはすでに存在するファイルの作成を提案した。Univocoはプロジェクト検索を変更し、ファイル名も検索対象に含めた。2つ目の検索失敗は、機能削除時に関連オブジェクトが近くの複数行で宣言、設定されていたにもかかわらず、エージェントが一致した1行だけを削除した場面だった。`find_in_files`はgrep風の前後文脈に加え、`var box = new Block()`のような行や、同じ宣言済み変数に結びつくプロパティ行を含む自動の変数フットプリントを返すよう変更された。
Univocoはツールを汎用のベース層と顧客別のクライアント層に分けた。`list_files`、`read_file`、`find_in_files`、`write_file`、`edit_file`、`apply_edit`、`delete_lines`などのベースツールは顧客間で共有される。`lookup_docs`、`resolve_topic`、`find_construct`、`check_symbols`、`dry_run`などのクライアントツールは、顧客の文書とオブジェクトモデルに依存する。クライアントツールは同名のベースツールを上書きできる。クライアント版`find_in_files`は、文字通りの検索が失敗した場合に「block」や「the box」などの概念語をエンジン上の実シンボルへ展開する。
チームは信頼性の性質が異なるため、2つの知識ツールを切り分けた。`lookup_docs`は埋め込みも生成も使わず全文文書検索を行い、語を文字通り含むチャンクを返し、ミリ秒単位で動作し、APIを作り出せない。`rag_lookup`はセマンティック検索とモデルが書く回答を使い、10〜30秒かかり、作り話をする可能性がある。既知シンボル名の確認は`lookup_docs`による事実確認であり、より広い「どう作るか」の質問には`rag_lookup`を使える、とエージェントに指示された。
最大のループ失敗は、エージェントが同一ターン内で同じ知識検索を同一引数で12回実行した事例だった。結果がすでに質問済みだと示していた後も繰り返していた。テーブル関連の別ターンでは12ステップと170k入力トークンを使い、5回の知識検索のうち3回が、すでに文脈にある同じ3つのAPI名を再確認していた。Univocoは5つのループ制御を追加した。`_MAX_IDENTICAL_CALLS = 4`後の同一呼び出しブロック、`_MAX_LOOKUPS_PER_TURN = 12`と`_MAX_LIVE_LOOKUPS = 2`を含むターンごとの検索上限、決定的なターン間クエリ照合、同時重複に対するリーダー・フォロワー統合、プロンプト断片が提供済みシンボルを宣言している場合の例外である。
ターン間重複検出器は埋め込みを避ける。テキストを小文字化し、ストップワードを除去し、重子音の圧縮を伴う軽いステミングを適用し、トークンを並べ替えたうえで、完全一致キーまたは`difflib`の近似一致を調べる。類似度しきい値は`0.8`だ。ドメイン語だけが異なる実例のペアは0.833を記録し、`create table`と`create box`は約0.73だった。バックルは、測定された差によってしきい値を信頼できたと書いた。
予算システムも、モデルが11個のシンボルを正しく検証している最中に打ち切った後で変更された。Univocoは全呼び出しに課金する方式から、ツール別に課金する方式へ移行し、キャッシュ済み結果と安価なツールを無料にした。設定では、`_MAX_LOOKUPS_PER_TURN`が表現の違いをまたいでライブ検索を制限する一方、キャッシュ提供と安価なツールは`projects.budget_tools`を通じて無料で、デフォルトは`rag_lookup`だと記している。ミリ秒単位の`lookup_docs`によるシンボルごとの事実確認は、節約すべきコストではなく慎重さだとされた。
クエリ膨張は、ユーザーの1つの言い回しが引き起こす再現率の失敗に対応した。検索の前に、強制された`search_queries`ツールが、ハウツー課題の質問を2〜3の異なる角度に作り直す。焦点を絞ったハウツークエリ、核となる名詞や概念を使う広いキーワードクエリ、許可された場合の具体例クエリが含まれる。ごく単純な事実検索だけが1つのクエリを出すべきだ。プロンプトは質問をそのまま繰り返すことを明示的に禁じている。語順を入れ替えただけでは、言い換えただけで考え直していない同じ問題を再現するためだ。