缺点
LangChain教程:使用嵌入模型从向量数据库搜索相关内容,并根据内容、提示词模板类生成答案 案例有一处缺点,从向量数据库搜索出的内容,与生成内容,没有通过链式调用完成
本文完成链式调用
复习
通过 LangChain教程:RunnablePassthrough的使用 的链式调用,可知,字典 和 提示词模板类 可组成 chain,然后调用 chain
完整代码
from langchain_chroma import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from dotenv import load_dotenv
# 加载环境变量(需配置 OPENAI_API_KEY)
load_dotenv()
# ----根据问题搜索向量-----------------------
print("----根据问题搜索向量-----------------------")
# 初始化大模型
embeddings = DashScopeEmbeddings(model="text-embedding-v2")
# 创建数据库对象
db = Chroma(
embedding_function=embeddings,
persist_directory="./my_chroma_db",
collection_name="test_collection"
)
# 用户提问的问题
# question = "ChromaDB"
question = "25年报告概述"
retriever = db.as_retriever(search_kwargs={
"k": 2, # 返回top 2条最相似结果
})
# -------根据搜索结果,生成答案--------------
print("\n\n-------根据搜索结果,生成答案--------------\n\n")
# 定义模板
prompt = ChatPromptTemplate.from_messages([
("system", "根据我提供的资料,简洁回答用户问题,资料室:{content}"),
("human", "用户提问:{quest}")
])
def print_prompt(prompt):
"""
打印提示词
:param prompt:
:return:
"""
print("-------提示词:\n")
print(prompt.to_string())
print("-------提示词结束\n")
return prompt
# 初始化模型
chat = ChatTongyi(model="qwen3-max")
def format_result(docs: list[Document]):
"""
把搜索出来结果,拼装成字符串
:param docs:
:return:
"""
if not docs:
return "无相关参考资料"
ret = ""
for doc in docs:
ret += doc.page_content
return ret
# 拼装数据时,RunnablePassthrough() 作为占位符
# content 的 value是从数据库搜索出来的内容,并拼装成字符串
data = {
"quest": RunnablePassthrough(),
"content": retriever | format_result # format_result 后面不能有小括号
}
# 字典和提示词模板等组成链
chain = data | prompt | print_prompt | chat | StrOutputParser()
question = "25年报告概述"
res = chain.invoke(question)
print("结果:", res)