🤖

【LangChain】RAGに関する書き方まとめ

2025/01/22に公開

随時更新します

基本

ベクトルデータベースの作成

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