当前位置: 首页 > news >正文

【langchain学习】使用LangChain创建具有上下文感知的问答系统

探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史,将当前问题转化为一个独立的问题,接着根据上下文提供准确的答案。

1. 导入所需模块
from operator import itemgetter
from config import llm  # 从config文件导入语言模型(llm)
from langchain_core.output_parsers import StrOutputParser  # 导入字符串输出解析器
from langchain_core.prompts import ChatPromptTemplate  # 导入聊天提示模板
from langchain_core.runnables import Runnable, RunnablePassthrough, chain  # 导入可执行单元、直通单元和链式处理功能

首先,我们导入了需要的模块。llm 是一个语言模型,StrOutputParser 是一个字符串输出解析器,ChatPromptTemplate 用于创建提示模板,RunnableRunnablePassthroughchain 则用于创建和处理可执行的链式处理流程。

2. 指令:上下文化用户问题
contextualize_instructions = """
根据聊天记录,将最新的用户问题转换为独立问题。不要回答问题,返回问题,不要做其他任何事情(没有描述性文本)
"""

这里我们定义了一段指令,告知系统根据聊天记录将用户的最新问题转化为一个独立的问题,并只返回问题本身,而不包含其他信息。

3. 创建聊天提示模板
contextualize_prompt = ChatPromptTemplate.from_messages([("system", contextualize_instructions),  # 系统指令("placeholder", "{chat_history}"),  # 占位符,用于填充聊天历史("human", "{question}"),  # 用户提出的问题]
)

我们使用 ChatPromptTemplate.from_messages 创建了一个聊天提示模板,该模板结合了上下文指令、聊天历史和用户问题,用于生成系统提示。

4. 链式处理:将上下文指令与语言模型连接
contextualize_question = contextualize_prompt | llm | StrOutputParser()

在这一步,我们将聊天提示模板、语言模型以及字符串输出解析器连接起来,形成一个完整的处理链。contextualize_question 将作为处理链的一部分,用于上下文化用户问题。

5. 创建问答系统的提示模板
qa_instructions = ("""Answer the user question given the following context:\n\n{context}."""
)

这里我们定义了问答系统的指令,系统将根据提供的上下文来回答用户的问题。

qa_prompt = ChatPromptTemplate.from_messages([("system", qa_instructions), ("human", "{question}")]
)

随后,我们创建了另一个聊天提示模板 qa_prompt,它结合上下文指令和用户问题,用于生成问答提示。

6. 定义链式处理函数
@chain
def contextualize_if_needed(input_: dict) -> Runnable:if input_.get("chat_history"):return contextualize_questionelse:return RunnablePassthrough() | itemgetter("question")

我们定义了一个链式处理函数 contextualize_if_needed,用于根据聊天历史上下文化用户问题。如果有聊天历史存在,系统将返回上下文化问题的可执行单元;否则,直接返回用户问题。

7. 模拟数据检索器
@chain
def fake_retriever(input_: dict) -> str:return "Tadej Pogačar won the Tour de France in 2024."

在这个步骤中,我们定义了一个假的检索器 fake_retriever,用于模拟从数据库或API中检索数据。在本例中,它直接返回一条硬编码的信息。

8. 定义完整的处理流程
full_chain = (RunnablePassthrough.assign(question=contextualize_if_needed).assign(context=fake_retriever)| qa_prompt| llm| StrOutputParser()
)

full_chain 是整个系统的核心。它将用户问题和聊天历史传递给 contextualize_if_needed 进行上下文处理,然后通过 fake_retriever 获取相关的上下文信息,接着生成问答提示,并使用语言模型生成答案,最后解析并输出结果。

9. 调用处理流程
res = full_chain.invoke({"question": "what about Tour de France in 2024","chat_history": [("human", "Who won the Tour de France in 2023?"),("ai", "Jonas Vingegaard."),],}
)

在这里,我们调用了 full_chain,传入用户当前的问题和聊天历史。这个链式处理流程会根据历史记录将问题转化为一个独立问题,并返回答案。

10. 输出结果
print(res)

最后,我们将处理结果输出到控制台。

Tadej Pogačar.Process finished with exit code 0
http://www.lryc.cn/news/419552.html

相关文章:

  • 原神4.8版本升级计划数据表
  • 海南云亿商务咨询有限公司放大电商品牌影响力
  • 用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
  • TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法
  • 使用消息队列、rocketMq实现通信
  • 通过LLM大模型将「白雪公主的故事」转为图数据存储
  • MyBatisPlus 第一天
  • 线程与多线程(二)
  • 算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
  • 2024牛客暑期多校训练营8
  • git的一些操作指令
  • 【IT行业研究报告】Internet Technology
  • GLM大模型的机器翻译能力测试
  • 【硬件产品经理】汽车A样设计
  • Ubuntu22.04系统中安装机器人操作系统ROS
  • LeetCode54题:螺旋矩阵(原创)
  • FPGA常见型号
  • 【多模态大模型】FlashAttention in NeurIPS 2022
  • 过滤器doFilter 方法
  • WPF篇(9)-CheckBox复选框+RadioButton单选框+RepeatButton重复按钮
  • 【机器学习基础】线性回归
  • java基础概念12-二维数组
  • 56 锐键交换机开局
  • VR虚拟展厅与传统实体展厅相比,有哪些优势?
  • Vue的事件处理、事件修饰符、键盘事件
  • c++单例实践
  • SQL注入实例(sqli-labs/less-9)
  • http不同类型方法的作用,get和post区别
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • 美团秋招笔试第三题(剪彩带)求助帖