AIインフォグラフィックス集

AI Infographics Collection

RAGエージェントを50行で作る!

✨ RAG エージェントを "50 行" で作る!

2025-04-29

やること

1
ドキュメントをベクトル化して Postgres (pgvector) に格納
2
LangChain の RetrievalQA + ReAct Agent を合体
3
"EU AI Act はいつ施行?" を質問 → 出典付きで回答

前提

pip install langchain openai psycopg2-binary pgvector-python tiktoken export OPENAI_API_KEY="sk-..." Docker で Postgres + pgvector を立てておくと楽: docker run --name rag_pg -e POSTGRES_PASSWORD=rag -p 5432:5432 \ ankane/pgvector
"検索 × LLM が合体した RAG エージェントを、たった 50 行の Python で爆速構築。手元の PDF や社内ドキュメントを読み込ませ、根拠付きで答えるボットを動かします。"
50行

コード全文

01_rag_agent.py ← そのままコピペ OK!
# 01_rag_agent.py import os, textract, glob from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores.pgvector import PGVector from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.docstore.document import Document from langchain.tools import Tool from langchain.chat_models import ChatOpenAI from langchain.agents import initialize_agent from langchain.chains import RetrievalQA ### 1) ベクトルストア接続 ------------------------ CONN = "postgresql://postgres:rag@localhost:5432/postgres" COLL = "eu_docs" embed = OpenAIEmbeddings() vectordb = PGVector( connection_string=CONN, collection_name=COLL, embedding_function=embed) ### 2) ドキュメント投入 (初回のみ) -------------- if not vectordb.check_if_collection_exists(): splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=80) docs = [] for file in glob.glob("./docs/*.pdf"): text = textract.process(file, method="pdftotext").decode() for chunk in splitter.split_text(text): docs.append(Document(page_content=chunk, metadata={"src": file})) vectordb.add_documents(docs) print(f"💾 {len(docs)} chunks embedded!") ### 3) Retriever + QA チェーン ------------------- retriever = vectordb.as_retriever(search_kwargs={"k":4}) qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4o-mini", temperature=0), chain_type="stuff", retriever=retriever, return_source_documents=True) def rag_tool(q: str) -> str: res = qa_chain(q) answer = res["result"] sources = {d.metadata['src'].split('/')[-1] for d in res['source_documents']} return f"{answer}\n\n🔖 Sources: {', '.join(sources)}" ### 4) ReAct エージェント ------------------------ tools = [Tool(name="RAG", func=rag_tool, description="Use this tool to answer using internal docs")] agent = initialize_agent(tools, ChatOpenAI(model="gpt-4o-mini"), agent_type="chat-zero-shot-react-description") ### 5) 試す! ------------------------------------ while True: q = input("\n🗨 質問 > ") print(agent.run(q))

RAG の仕組み

📄
🔍
🧠
1. ドキュメントをチャンク分割しベクトル化

2. 質問に近いドキュメント検索

3. LLMが検索結果を元に回答

動かしてみよう

python 01_rag_agent.py
質問 > EU AI Act はいつ発効?

EU AI Act は 2025 年 8 月から段階的に適用が始まり、2026 年 2 月に完全施行されます。
🔖 Sources: eu_ai_act_final.pdf

コードの流れ

Step 1
ベクトルストア接続

Step 2
ドキュメント投入

Step 3
Retriever + QA チェーン

Step 4
ReAct エージェント

Step 5
質問応答ループ

ワクワク拡張アイデア

レベル やること 追加ライブラリ
PDF 以外に Confluence API も ingest atlassian-python-api
★★ 引用箇所をハイライト付きで返す langchain.docstore.document
★★★ FastAPI で REST エンドポイント化 fastapi, uvicorn

コンポーネント解説

1
OpenAIEmbeddings - テキストをベクトル化
2
PGVector - Postgres + pgvector との連携
3
RecursiveCharacterTextSplitter - 文書を小チャンクに分割
4
RetrievalQA - 検索結果を使ったQ&Aチェーン
5
Tool & ReAct Agent - ツールを使って問題解決

RAGのメリット

✓ 最新情報を反映 - トレーニング後の情報も参照可能

✓ 出典を明示 - 根拠となるドキュメントを提示

✓ ハルシネーション低減 - 実データに基づく回答

✓ カスタマイズ性 - 独自ドキュメントを組み込み可能

まとめ

  • • RAG = ベクトル検索+LLM で "最新&根拠付き" の回答が即完成
  • • LangChain + pgvector なら 50 行未満 で MVP が動く
  • • ソース添付でハルシネ率激減 → 実務導入への第一歩に!
次のステップ
自社 Wiki / DB を突っ込んで、チームの"何でも答える社内 GPT"を一晩で立ち上げてみましょう 🚀