Copilot ChatのAgents機能がすごそう

GitHub Copilot ChatのアップデートでAgentsという機能が追加されて@workspaceをつけて質問することでエディタのコンテキスト外のファイルも対象に回答してくれるようになった。

code.visualstudio.com

「プログラマー失業不可避」が噂されるCopilot Workspace*1とは別の機能なので注意。

以下Microsoft Copilotに翻訳してもらった要点:

LLMは、ある時点での公開リポジトリのデータで訓練されています。つまり、現在のコードについては何も知りません。コードについては一般的なことは知っていますが、ワークスペースの内容に関する必要な文脈を持っていないので、それに関する質問に正確に答えたり、ワークスペースの形式や機能に従った新しいコードを提案したりすることができません。

これを回避するために、GitHub Copilot Chatは、モデルがよりよく質問に答えられるようにするためのコードの断片を送ります(これを「Retrieval Augmented Generation」または「RAG」と呼びます)。1回答は、関連性の高いコードを見ることでよくなります。しかし、LLMに送ることができるコードの量(およびプロンプトによるガイダンス)には限りがあります。小さなプロジェクトであれば、これは通常問題になりません。しかし、大きなソースコードリポジトリを考えてみると、すべてのファイルの内容をモデルに送ることは不可能であることがすぐにわかります。よりよい回答を得るための解決策は、適切な量のリソースを合理的な時間内に使って、関連する文脈を送ることです。これを実現し、さらに多くのシナリオを解放するために、私たちはCopilot Chatにエージェントという概念を追加しました。

つまりCursorがやっていてくれたような機能がオフィシャルでサポートされている(さよならCursor)

laiso.hatenablog.com

VikParuchuri/markerを一緒に読んでみたところなかなか有能だった。

このリポジトリはPythonだが、ただCopilot Chat自体得意言語の差があるという説もある。

Agentsとは

@workspaceの@指示子を提供するパーツがAgentsという仕組みで、なんとこれはユーザーも追加することができるらしい。

Copilot Chatのコンテキストを拡張して任意のコードを実行でき、VS Code側で用意されたAPIを使うことができる。

全体の構造:

VS Code
├── GitHub Copilot Extension
├── GitHub Copilot Chat Extension
│   ├── Agents
│   │   ├── @workspace
│   │   ├── @vscode
│   │   ├── @cat
│   │   ├── @dall-e

実際に動作可能なAgentとして@cat@dall-eのサンプルにアクセスできる。

実装は以下の個所でここを書き換えることで独自のAgentを開発できる。

vscode-extension-samples/chat-agent-sample/src/extension.ts

@dall-eとかはこの中でAzure OpenAIのAPI叩いて画像生成してた。

Chat Completion APIを使ってる人ならお馴染みのI/Fで、以下のようにCopilotの内部のモデルへの問い合わせができる。

const access = await vscode.chat.requestChatAccess('copilot');
const topics = ['linked list', 'recursion', 'stack', 'queue', 'pointers'];
const topic = topics[Math.floor(Math.random() * topics.length)];
const messages = [
    {
        role: vscode.ChatMessageRole.System,
        content: 'You are a cat! Your job is to explain computer science concepts in the funny manner of a cat. Always start your response by stating what concept you are explaining.'
    },
    {
        role: vscode.ChatMessageRole.User,
        content: topic
    },
];
const chatRequest = access.makeRequest(messages, {}, token);
for await (const fragment of chatRequest.response) {
    progress.report({ content: fragment });
}
return { slashCommand: 'teach' };

まとめ

つまりAgentsを通じてエディタの中で自然言語とソースコードの組合せから情報を取り出したり、コードを更新したり実行したりするのがより柔軟になるので色々活用の幅が広がりそう。

Copilot Chatは最近GPT-4ベースになったので*2「以前使ってみたけど精度がいまいちだったな〜」という人も再度チェックしてみてください。