Shinjo Syntax

アイコン
📚

ナレッジベースを作りたい! その1

公開日 2025/12/08
更新日 2025/12/08

自分の知識を全てドキュメント化し、 それを完全に共有して使いこなせたらどんなことが出来るのか?

MCPサーバーを活用して自分の代わりにAIに考えてもらう、作業をしてもらう、応対してもらう。

それを実現する第一歩として、 「ドキュメントをベクトルデータベースに保存する」ことから始める。

PythonとChromaDBを使い、テキストファイルの内容をデータベースに落とし込む。

今後MCPサーバーを立てる事を想定してChromaDBを採用しているのがポイント。

これから紹介するコードはClaude Desktopに作っていただきました。 とても便利な世の中です。

まずは必要となるライブラリをインストールします。

1# 1. Pythonバージョンの設定
2pyenv local 3.11.0
3
4# 2. 仮想環境の作成
5python -m venv project_env
6
7# 3. 仮想環境の有効化
8.\project_env\Scripts\Activate.ps1
9
10# 4. ChromaDBのインストール
11pip install chromadb
12
13# 5. sentence-transformersのインストール
14pip install sentence-transformers

以下のテキストファイルとPythonファイルを1つずつ作成しました。

  • sample.txt
    • 情報が保存されているファイル
  • test_chromadb.py
    • データベースに落とし込む / 抽出するPythonファイル

sample.txt

1ChromaDBは強力なベクトルデータベースです。
2
3テキストの意味的な検索ができます。
4
5ナレッジベースの構築に最適です。
6
7ハンバーグが大好物です。

test_chromadb.py

動作テスト用のPythonファイルです。

ポイントとなる箇所は次の通りです。

  • 日本語に対応させるためのモデルを使用
  • 段落・空行で分割して追加
1import chromadb
2from chromadb.utils import embedding_functions
3
4# 日本語対応の埋め込みモデルを使用
5sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
6    model_name="intfloat/multilingual-e5-small"
7)
8
9# ChromaDBクライアントの初期化
10client = chromadb.PersistentClient(path="./chroma_db")
11
12# 既存のコレクションを削除して新しく作る
13try:
14    client.delete_collection(name="test_collection")
15except:
16    pass
17
18# ★重要:embedding_functionを指定してコレクション作成
19collection = client.get_or_create_collection(
20    name="test_collection",
21    embedding_function=sentence_transformer_ef  # ←ここが重要!
22)
23
24# テキストファイルを読み込んで段落ごとに分割
25with open("sample.txt", "r", encoding="utf-8") as f:
26    content = f.read()
27
28# 空行で分割
29paragraphs = [p.strip() for p in content.split("\n\n") if p.strip()]
30
31print(f"✓ {len(paragraphs)}個の段落に分割しました")
32
33# 各段落を個別に追加
34for i, paragraph in enumerate(paragraphs):
35    collection.add(
36        documents=[paragraph],
37        ids=[f"para_{i}"]
38    )
39
40print("\n✓ すべての段落を追加しました")
41
42# 検索してみる(1件だけ)
43results = collection.query(
44    query_texts=["好きな食べ物は?"],
45    n_results=1
46)
47
48print("\n検索結果(最も関連性の高い段落):")
49print(results["documents"][0][0])

こちらのコマンドで実行します。

1# Pythonスクリプトの実行
2python test_chromadb.py

一回実行するのにおよそ15秒ほどかかりました。 ファイルの書き込み・読み込みの部分で大きく時間がかかっていたのかな。

1> python test_chromadb.py
2✓ 4個の段落に分割しました
3
4✓ すべての段落を追加しました
5
6検索結果(最も関連性の高い段落):
7ハンバーグが大好物です。

テキストファイルに書かれている内容から検索できました。 今後はファイル数を増やすだけではなく、 ディレクトリも分けたりしてそれも検索に反映させられたら面白そう。

また、ファイルの数が増えると読み書きで大きく時間がかかってしまうので、 プロジェクトとして実装する際は読み書きのタイミングを工夫する必要があるだろう。

今回はナレッジベースのMCPサーバー開発への第一歩として、 テキストファイルをベクトルデータベースに落とし込むことが出来ました。