1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】LangChainでRAGを実装してみた - プロフィール検索Botの作り方

1
Posted at

はじめに

この記事では、LangChainを使ってRAG(Retrieval-Augmented Generation)を実装し、テキストファイルから情報を検索して質問に答えるBotを作成した過程を紹介します。

RAGとは?

RAG(Retrieval-Augmented Generation)は、大規模言語モデル(LLM)に外部の情報源から関連情報を検索して渡すことで、より正確で信頼性の高い回答を生成する技術です。

つまり、試験に例えると

普通のLLM(AI) → 記憶だけで答える「クローズドブック試験」

  • 学習したことしか知らない
  • 古い情報や間違って覚えたことがある
  • 知らないことは推測で答えてしまう

RAG → 教科書や資料を見ながら答える「オープンブック試験」

  • 質問に関連する資料をまず探す
  • その資料を見ながら正確に答える
  • 資料にないことは「わかりません」と言える

LLMとは

LLM(大規模言語モデル) は、膨大な量の文章を学習して人間のように文章を理解したり生成したりできるAIプログラムです。例えば、ChatGPTやClaudeといった生成AIはLLMのおかげで人間からの質問に答えたり、文章を書いたり、翻訳したり、コードを生成したりといったことができています。
簡単に言うと「たくさん本を読んで賢くなったAIアシスタント」で、会話しながら様々な作業を手伝ってくれる存在です。

RAGの基本的な流れは以下の通りです。

  1. テキストを適切なサイズに分割
  2. 各テキストをベクトル(数値の配列)に変換
  3. ベクトルデータベースに保存
  4. 質問が来たら、関連するテキストを検索
  5. 検索結果をLLMに渡して回答を生成

プロフィール検索BOTを作ってみよう

ここでは、RAGを理解するためにまず簡単なプロフィール検索BOTを作ってみました。
このBOTでは、まずプロフィール情報を入れたファイルを作成します。
そして、コード内にあらかじめ質問文を入れてコードを動かします。
すると、コード内でプロフィール情報を入れたファイルを参照し、回答を作成し吐き出してくるというものです。

これでRAGの仕組みが大まかにでも分かるようになるかなと思います。

環境構築

1. 仮想環境の作成

プロジェクトフォルダを作成し、仮想環境をセットアップします。

# プロジェクトフォルダに移動
cd C:\Users\所定の場所\rag_profile
# 仮想環境を作成
python -m venv venv
# 仮想環境を有効化(Windows)
venv\Scripts\activate

2. 必要なパッケージのインストール

requirements.txt を作成します。
場所はC:\Users\所定の場所\rag_profileの中です。

langchain-core==0.3.61
langchain-community==0.3.24
langchain-openai==0.3.18
langchain-text-splitters
faiss-cpu==1.11.0
openai==1.82.0
langgraph==0.4.7
python-dotenv

ファイルを作成したら、次はインストール実行です。

pip install -r requirements.txt

ファイルの作成

1. profile.txt(情報源)

検索対象となるテキストファイルを作成します。

名前: 山田花子
年齢: 34歳
職業: ソフトウェアエンジニア
趣味: プログラミング、読書
得意な言語: Python
経歴:
- 2022年: IT企業に入社
- 2024年: IT部門に異動
- 2025年: 新規プロジェクトの立ち上げを担当

名前: 大山太郎
年齢: 35歳
職業: データサイエンティスト
趣味: 映画鑑賞、サイクリング
得意な言語: Python, R, SQL
経歴:
- 2019年: 外資系コンサル企業に入社
- 2021年: 機械学習モデルの設計を主導
- 2023年: 社内AI推進チームへ異動
- 2025年: 社内AI推進チームのリーダーに抜擢

2. .env(環境変数)

OpenAI APIキーを安全に管理するため、.env ファイルを作成します。

OPENAI_API_KEY=あなたのOPENAI_APY_KEY

セキュリティ注意: .env ファイルは絶対にGitHubなどにアップロードしないでください。

3. app.py(メインプログラム)

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import TextLoader
from dotenv import load_dotenv
import os

# 環境変数の読み込み
load_dotenv()

def create_profile_rag():
    # テキストファイルの読み込み
    loader = TextLoader("profile.txt", encoding="utf-8")
    documents = loader.load()
    
    # テキストの分割
    text_splitter = CharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=0
    )
    texts = text_splitter.split_documents(documents)
    
    # ベクトルストアの作成
    embeddings = OpenAIEmbeddings()
    vectorstore = FAISS.from_documents(texts, embeddings)
    
    # 質問応答チェーンの作成
    qa_chain = RetrievalQA.from_chain_type(
        llm=ChatOpenAI(temperature=0.7),
        chain_type="stuff",
        retriever=vectorstore.as_retriever()
    )
    
    return qa_chain

def main():
    qa_chain = create_profile_rag()
    
    questions = [
        "山田さんの趣味は何ですか?",
        "女性の得意なプログラミング言語は何ですか?",
        "2025年に何をしましたか?",
        "山田さんと大山さんの共通点はなんですか?",
        "山田さんと大山さんは恋人同士ですか?"
    ]
    
    for question in questions:
        print(f"\n質問: {question}")
        answer = qa_chain.invoke({"query": question})
        print(f"回答: {answer['result']}")

if __name__ == "__main__":
    main()

フォルダ構成は以下画像の通りになります。

image.png

実行

python app.py

実行結果

image.png

RAGが正しく機能し、profile.txtに含まれる情報については適切に回答し、含まれない情報については「情報がない」と正しく答えることができました。

コードの解説

1. テキストの読み込みと分割

loader = TextLoader("profile.txt", encoding="utf-8")
documents = loader.load()

text_splitter = CharacterTextSplitter(
    chunk_size=1000,      # 1チャンクのサイズ
    chunk_overlap=0       # チャンク間の重複
)
texts = text_splitter.split_documents(documents)

長いテキストを適切なサイズに分割することで、検索精度を向上させます。

2. ベクトル化とデータベース保存

embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)

OpenAIのEmbedding APIを使ってテキストをベクトル化し、FAISSというベクトルデータベースに保存します。

3. 質問応答チェーンの作成

qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(temperature=0.7),
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

このようにして、検索機能とLLMを組み合わせて質問応答システムを構築します。

まとめ

今回、LangChainを使ったRAGの実装を通じて、以下のことを学ぶことができました。

技術的な学び

RAGの仕組みを体験できた

単にLLMに質問するだけでなく、外部の情報源を検索して回答を生成する仕組みを実際に動かすことで、RAGがどのように「正確性」と「信頼性」を向上させているのかを体感できました。
テキストをベクトル化してデータベースに保存し、質問に応じて関連情報を検索するという一連の流れを理解できたことは大きな収穫です。

今後の可能性

今回はテキストファイルを情報源としましたが、他にもRAGはPDFファイル、Webページ、データベースなど、様々な情報源に対応できることがわかりました。
この技術は、社内文書検索システム、カスタマーサポートBot、技術ドキュメントの検索など、実務で幅広く応用できる可能性を秘めていると思います。

この学びを活かして、次はPDFファイルを使った文書検索システムや、対話形式のチャットボットなど、より実用的なアプリケーションに挑戦していきたいと思います。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?