from langchain_openai import ChatOpenAI, OpenAIEmbeddings
form langchain_core.prompt import ChatPromptTemplate
form langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_core.runnables import RunnableWithMessageHistory, RunnableLambda
model -= ChatOpenAI(model='gpt-4-turbo')
# 准备数据集列表
documents = [
Document(
page_content="狗是伟大的伴侣,以其忠诚和友好而闻名。",
metadata={"source": "哺乳动物宠物文档"},
),
Document(
page_content="猫是独立的宠物,通常喜欢自己的空间。",
metadata={"source": "哺乳动物宠物文档"},
),
Document(
page_content="金鱼是初学者的流行宠物,需要相对简单的护理。",
metadata={"source": "鱼类宠物文档"},
),
Document(
page_content="鹦鹉是聪明的鸟类,能够模仿人类的语言。",
metadata={"source": "鸟类宠物文档"},
),
Document(
page_content="兔子是社交动物,需要足够的空间跳跃。",
metadata={"source": "哺乳动物宠物文档"},
),
]
# 实例化向量数据库
vector_store = Chroma.from_documents(documents, embedding=OpenAIEmbeddings())
# 检索器 bind(k=1)选取相似度最高的第一个,即分数最低的
retriever = RunableLambda(vector_store.similarity_search).bind(k=1)
# 提示模板
message = """
使用提供的上下文仅回答这个问题:
{question}
上下文:
{context}
"""
prompt_temp = ChatPromptTemplate.from_messages([('human', message)])
# RunnablePassthrough允许我们将用户的问题之后再传递给prompt和model。
chain = {'question': RunnablePassthrough(), 'context': retriever} | prompt_temp | model
resp = chain.invoke('请介绍一下猫?')
print(resp.content)
Document 类中,page_content为内容,metadata为一个字典,一般从来存储page_content的相关信息(来源等)
RunableLambda:将 普通 Python 函数 或 自定义逻辑 转换为 LangChain 运行时(Runtime)兼容的可执行组件
RunnablePassthrough():占位符,防止报错
chain = {'question': RunnablePassthrough(), 'context': retriever} | prompt_temp | model
中,chain操作会将字典{'question': RunnablePassthrough(), 'context': retriever}自动赋值给message,从而实现变量的动态赋值