📑 主要な実装例の概要
調査で見つかった主要なRAG実装例と特徴:
⚡ RAGシステムの基本アーキテクチャ
🔎 実装例の特徴比較
| 実装例 | 言語 | フレームワーク | 公開日 |
|---|---|---|---|
| Pinecone公式 | Python | LangChain | 2024年3月 |
| adshyam | Python | LangChain | 2024年1月 |
| Bauplan | Python | Bauplan | 2025年4月 |
| Tavet | Python/JS | FastAPI/Next.js | 2024年6月 |
| zackproser | Python | LangChain | 2025年1月 |
📝 実装コード例:ドキュメント処理
Python LangChain
from langchain_text_splitters import RecursiveCharacterTextSplitter
# ドキュメントを適切なサイズのチャンクに分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_text(document_text)
🔍 実装コード例:ベクトル変換
OpenAI API
from langchain_openai import OpenAIEmbeddings
# 埋め込みモデルの初期化
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small" # 最新の埋め込みモデル
)
# チャンクの埋め込みベクトルを生成
embedded_chunks = []
for chunk in chunks:
vector = embeddings.embed_query(chunk)
embedded_chunks.append({
"id": str(uuid4()),
"vector": vector,
"text": chunk
})
💾 実装コード例:Pineconeへの登録
Pinecone
import pinecone
# Pineconeクライアントの初期化
pinecone.init(api_key="YOUR_API_KEY")
# インデックスが存在しなければ作成
index_name = "knowledge-base"
if index_name not in pinecone.list_indexes():
pinecone.create_index(
name=index_name,
dimension=1536, # OpenAIの埋め込みベクトルの次元数
metric="cosine"
)
# インデックスに接続
index = pinecone.Index(index_name)
# ベクトルをアップロード
batch_size = 100
for i in range(0, len(embedded_chunks), batch_size):
batch = embedded_chunks[i:i+batch_size]
index.upsert(vectors=[
(item["id"], item["vector"], {"text": item["text"]})
for item in batch
])
🤖 実装コード例:クエリ処理
LangChain ChatGPT
from langchain_pinecone import PineconeVectorStore
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# Pineconeベクトルストアの初期化
vectorstore = PineconeVectorStore(
index_name=index_name,
embedding=embeddings
)
# 検索とRAGのチェーンを作成
template = """
以下の情報に基づいて質問に答えてください。
情報に基づかない回答をする場合は「この質問に答えるための
十分な情報がありません」と回答してください。
コンテキスト:
{context}
質問:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 検索用関数
def retrieve_context(query):
docs = vectorstore.similarity_search(query, k=3)
return "\n\n".join([doc.page_content for doc in docs])
# RAGフロー実装
def answer_question(question):
# 関連コンテキストを取得
context = retrieve_context(question)
# LLMを使用して回答を生成
llm = ChatOpenAI(model="gpt-4o")
chain = prompt | llm
response = chain.invoke({
"context": context,
"question": question
})
return response.content
⚙️ Pinecone無料枠の制限と対処法
2024年4月更新Pineconeの無料枠(Starterプラン)は大幅に改善されました:
✨ パフォーマンス最適化のヒント
意味的に一貫したチャンク分割と適切なオーバーラップ設定で検索精度を向上
検索フィルタリングのためのメタデータ追加と出典情報の保持
単純な類似性検索に加えて再ランキングを適用し、関連性を向上
チャンク間の関係性を保持するメタデータ追加と階層的検索