You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于LCEL增强Neo4j高级RAG实现返回模型输入源功能

如何在Neo4j高级RAG链中返回源上下文

要让你的RAG链同时返回模型生成的回答和对应的源上下文,需要从链结构、数据格式和前端展示三个部分修改,具体步骤如下:

1. 定义输出数据结构

创建一个Pydantic模型来规范返回结果,确保同时包含回答和源信息:

from pydantic import BaseModel

class AnswerWithSources(BaseModel):
    answer: str
    sources: list  # 存储检索到的上下文文档

2. 修改链结构,保留上下文并组合结果

原链仅输出回答,现在需要调整链逻辑,保留检索到的上下文并与回答组合:

from langchain_core.runnables import RunnablePassthrough

# 定义生成回答的子链
generate_answer = (
    prompt
    | model
    | StrOutputParser()
)

# 重构主链:获取上下文→生成回答→组合结果
chain = (
    RunnableParallel(
        {
            "context": itemgetter("question") | retriever,
            "question": itemgetter("question"),
            "history": itemgetter("history")
        }
    )
    | RunnablePassthrough.assign(answer=generate_answer)  # 保留上下文同时生成回答
    | lambda x: {"answer": x["answer"], "sources": x["context"]}  # 整理成目标格式
    | AnswerWithSources.model_validate  # 用Pydantic验证输出结构
)

# 更新输入输出类型绑定
chain = chain.with_types(input_type=Question, output_type=AnswerWithSources)

3. 修改前端展示逻辑

在Streamlit部分添加源上下文的展示,让用户可以查看模型参考的原始内容:

if user_question := st.chat_input():
    st.chat_message("human").write(user_question)
    config = {"configurable": {"session_id": "any"}}

    response = chain_with_history.invoke({"question": user_question}, config)
    
    print("Response:", response)
    # 显示AI回答
    st.chat_message("ai").write(response.answer)
    # 展开显示源上下文
    with st.expander("查看参考源"):
        for idx, source in enumerate(response.sources, 1):
            st.markdown(f"**源 {idx}:**")
            # 处理Document类型的源(带page_content和metadata)
            if hasattr(source, 'page_content'):
                st.write(source.page_content)
                if source.metadata:
                    st.write("元数据:", source.metadata)
            else:
                st.write(str(source))

可选:优化提示词(关联回答与源)

如果需要让AI在回答中标注引用的源位置,可以修改提示词:

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个AI聊天机器人,仅基于给定上下文回答问题。无法回答时请直接说「我不知道」。引用上下文内容时,请用[1][2]等标记对应源的序号。"),
        MessagesPlaceholder(variable_name="history"),
        ("human", "给定对话历史:{history},以及上下文:\n{context}\n,请回答问题:{question}。"),
    ]
)

内容的提问来源于stack exchange,提问作者cavalier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:56:03