RAG 与历史信息相结合

 

初始化模型
# Step 4. 初始化模型, 该行初始化与 智谱 的 GLM - 4  模型进行连接,将其设置为处理和生成响应。
chat = ChatZhipuAI(model="glm-4",temperature=0.8,
)

此提示告诉模型接收聊天历史记录和用户的最新问题,然后重新表述问题,以便可以独立于聊天历史记录来理解问题。明确指示模型不要回答问题,而是在必要时重新表述问题。 

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder# 此提示告诉模型接收聊天历史记录和用户的最新问题,然后重新表述问题,以便可以独立于聊天历史记录来理解问题。明确指示模型不要回答问题,而是在必要时重新表述问题。contextualize_q_system_prompt = """Given a chat history and the latest user question \
which might reference context in the chat history, formulate a standalone question \
which can be understood without the chat history. Do NOT answer the question, \
just reformulate it if needed and otherwise return it as is."""# Step 3. 创建提示模板来构建模型的交互
# 该模板包括带有说明的系统消息、聊天历史记录的占位符 ( MessagesPlaceholder ) 以及由 {input} 标记的最新用户问题。
contextualize_q_prompt = ChatPromptTemplate.from_messages([("system", contextualize_q_system_prompt),MessagesPlaceholder("chat_history"),("human", "{input}"),]
)

... 

中间省略加载文档并切分文档
# Step 9. 使用 Chroma VectorStore 创建检索器
retriever = chroma_store.as_retriever()

 

# Step 10. 设置历史信息感知检索器:
# create_history_aware_retriever 函数旨在接受输入和“chat_history”的键,用于创建集成聊天历史记录以进行上下文感知处理的检索器。
# 官方文档:https://python.langchain.com/v0.1/docs/modules/chains/
from langchain.chains import create_history_aware_retriever
"""
如果历史记录存在,它会构建一个有效组合提示、大型语言模型 (LLM) 和结构化输出解析器 ( StrOutputParser ) 的序列,后跟检索器。此顺序可确保最新问题在累积的历史数据中得到体现。
"""
# 他会结合历史信息重构子问题,他不实际回答问题,
history_aware_retriever = create_history_aware_retriever(chat,retriever,contextualize_q_prompt
)

 

# Step 12. 定义 QA 系统的提示模板,指定系统应如何根据检索到的上下文响应输入。
# 该字符串设置语言模型的指令,指示它使用提供的上下文来简洁地回答问题。如果答案未知,则指示模型明确说明这一点。

MessagesPlaceholder(variable_name="chat_history") 是一个占位符,用于在对话模型或系统中插入动态的聊天记录(chat_history)。

在提示结构中合并了一个名为“chat_history”的变量,它充当历史消息的占位符。通过使用“chat_history”输入键,我们可以将以前的消息列表无缝地注入到提示中。
qa_system_prompt = """You are an assistant for question-answering tasks. \  
Use the following pieces of retrieved context to answer the question. \
If you don't know the answer, just say that you don't know. \
Use three sentences maximum and keep the answer concise.\{context}"""
# 在提示结构中合并了一个名为“chat_history”的变量,它充当历史消息的占位符。通过使用“chat_history”输入键,我们可以将以前的消息列表无缝地注入到提示中。
qa_prompt = ChatPromptTemplate.from_messages([("system", qa_system_prompt),MessagesPlaceholder("chat_history"),("human", "{input}"),]
)

 

# 此函数用于创建一个将文档处理与其他流程相结合的链,通常涉及文档检索和在问答等任务中的使用。
from langchain.chains.combine_documents import create_stuff_documents_chain# Step 13 构建问答链:question_answer_chain 是使用 create_stuff_documents_chain 函数创建的,该函数利用语言模型 ( llm ) 和定义的提示 ( qa_prompt )。
# 官方文档链接:https://python.langchain.com/v0.1/docs/modules/chains/
question_answer_chain = create_stuff_documents_chain(chat, qa_prompt)

# Step 14. 组装 RAG 链条:该链代表完整的工作流程,其中历史感知检索器首先处理查询以合并任何相关的历史上下文,然后由 question_answer_chain 处理处理后的查询以生成最终答案。
rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)

 

 手动构建 历史聊天信息

# 以下代码演示了如何使用 RAG 链来处理一系列问题,并能够引用之前的交互。该代码模拟聊天交互,其中用户提出问题,收到答案,然后提出可以利用初始交流上下文的后续问题。以下是包含代码片段的详细说明:
from langchain_core.messages import HumanMessage# 聊天历史记录被初始化为空列表。该列表将存储会话期间交换的消息以维护上下文。
chat_history = []# 第一个问题和响应:定义一个问题,并使用该问题和当前(空)聊天历史记录调用 RAG 链。
question = "What is Task Decomposition?"
ai_msg_1 = rag_chain.invoke({"input": question, "chat_history": chat_history})
# print("First ans: %s" % ai_msg_1["answer"])# 然后,用户的问题和 AI 生成的答案分别作为 HumanMessage 实例和响应对象添加到聊天历史记录中。
chat_history.extend([HumanMessage(content=question), ai_msg_1["answer"]])# 第二个问题和响应:利用现在包含第一次交流上下文的更新的聊天历史记录,提出后续问题。
second_question = "What are common ways of doing it?"
ai_msg_2 = rag_chain.invoke({"input": second_question, "chat_history": chat_history})

自动化构聊天记录

# Step 9. 使用基本字典结构管理聊天历史记录
store = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]# 官方Docs:https://python.langchain.com/v0.2/docs/how_to/message_history/
conversational_rag_chain = RunnableWithMessageHistory(rag_chain,get_session_history,input_messages_key="input",history_messages_key="chat_history",output_messages_key="answer",
)# 现在我们问第一个问题
first_ans = conversational_rag_chain.invoke({"input": "What is Task Decomposition?"},config={"configurable": {"session_id": "abc123"}},
)["answer"]secone_ans = conversational_rag_chain.invoke({"input": "What are common ways of doing it?"},config={"configurable": {"session_id": "abc123"}},
)["answer"]print(f"first_ans:{first_ans}")
print(f"secone_ans:{secone_ans}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12240.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】安装配置Redis超详细教程 / Linux版

Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频:黑马程序员Redis入门到…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数&#xf…

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前,我们的项目根目录得有package.json 没有的话,我们就初始化一个 但是我们没有npm这个…

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画,通过 CSS 技术实现了雪花的下落和消失效果,为页面添加了视觉吸引力和动态感。 大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能…

string例题

一、字符串最后一个单词长度 题目解析:由题输入一段字符串或一句话找最后一个单词的长度,也就是找最后一个空格后的单词长度。1.既然有空格那用我们常规的cin就不行了,我们这里使用getline,2.读取空格既然是最后一个空格后的单词,…

OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)

文章目录 向量变换使用GLM变换(缩放、旋转、位移)将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试(Z-buffer)练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…

NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram

结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异: 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…

登录认证(5):过滤器:Filter

统一拦截 上文我们提到(登录认证(4):令牌技术),现在大部分项目都使用JWT令牌来进行会话跟踪,来完成登录功能。有了JWT令牌可以标识用户的登录状态,但是完整的登录逻辑如图所示&…

【R语言】R语言安装包的相关操作

一、管理R语言安装包 1、安装R包 install.packages() 2、查看已安装的R包 installed.packages() 3、更新R包 update.packages() 4、卸载R包 remove.packages() 二、加载R语言安装包 打开R语言时,基础包(base包)会自动被加载到内存中…

Vue指令v-on

目录 一、Vue中的v-on指令是什么?二、v-on指令的简写三、v-on指令的使用 一、Vue中的v-on指令是什么? v-on指令的作用是:为元素绑定事件。 二、v-on指令的简写 “v-on:“指令可以简写为”” 三、v-on指令的使用 1、v-on指令绑…

javaEE-8.JVM(八股文系列)

目录 一.简介 二.JVM中的内存划分 JVM的内存划分图: 堆区:​编辑 栈区:​编辑 程序计数器:​编辑 元数据区:​编辑 经典笔试题: 三,JVM的类加载机制 1.加载: 2.验证: 3.准备: 4.解析: 5.初始化: 双亲委派模型 概念: JVM的类加…

物业管理系统源码提升社区智能化管理效率与用户体验

内容概要 物业管理系统源码是一种针对社区管理需求而设计的软件解决方案,通过先进的智能化技术,使物业管理变得更加高效和人性化。随着城市化进程的加快,社区的管理复杂性不断增加,而这一系统的推出恰好为物业公司提供了极大的便…

读算法简史:从美索不达米亚到人工智能时代05天气预报

1. 天气预报 1.1. 自古以来,生命就与变幻莫测的天气息息相关 1.1.1. 在很多情况下,只要能提前一天得知天气情况,人类就可以避免灭顶之灾 1.1.2. 公元前2000年,准确预测天气是众神的特权 1.2. 大约在公元前650年,巴…

整形的存储形式和浮点型在计算机中的存储形式

在计算机科学的底层世界里,数据存储是基石般的存在。不同数据类型,如整形与浮点型,其存储方式犹如独特的密码,隐藏着计算机高效运行的秘密。理解它们,是深入掌握编程与计算机原理的关键。 一、整形的存储形式 原码、反…

Python网络自动化运维---批量登录设备

文章目录 目录 文章目录 前言 实验准备 一.批量登录 IP 连续的设备 1.1.1 实验代码 1.1.2 代码分段分解 1.1.3 实验结果验证 二.批量登录 IP 不连续的设备 2.2.1 实验代码 2.2.2 代码分段分解 2.2.3 实验结果验证 前言 在生产环境中,我们通常需要登录多个设备…

selenium记录Spiderbuf例题C03

防止自己遗忘,故作此为记录。 鸢尾花数据集(Iris Dataset) 这道题牵扯到JS动态加载。 步骤: (1)进入例题,需要找到按钮规律。 flip_xpath: str r"//li/a[onclickgetIrisData({});]" (2&…

【C++篇】位图与布隆过滤器

目录 一,位图 1.1,位图的概念 1.2,位图的设计与实现 1.5,位图的应用举例 1.4,位图常用应用场景 二,布隆过滤器 2.1,定义: 2.2,布隆过滤器的实现 2.3, 应…

基于SpringBoot的新闻资讯系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…

C基础寒假练习(2)

一、输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…