見出し画像

エージェントシステムによる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": "回答は質問に適切に対応しています。"
}

将来の改善点

  1. 評価機能の強化:

    • 多次元スコアリング。

    • 情報源の信頼性評価。

  2. パフォーマンスの最適化:

    • キャッシュメカニズム。

    • 並列処理。

  3. 追加機能:

    • マルチモーダル対応。

    • 会話履歴の保持。

いいなと思ったら応援しよう!

-D-
この記事を最後まで読んでくださり、ありがとうございます。少しでも役に立ったり、楽しんでいただけたなら、とても嬉しいです。 もしよろしければ、サポートを通じてご支援いただけると、新たなコンテンツの制作や専門家への取材、さらに深いリサーチ活動に充てることができます。