LangChain教程:使用嵌入模型从向量数据库搜索相关内容,并根据内容、提示词模板类生成答案(改进) 作者:马育民 • 2026-03-05 14:38 • 阅读:10009 # 缺点 [LangChain教程:使用嵌入模型从向量数据库搜索相关内容,并根据内容、提示词模板类生成答案](https://www.malaoshi.top/show_1GW2tDHp3AXH.html "LangChain教程:使用嵌入模型从向量数据库搜索相关内容,并根据内容、提示词模板类生成答案") 案例有一处缺点,从向量数据库搜索出的内容,与生成内容,没有通过链式调用完成 本文完成链式调用 # 复习 通过 [LangChain教程:RunnablePassthrough的使用](https://www.malaoshi.top/show_1GW2tCQh1FTj.html "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) ``` 原文出处:http://malaoshi.top/show_1GW2tFtejqKD.html