🔥

GitHubリポジトリを活用したファイル検索システム

に公開

初めに

GitHubを活用して開発している方は多いと思います。CursorやGitHub Copilotのようなコード開発AIとGitHubのレポジトリ情報を組み合わせてコード開発を行うことができれば、より便利に開発を行うことができるのではないでしょうか。
本記事では、GitHubのレポジトリ情報を活用してファイル検索システムを作成してみたいと思います。

本記事ではコード検索に、セマンティックベクトルではなく、llms.txtを用います。
一般的には、サイトの構造情報をAIクローラーに渡して、効率よくサイトの情報を活用するためにllms.txtは使用されます。
しかし、今回は以下の2つの理由から、ファイル検索にllms.txtを使用することを試みました。

  1. Vibe code benchmarkでは、うまくllms.txtを作成することで、セマンティックベクトルを使用した検索よりも高い精度を出すことができるという結果が出ています。そのため、ファイル検索にも有効なのではないかと考えました。
  2. llms.txtはテキストベースなのでバージョン管理や手動編集が容易であり、CI/CDパイプラインで自動生成・更新しやすいというメリットがあります。

システム概要

Organizationに作成された各リポジトリごとにllms.txtを作成しておきます。
あらかじめ作成しておいたllms.txtを利用して、ユーザーに役立つファイルを検索します。ユーザークエリとllms.txtを生成AIに分析してもらい、関連するファイルをリストアップします。リストアップされたファイルをGitHub APIで取得し、ユーザークエリと取得したファイルを用いて、回答を生成します。
ファイル検索の部分はMCP(Model Context Protocol)で実装します。MCPは生成AIモデルと様々なデータソースやツールをつなぐための標準化された接続方法です。MCP化することで、GitHub CopilotやCursorでもファイル検索を利用できるようになります。


(※上記図はChatGPTによって作成されました。またGitHubはGitHub, Inc.の登録商標です)

実行環境

本稿のコードは、以下の環境で実行を確認しています。

  • Windows 11
  • Node.js v20.15.0
  • npm 10.7.0

事前準備として、GitHub personal access tokenやOpenAi API keyを取得する必要があります。
権限の設定は、こちらの記事をご参照ください。

https://zenn.dev/mseabass/articles/0b23717b8e536a

本稿では処理フローとプロンプトを中心にご紹介します。
コード全文は以下をご参照ください。

https://github.com/M6saw0/llms_txt_rag

処理フロー

llms.txtの作成

まずは検索に使用するllms.txtを作成します。
以下の手順でllms.txtを作成します。

  1. Organization内のレポジトリ一覧を取得する
  2. 各レポジトリのファイル一覧を取得する
  3. 各ファイルの内容を取得する
  4. 各ファイルの内容をllms.txtに出力する

今回はシンプルな形式のllms.txtを作成します。llms.txtの作成は生成AIで行います。以下のプロンプトを使用して、llms.txtを作成しました。

レポジトリ情報をもとに以下の形式でllms.txtを出力してください。

レポジトリ情報:
```
レポジトリ名: {repository_name}
レポジトリURL: {repository_url}

レポジトリ内のファイル内容:
{file_contents}
```

llms.txtの出力形式:
以下のように<output>タグ内に必要な情報を記載してください。
<output>
# レポジトリ名[レポジトリURL]

> プロジェクト概要説明

プロジェクト詳細説明(500文字以内で記載)

## ファイル一覧
- ファイル名1[ファイルパス1]: ファイル1の概要説明(300文字以内で記載)
- ファイル名2[ファイルパス2]: ファイル2の概要説明(300文字以内で記載)
...
</output>

それではタスクを開始してください。

上記では、Organization内のレポジトリに対してllms.txtを作成します。しかし、実適用時にはファイルの更新が発生した段階でllms.txtを更新する必要があります。
llms.txtの更新にはGitHub Actionsを使用します。詳細は以下の記事をご参照ください。

https://zenn.dev/mseabass/articles/6575bbb5caa253

関連するファイルの検索

次に関連するファイルの検索を行います。
まず以下の流れで関連するファイルを検索します。

  1. ユーザーのクエリを送信
  2. llms.txtを取得
  3. ユーザークエリとllms.txtを生成AIに分析してもらい、関連するファイルをリストアップ
  4. リストアップされたファイルをGitHub APIで取得

ここまでをMCPとして実装します。

ファイルのリストアップには、以下のプロンプトを使用します。

以下のレポジトリの情報をもとに、ユーザーの要求に関連する/役立つファイルをリストアップしてください。

リポジトリの情報:
```
{context}
```

ユーザーの要求:
```
{user_request}
```

出力ルール:
ユーザーの要求を達成するために必要なファイルを特定し、レポジトリ名とファイルパス(フォルダを含む)、ファイルが関連する/役立つと考える理由を出力してください。
出力は<output>タグで囲み、辞書のリスト形式で出力してください。
見つからない場合は空のリスト([])を出力してください。

出力形式:
<output>
[
    {{
        "reason": "ここにこのファイルが関連する/役立つと考える理由を記載する",
        "repository_name": "ここにリポジトリ名を記載する",
        "file_path": "ここにファイルパスを記載する(フォルダを含むパス)"
    }},
    ...
]
</output>

それではタスクを開始してください。

ファイル検索をMCPとして実装したため、GitHub CopilotやCursorで利用することも可能です。
上記のGitHubではMCPクライアントを利用してファイル検索をするサンプルコードを掲載しています。

GitHub CopilotやCursorで利用する場合は、以下のように設定してください。

{
  "mcpServers": {
    "llms-txt-rag-server": {
      "url": "http://localhost:3001/sse"
    }
  }
}

最後に

本記事では、GitHubのレポジトリ情報を活用してファイル検索システムを作成しました。
本コードは個人環境での検証にとどまっており、実際に運用する際には拡張性やセキュリティなどを考慮する必要があります。
しかし、本コードで比較的簡単にGitHub資産の検索を行うことができると考えています。皆様のドキュメント・コード活用にお役立ていただければ幸いです。

Discussion