🤖
【LangChain】RAGに関する書き方まとめ
随時更新します
基本
ベクトルデータベースの作成
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
documents = [
Document("これは「ダンダダン」というマンガのストーリーです"),
Document("幽霊肯定派の女子校生・綾瀬桃と、同級生の怪奇現象オタク・オカルト君。互いに否定するUFOと怪異を信じさせるため、桃はUFOスポットの病院廃墟へ、オカルト君は心霊スポットのトンネルへ行くのだが…。運命の恋が始まる!? オカルティック怪奇バトル開幕!")
]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
db = Chroma.from_documents(documents, embeddings)
回答の生成
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
template = """
以下の文脈だけを踏まえて解答してください
context:{context}
question:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-4o-mini")
# レトリバーを作成
retriever = db.as_retriever()
# チェーンを作成
chain = {
"question":RunnablePassthrough(),
"context":retriever,
}|prompt|llm|StrOutputParser()
res = chain.invoke("登場人物の名前を教えて")
print(res)
DBに情報がなければ、インターネットで情報を検索する
route_prompt = ChatPromptTemplate.from_template("""\
質問に回答するために適切なRetrieverを選択してください。
質問: {question}
""")
class Route(str,Enum):
rag_document = "stories includes dandadan, spy-family, and kingdom"
web = "web"
class RouteOutput(BaseModel):
route: Route
model = ChatOpenAI(model="gpt-4o-mini")
route_chain = (
route_prompt
| model.with_structured_output(RouteOutput)
| (lambda x: x.route)
)
res = route_chain.invoke("「スパイファミリー」について教えてください")
print(res)
Discussion