【Ollama】【LangChain】複数のファイルから目的のファイルを検索する方法

はじめに

DiffusersのGitHubリポジトリ内の「docs/source/en/api/pipelines/」以下にある「.md」ファイルから目的のファイルを抽出する方法を考えてみました。

Python環境構築

pip install langchain-community langchain-ollama langchain-chroma
pip install unstructured[md]
pip install python-magic-bin
langchain-chroma==0.2.0
langchain-community==0.3.14
langchain-ollama==0.2.2
python-magic-bin==0.4.14
unstructured==0.16.13

リポジトリのクローン

git clone -b main --depth 1 https://github.com/huggingface/diffusers

「.md」ファイルを抽出してベクトル化した後にローカルに保存

from langchain_community.document_loaders import DirectoryLoader
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma

loader = DirectoryLoader("./diffusers/docs/source/en/api/pipelines/")

raw_docs = loader.load()

embed_model_id = "mxbai-embed-large:latest"
embeddings = OllamaEmbeddings(model=embed_model_id)

index = Chroma.from_documents(
    documents=raw_docs,
    embedding=embeddings,
    persist_directory = "./vectorstore"
)



以下のようなエラーが出る場合があります。

Resource punkt_tab not found.
Resource averaged_perceptron_tagger_eng not found.
Please use the NLTK Downloader to obtain the resource:

Pythonで以下を実行すれば解決します。

import nltk
nltk.download('punkt_tab')
nltk.download('averaged_perceptron_tagger_eng')



「python-magic-bin」をインストールしていないと以下のエラーが出ます。

libmagic is unavailable but assists in filetype detection. Please consider installing libmagic for better results.

ファイルの検索

from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings

query = input("検索文を入力して下さい: ")
embed_model_id = "mxbai-embed-large:latest"
embeddings = OllamaEmbeddings(model=embed_model_id)

vectorstore = Chroma(
    persist_directory="./vectorstore",
    embedding_function=embeddings
)

retriever = vectorstore.as_retriever(
    search_kwargs={"k": 5}
)

context_docs = retriever.invoke(query)

for doc in context_docs:
    if doc.metadata.get("source"):
        address = doc.metadata["source"].replace("\\", "/").replace("diffusers", "https://github.com/huggingface/diffusers/blob/main")
        print(address)

input("press any key to terminate")

実行結果

検索文を入力して下さい: Stable Diffusion3.5でIP-Adapterを使いたい
https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/pipelines/stable_diffusion/adapter.md
https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/pipelines/controlnet_sd3.md
https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/pipelines/stable_diffusion/stable_diffusion_3.md
https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/pipelines/stable_diffusion/upscale.md
https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/pipelines/controlnet_union.md
press any key to terminate

5つのファイルへのリンクを表示してくれます。表示結果上で「Ctrl」を押しながらマウスを左クリックするとそのページが開けます。

今回の場合は3番目のリンクが一番欲しかったものです。

精度を高めるのが今後の課題です。