当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微服务-分布式事务-seata
  • 神经网络:智能时代的基石
  • 再分享API形式调用Dify项目应用
  • 大语言模型生成无人系统(如机械臂、无人机等)可以执行的指令序列
  • 初学嵌入式-C语言常犯错误详解
  • 【机器学习之深度学习】Sigmoid和ReLU的联系与区别、ReLU如何解决死亡问题以及Tanh激活函数的基本概念
  • ClickHouse:单机安装
  • 【数据结构】—— 队列
  • 阿里大模型调用 = 》通义千问大语言模型
  • GenAI下沉到边缘侧,内存和性能如何平衡?
  • 江科大/江协科技 STM32学习笔记P22
  • 四数之和(LeetCode)
  • Linux 系统框架分析(一)
  • PyTorch深度学习框架
  • 【vue3|第20期】vue3中Vue Router路由器工作模式
  • 30秒的PHP代码片段(1)数组 - Array
  • git 常用命令
  • java 多线程基础, 我觉得还是有必要看看的
  • Making An Indicator With Pure CSS
  • MySQL用户中的%到底包不包括localhost?
  • PAT A1017 优先队列
  • Redux 中间件分析
  • Vue--数据传输
  • 初识 beanstalkd
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 回顾2016
  • 解析带emoji和链接的聊天系统消息
  • 开源地图数据可视化库——mapnik
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 你不可错过的前端面试题(一)
  • 设计模式 开闭原则
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我感觉这是史上最牛的防sql注入方法类
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)STL算法之元素计数
  • (pycharm)安装python库函数Matplotlib步骤
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (七)Flink Watermark
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)甲方乙方——赵民谈找工作
  • (转)我也是一只IT小小鸟
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .chm格式文件如何阅读
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript