スポンサーリンク

Ollama,LangChain,FAISSでテキストデータの中から情報を取り出してみる

関連モジュール導入

langchain-ollamaがconda対応していない。どうせpipするので全てpipで導入する。

pip install faiss-cpu
pip install -U langchain-ollama
pip install langchain-community

検索用データ準備

faissを使い、テキストをベクトル化することでテキストデータの距離を検索できるようにする。

data.txt

夏目漱石(吾輩は猫である): 名もなき猫の視点から、明治時代の人間社会の風刺や知識人の生活を描いたユーモラスな作品。
芥川龍之介(羅生門): 荒廃した京都を背景に、生きるために盗みに手を染める男の葛藤を描く短編小説。
太宰治(人間失格): 自己喪失に苦しむ男が、絶望と孤独の中で人間らしさを失っていく姿を描いた自伝的要素のある作品。
川端康成(雪国): 雪深い地方都市を舞台に、都会の男と芸者のはかない恋を詩的に描いた日本文学の代表作。
三島由紀夫(金閣寺): 美の象徴である金閣を焼き払った青年の内面に潜む破壊衝動と美意識を描いた小説。
村上春樹(ノルウェイの森): 1960年代の東京を舞台に、若者たちの喪失感と精神の揺れを描く青春恋愛小説。
谷崎潤一郎(細雪): 戦前の大阪を舞台に、四姉妹の優雅な生活と時代の移り変わりを丹念に描いた長編小説。
井上靖(天平の甍): 遣唐使として唐に渡った日本僧たちの理想と現実の狭間での葛藤を描いた歴史小説。
有島武郎(或る女): 自由を求めた女性の生涯を通して、恋愛と社会の矛盾を描いた作品。
宮沢賢治(銀河鉄道の夜): 幻想的な列車の旅を通して、死と生、他者との関わりを深く問いかける児童文学的名作。

data.txtをベクトル化

data.txtをベクトル化し、faiss_indexという名前でファイル保存する。

from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.schema import Document

import re

output_data_name = "faiss_index"

# pip install faiss-cpu
# pip install -U langchain-ollama
# pip install langchain-community


###########################################################
# data.txtを1行ずつ読み込み、1行=1チャンクとして扱う (1チャンク=1ベクトル
documents = []
with open("data.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if line:
            documents.append(Document(page_content=line))


###########################################################
# データを表示
for i, doc in enumerate(documents):
    print(f"チャンク{i}: {doc.page_content}")


###########################################################
# ステップ3: ベクトル化してFAISSに保存
embedding = OllamaEmbeddings(model="nomic-embed-text")  # テキスト用埋め込みモデル
vectorstore = FAISS.from_documents(documents, embedding)
vectorstore.save_local(output_data_name)

使用例

検索して結果を出力

from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaLLM
from langchain.chains import RetrievalQA

import re


usellm = OllamaLLM(model="qwen3:8b")

###########################################################
embedding = OllamaEmbeddings(model="nomic-embed-text")  # テキスト埋め込み用モデル

retriever = FAISS.load_local(
    "faiss_index"
    ,embedding # 検索用モデル
    ,allow_dangerous_deserialization=True
    ).as_retriever()
    
qa_chain = RetrievalQA.from_chain_type(llm=usellm, retriever=retriever)


###########################################################
# 質問する

query = "解説文から、関西地方に関係する物語であることがわかる作品を教えてください"

answer = qa_chain.invoke(query)
raw = answer["result"]

response_without_think = re.sub(r"<think>.*?</think>", "", raw, flags=re.DOTALL)

print(response_without_think)

出力例

芥川龍之介(羅生門): 荒廃した京都を背景に…
**解説**: 「羅生門」は京都を舞台としており、京都は関西地方に属するため、関西地方に関係する物語であることが確認できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: