【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
用于创建提示模板,Runnable
、RunnablePassthrough
和 chain
则用于创建和处理可执行的链式处理流程。
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
相关文章:
【langchain学习】使用LangChain创建具有上下文感知的问答系统
探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史,将当前问题转化为一个独立的问题,接着根据上下文提供准确的答案。 1. 导入所需模块 from operator import itemgetter from config import llm # 从config文件…...

原神4.8版本升级计划数据表
原神4.8版本角色数据升级计划表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本升级计划…...

海南云亿商务咨询有限公司放大电商品牌影响力
在数字化浪潮席卷全球的今天,电商行业以其独特的魅力和无限潜力,成为了推动经济发展的重要力量。而在这片浩瀚的电商海洋中,抖音电商以其独特的短视频直播模式,迅速崛起为一颗璀璨的新星,引领着新一轮的消费潮流。作为…...

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
exceljs在Jquery(HTML)和vue项目中实现导出功能 前言Jquery(HTML)中实现导出第一步,先在项目本地中导入exceljs和file-saver包第二步,封装导出Excel方法(可直接复制粘贴使用)第三步&…...

TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法
TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法 如下图所示,下载程序时提示:在线检查保护机密PLC组态数据的密码时出错。 原因: 自 TIA Portal V17 起,新增了安全向导用于帮助客户快速进行安全相关的设置。即保护机密的PLC组态数据功能导致出现下载异常。…...
使用消息队列、rocketMq实现通信
1背景 springboot框架, 2需求 后端需要调用一个类似于api这种作用的小工具,获得工具的返回值,后端再根据客户端的返回值进行更新数据操作 3讨论 1工具开发者使用的是python,将工具封装起来,暴露成web接口供后端调用 2方式一能…...

通过LLM大模型将「白雪公主的故事」转为图数据存储
💡 本次将使用LLM大模型将「白雪公主的故事」转为图数据存储于neo4j数据库中,并展示图数据部分的效果 故事内容 很久很久以前,在一个遥远的王国里,有一位美丽的**王后**生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的**女儿**…...

MyBatisPlus 第一天
数据库创建表 CREATE DATABASE mybatis_plus /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use mybatis_plus; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT 主键ID, name varchar(30) DEFAULT NULL COMMENT 姓名 , age int(11) DEFAULT NULL COMMENT 年龄 , email va…...

线程与多线程(二)
线程与多线程(二) 一、线程互斥1、相关概念 二、互斥锁1、介绍2、使用场景3、初始化(1)函数(2)概念 4、销毁(1)函数(2)概念 5、加锁(1)…...

算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
目录 1. 欧拉函数 (1)概念 (2)性质 (3)计算公式 2. 求一个数的欧拉函数 (1)模拟过程 (2)代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...
2024牛客暑期多校训练营8
文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道,最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai 较小,所以我们枚举每一个没出现过的 x …...
git的一些操作指令
一、git 提交规范 commit message subject : 空格 message 主体 feat: 新功能(feature)用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动(不影响代码逻辑&…...

【IT行业研究报告】Internet Technology
一、引言 随着信息技术的飞速发展,IT行业已成为全球经济的重要驱动力。从云计算、大数据、人工智能到物联网,IT技术正深刻改变着各行各业的生产方式、商业模式和人们的生活方式。本报告旨在深入分析IT行业的现状、发展趋势和挑战,探讨其在各…...

GLM大模型的机器翻译能力测试
背景介绍 最近想对GLM-4今年发布的几个大模型 glm-4-0520,glm-4-air以及glm-4-flash简单评测一下它们的机器翻译能力,由于这几个大模型的容量和训练数据都有区别,所以它们的翻译能力也是不同的。我们这里就分别选择一些有趣的,有…...
【硬件产品经理】汽车A样设计
目录 简介 制造方式 作者简介 简介 一般被称作原型样件(Prototype)。 主要是根据系统需求设计,实现基本功能和关键尺寸,用于基本功能的验证,用于初期产品软件调试和Hil台架测试(Hardware in Loop,硬件在环)的样机阶段。 也就说在设计初期,A样的主要目的可以划分…...
Ubuntu22.04系统中安装机器人操作系统ROS
在Ubuntu 22.04上安装ROS(Robot Operating System)的过程可以分为几个主要步骤。请注意,ROS有不同的版本(如ROS 1的Melodic、Noetic等,以及ROS 2的Foxy、Humble等),这些版本对Ubuntu的支持程度可…...

LeetCode54题:螺旋矩阵(原创)
【题目描述】 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:mat…...

FPGA常见型号
FPGA(现场可编程门阵列)开发板种类繁多,涵盖了从入门级教育用途到高性能工业应用的广泛领域。以下是一些常见的 FPGA 开发板型号及其特点: 1. Xilinx(赛灵思)系列 Xilinx 是 FPGA 领域的领导者之一&#…...

【多模态大模型】FlashAttention in NeurIPS 2022
一、引言 论文: FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 作者: Stanford University 代码: FlashAttention 特点: 该方法提出将Q、K、V拆分为若干小块,使执行注意力时不需要频…...
过滤器doFilter 方法
在Java EE中,过滤器的放行是指在过滤器的 doFilter 方法中调用 FilterChain 对象的 doFilter 方法,将请求传递给下一个过滤器或目标 servlet 进行处理。这个过程可以理解为过滤器的责任链传递。 过滤器的 doFilter 方法 在过滤器中,实现 Fil…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...