首页 > 编程问答 >如何在 Python 中使用 Langchain 返回已使用的上下文以进行回答

如何在 Python 中使用 Langchain 返回已使用的上下文以进行回答

时间:2024-08-07 04:18:18浏览次数:14  
标签:python langchain large-language-model

我已经构建了一个像这样的 RAG 系统:

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

response_schemas = [
    ResponseSchema(name="price", description="Price", type="float"),
    ResponseSchema(name="unit", description="Unit", type="int"),
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

rag_prompt = PromptTemplate(
    input_variables=["context","question"],
    template=template,
    partial_variables={"format_instructions": output_parser.get_format_instructions()},
)

rag_chain = (
    {"context": compression_retriever | format_docs, "question": RunnablePassthrough()}
    | rag_prompt
    | llm
    | output_parser
)

query = "What is the price? How many units?"

response = rag_chain.invoke(query, config={"configurable": {"session_id": "abc123"}},)

但是我的响应是一个 JSON,其中我的价格和单位仅作为键。我希望能够有一个“上下文”变量来存储算法用来回答问题的文档中使用的段落。

知道我该怎么做吗?


要返回用于回答 Langchain 中的查询的上下文,需要修改的代码以包含源文档。以下是如何执行此操作的方法:

  1. 启用源信息跟踪: 在 Langchain 中,可以使用 include_source_documents 参数将源文档包含在响应中。

  2. 修改的 rag_chain 定义:

python rag_chain = ( {"context": compression_retriever | format_docs, "question": RunnablePassthrough()} | rag_prompt | llm.bind(include_source_documents=True) | output_parser ) 我们在这里对 llm 使用 .bind() ,以在调用时传递 include_source_documents=True

  1. 从响应中访问上下文: 现在,的响应将包含一个 source_documents 字段,其中包含用于生成答案的文档。

```python response = rag_chain.invoke(query, config={"configurable": {"session_id": "abc123"}})

print(response.json()) # 打印结构化输出 print(response.source_documents) # 打印源文档列表 ```

完整的更新代码:

from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.prompts import PromptTemplate
from langchain.schema import (
    HumanMessage,
    SystemMessage,
    AIMessage,
)
from langchain.output_parsers import StructuredOutputParser, ResponseSchema

# ... [的文档加载和检索器设置] ...

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

response_schemas = [
    ResponseSchema(name="price", description="Price", type="float"),
    ResponseSchema(name="unit", description="Unit", type="int"),
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

rag_prompt = PromptTemplate(
    input_variables=["context", "question"],
    template=template,  # 在这里定义的模板
    partial_variables={"format_instructions": output_parser.get_format_instructions()},
)

rag_chain = (
    {"context": compression_retriever | format_docs, "question": RunnablePassthrough()}
    | rag_prompt
    | llm.bind(include_source_documents=True)  # 启用源文档包含
    | output_parser
)

query = "What is the price? How many units?"

response = rag_chain.invoke(query, config={"configurable": {"session_id": "abc123"}})

print(response.json()) 
print(response.source_documents)  

现在,可以访问 response.source_documents 以获取用于回答查询的上下文。

标签:python,langchain,large-language-model
From: 78840242

相关文章

  • 如何从 python socket.sendmsg 获取套接字 Tx 时间戳
    在阅读此处、此处和此处时,我发现在Linux系统上,您可以通过设置套接字选项来请求接收和传输的数据包的时间戳。我目前可以使用SO_TIMESTAMPNS和SO_TIMESTAMPING来通过recvmsg获取Rx时间戳。使用sendmsg我不知道......
  • Python 类型注释中“|”两边是否“强制”使用空格?
    “Union运算符”|没有出现在PEP8的其他建议中的“始终被空格包围的运算符”列表中因此,应该可以将其样式设置为类似于算术运算符,并删除圆括号、方括号内的空格,或者如果该运算符比表达式中的其他运算符具有更高的优先级。在我看来,删除空格可以提高表达式......
  • ArcPro (3.2+) Python 脚本工具中从 .atbx Toolbox 相对导入本地模块
    我设置了一个库和关联的ArcGISToolbox,以便:/root├──Toolbox.atbx├──mylib│└──my_function.py├──my_tools│└──my_gp_script.py我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在GitHub上托管一份副本。当我进行更新时,我会......
  • Python vs. R:揭秘机器学习领域的双璧
    一、引言1.1背景介绍随着大数据和人工智能技术的飞速发展,机器学习已经成为了一个热门领域。在机器学习领域,Python和R是两种广泛使用的编程语言。Python因其简洁易读的语法和强大的库支持,成为了最受欢迎的编程语言之一。而R则以其强大的统计分析和数据可视化能力,在统计学......
  • Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10
    Windows10安装编译后的pysqlcipher3-1.2.1基于Python3.8.10本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里安装pysqlcipher3这里用32位举例因为64位安装完全相同,只需要把对应的位数换成64......
  • 【Python】Python基础语法知识点汇集
    Python是一种高级的、解释型的编程语言,以其清晰的语法和代码可读性而闻名。本篇文章将汇集Python编程的基础语法知识点,为初学者提供一个全面的学习指南。......
  • 启动Python 的内置服务器访问本地图片
    要使用Python的内置服务器访问本地图片并正确地显示在浏览器中,你需要将图片文件放在内置服务器的根目录或其子目录中。以下是详细步骤:1.将图片文件复制到服务器根目录:例如,将zheng.jpeg文件复制到一个特定的目录中(例如,你的项目目录)。假设你将图片文件复制到C:\Users\panda......
  • 17:Python数据类型练习题
    #1获取c1,c2相同的元素列表c1=[11,22,33]c2=[22,33,44]foriinc1:ifiinc2:print(i)#2获取c1中有,c2没有的元素列表foriinc1:ifinotinc2:print(i)#3获取c2中有,c1没有的元素列表foriinc2:ifinotinc1:print(i)#4获......
  • (Jmeter新玩法)Python 调 Jmeter执行参数化jmx脚本
    #Python调Jmeter执行参数化jmx脚本importosfromos.pathimportjoinimporttimeimportrefromstringimportTemplatejmeter_Home=r"F:\softtotal\xxx\bin\jmeter.bat"#jmx文件路径currpath=os.path.dirname(os.path.realpath(__file__))#要运行的jmx脚......
  • LangChain与JWT:构建安全认证的桥梁
    LangChain与JWT:构建安全认证的桥梁在现代Web应用和微服务架构中,安全认证是保护数据和资源访问的关键。JSONWebTokens(JWT)作为一种广泛使用的开放标准,为安全传输提供了一种简洁而自包含的方式。LangChain,作为一个假设的编程辅助工具,如果存在,它可能会支持JWT,以增强其在安全......