イントロダクション
高度な推論モデルと軽量フレームワークの統合は、AIシステムが情報を取得、処理、および提示する方法を変革しています。このガイドでは、高性能の推論モデルであるDeepSeek R1と、Hugging FaceのミニマリストエージェントフレームワークであるSmolAgentsを使用して、リトリーバル拡張生成(RAG)システムを構築します。このシステムは、効率的なドキュメント処理、インテリジェントな検索、人間のような推論を可能にし、研究、顧客サポート、知識管理アプリケーションに最適です。
セットアップを実行するためのシステム要件
AIエージェントは、四つのコアタスクを実行します:
- PDFのロードと処理: ドキュメントを検索可能なテキストチャンクに変換します。
- ベクターデータベースの作成: 高速セマンティック検索のために埋め込みを保存します。
- データの取得と推論: DeepSeek R1を使用して取得したデータを分析し、回答を生成します。
- ユーザーとの対話: シームレスなインタラクションのための会話インターフェースを提供します。
ステップ 1: PDF ドキュメントの読み込みと処理
ツールとライブラリ
- LangChain: ドキュメントの読み込みとテキスト分割のために使用します。
- ChromaDB: 埋め込みを保存するための軽量ベクターデータベースです。
- Hugging Face Embeddings: テキストをベクター表現に変換するために使用します。
実装
1.1 PDFファイルの読み込み
LangChainのDirectoryLoader
を使用してディレクトリからすべてのPDFを読み込みます。各PDFは処理のためにページに分割されます。
from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
def load_and_process_pdfs(data_dir: str):
loader = DirectoryLoader(
data_dir,
glob="**/*.pdf",
loader_cls=PyPDFLoader
)
documents = loader.load()
# ドキュメントをチャンクに分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
return text_splitter.split_documents(documents)
1.2 ベクターストアの作成
テキストチャンクを埋め込みに変換し、効率的な取得のためにChromaDBに保存します。
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
import os
import shutil
def create_vector_store(chunks, persist_directory: str):
if os.path.exists(persist_directory):
shutil.rmtree(persist_directory)
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2",
model_kwargs={'device': 'cpu'}
)
vectordb = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=persist_directory
)
return vectordb
重要な考慮事項
- チャンクサイズ: 1000文字、200文字のオーバーラップは、コンテキスト保持と検索効率のバランスを取ります。
- 埋め込みモデル:
all-mpnet-base-v2
は高品質な文埋め込みを提供します。
ステップ 2: DeepSeek R1を使用した推論エージェントの実装
なぜDeepSeek R1なのか?
DeepSeek R1は多段階推論に特化しており、複雑なクエリを分解し、関係を推測し、構造化された回答を生成できます。
推論モデルの初期化
ローカル推論のためにOllamaを介してDeepSeek R1を構成します:
from smolagents import OpenAIServerModel, CodeAgent
reasoning_model_id = "deepseek-r1:7b"
def get_model(model_id):
return OpenAIServerModel(
model_id=model_id,
api_base="http://localhost:11434/v1",
api_key="ollama"
)
reasoning_model = get_model(reasoning_model_id)
reasoner = CodeAgent(
tools=[],
model=reasoning_model,
add_base_tools=False,
max_steps=2 # 効率のために推論イテレーションの制限
)
ステップ 3: リトリーバル拡張生成 (RAG) パイプラインの構築
ツール設計
文書の取得とDeepSeek R1の推論機能を組み合わせたRAGツールを作成します。
from smolagents import tool
@tool
def rag_with_reasoner(user_query: str) -> str:
# 関連するドキュメントを取得
docs = vectordb.similarity_search(user_query, k=3)
context = "\n\n".join(doc.page_content for doc in docs)
# 推論プロンプトを生成
prompt = f"""
以下のコンテキストに基づいて、ユーザーの質問に簡潔に答えます。
情報が不十分な場合は、洗練されたクエリを提案します。
コンテキスト:
{context}
質問: {user_query}
回答:
"""
return reasoner.run(prompt, reset=False)
主な特徴
- コンテクストプロンプト: 取得したドキュメントをプロンプトに埋め込んで、根拠のある回答を得られます。
- フォールバックメカニズム: データが不十分な場合、モデルはより良いクエリを提案します。
ステップ 4: プライマリーAIエージェントの展開
ワークフローの調整
Llama 3.2を搭載したプライマリーエージェントは、ユーザーインタラクションを管理し、必要に応じてRAGツールを呼び出します:
from smolagents import ToolCallingAgent, GradioUI
tool_model = get_model("llama3.2")
primary_agent = ToolCallingAgent(
tools=[rag_with_reasoner],
model=tool_model,
add_base_tools=False,
max_steps=3
)
def main():
GradioUI(primary_agent).launch()
if __name__ == "__main__":
main()

ユーザーインターフェース
UIはリアルタイムインタラクションのためのシンプルなウェブインターフェースを提供します:
- ユーザーがクエリを入力します。
- エージェントがドキュメントを取得し、DeepSeek R1で推論し、回答を返します。
DeepSeek R1とSmolAgentsの統合により、複雑なクエリを分解するための強化された推論、高速なセマンティック検索での効率的な取得、コスト効率の良いローカル展開を組み合わせた強力なAIソリューションが提供されます。そのスケーラブルなアーキテクチャにより、新しいツールがシームレスに統合でき、研究(技術文書の分析)、顧客サポート(FAQの解決)、知識管理(静的リソースをインタラクティブシステムに変換)などのアプリケーションに最適です。
将来的な強化では、Word、HTML、およびmarkdownのドキュメントサポートを拡張したり、より広いコンテクストのためにリアルタイムウェブ検索を統合したり、時間の経過とともに回答の精度を改善するためのフィードバックループを実装したりすることが考えられます。このフレームワークは、多様なニーズに合わせたインテリジェントで適応型のAIアシスタントを構築するための多用途な基盤を提供します。