LangChain教程:使用嵌入模型从向量数据库搜索相关内容,并根据内容、提示词模板类生成答案(改进)

缺点

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)

原文出处:/show_1GW2tFtejqKD.html