![見出し画像](https://assets.st-note.com/production/uploads/images/166146112/rectangle_large_type_2_b5021b5a6ec801a165611fefeb5a5ab8.png?width=1200)
エージェントシステムによるRAGの強化
技術スタック
コアコンポーネント:
Pydantic.AI: 構造化されたレスポンス検証と依存性注入を可能にするPythonエージェントフレームワーク。
GroqのLlama-3.3-70b-versatile: 大規模言語モデル (LLM) 推論に使用。
LangChain: ドキュメント処理を支援。
ChromaDB & HuggingFace embeddings: ドキュメントのインデックス化と検索用。
Tavily: 動的なWeb検索機能を提供。
サポートライブラリ:
sentence-transformers: 埋め込み用。
PyPDF: ドキュメント読み込み用。
nest_asyncio: Jupyter環境で非同期操作を有効にします。
システムアーキテクチャ
1. ドキュメント処理とインデックス化
システムはPyPDFLoaderを使用してドキュメントを読み込み、RecursiveCharacterTextSplitterでテキストを分割し、ChromaDBでベクトルストレージを構築します。
# ドキュメントの読み込みと処理
loader = PyPDFLoader("path/to/document.pdf")
documents = loader.load()
split_docs = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
).split_documents(documents)
vectorstore = Chroma.from_documents(
documents=split_docs,
embedding=embedding,
persist_directory=persist_directory
)
2. エージェント設定
Pydantic.AIを使用して、構造化されたプロンプト、ツール機能、および型安全な依存性を設定します。
from pydantic_ai import Agent
groq_agent = Agent(
groq_model,
deps_type=Deps,
retries=2,
result_type=str,
system_prompt="""あなたは、簡潔かつ事実に基づいた回答を提供する有能なアシスタントです。"""
)
3. 検索ツール
カスタム検索ツールを使用してローカルドキュメントにアクセスします:
@groq_agent.tool
async def retriever_tool(ctx: RunContext[Deps], question: str) -> List[str]:
load_vectorstore = Chroma(
persist_directory=persist_directory,
embedding_function=embedding
)
docs = load_vectorstore.similarity_search(question, k=3)
return [d.page_content for d in docs]
4. Web検索統合
Web検索ツールはTavilyを使用して外部クエリを処理します:
@groq_agent.tool_plain
async def websearch_tool(question) -> str:
tavily_client = TavilyClient()
answer = tavily_client.qna_search(query=question)
return answer
主な機能
1. 自己評価機能
システムは以下の基準に基づいて応答を評価します:
関連性 (0–1)
コンテキストへの忠実度 (0–1)
コンテキスト品質 (0–1)
{
"Relevancy": 0.9,
"Faithfulness": 0.95,
"Context Quality": 0.85,
"Needs Web Search": false,
"Explanation": "回答は質問に直接対応しています。"
}
2. 動的コンテキスト拡張
システムはWeb検索による知識補完の必要性を自動的に判断します:
if grades["Needs Web Search"]:
web_results = await websearch_tool(query)
# Web結果でコンテキストを拡張
3. 構造化された依存性
Pydanticを使用して型安全な依存性を管理します:
from dataclasses import dataclass
@dataclass
class Deps:
question: str | None
context: str | None
実装手順
1. 依存ライブラリのインストール
pip install pydantic-ai nest_asyncio devtools tavily-python langchain langchain_community sentence_transformers langchain_huggingface pypdf
2. APIキーの設定
import os
os.environ["OPENAI_API_KEY"] = "your_openai_key"
os.environ["GROQ_API_KEY"] = "your_groq_key"
3. LLMのインスタンス化
from pydantic_ai.models.groq import GroqModel
groq_model = GroqModel("llama-3.3-70b-versatile")
4. ドキュメント読み込みとインデックス構築
from langchain_community.vectorstores import Chroma
embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(
documents=split_docs,
embedding=embedding,
persist_directory=persist_directory,
collection_name="example_collection"
)
5. ツールの作成と設定
検索ツールやWeb検索ツールをエージェントに登録します。
結果と評価
本システムは以下を実現します:
ローカルおよびWebベースの知識のシームレスな統合。
自己評価による高品質なレスポンス。
型安全かつ実運用に耐える設計。
出力例
クエリ: 線維筋痛症とは何か?
{
"Relevancy": 0.8,
"Faithfulness": 0.9,
"Context Quality": 0.7,
"Needs Web Search": false,
"Explanation": "回答は質問に適切に対応しています。"
}
将来の改善点
評価機能の強化:
多次元スコアリング。
情報源の信頼性評価。
パフォーマンスの最適化:
キャッシュメカニズム。
並列処理。
追加機能:
マルチモーダル対応。
会話履歴の保持。
いいなと思ったら応援しよう!
![-D-](https://assets.st-note.com/production/uploads/images/142276884/profile_00da1e5c868e4fc52c917770d7fa0654.jpg?width=600&crop=1:1,smart)