✨ 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が検索結果を元に回答
↓
2. 質問に近いドキュメント検索
↓
3. LLMが検索結果を元に回答
動かしてみよう
python 01_rag_agent.py
質問 > EU AI Act はいつ発効?
EU AI Act は 2025 年 8 月から段階的に適用が始まり、2026 年 2 月に完全施行されます。
🔖 Sources: eu_ai_act_final.pdf
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"を一晩で立ち上げてみましょう 🚀
自社 Wiki / DB を突っ込んで、チームの"何でも答える社内 GPT"を一晩で立ち上げてみましょう 🚀