首页 > 其他分享 >【RAG 项目实战 04】添加多轮对话能力

【RAG 项目实战 04】添加多轮对话能力

时间:2024-11-23 19:26:40浏览次数:7  
标签:RAG 多轮 04 cl session 添加 id history

【RAG 项目实战 04】添加多轮对话能力


NLP Github 项目:


[!NOTE] 添加多轮对话能力

  1. 存储对话历史
  2. 添加 session_id
  3. 提示模板中添加 chat_history
  4. RunnableWithMessageHistory 包装 Chain 添加对话历史能力
  5. 配置中使用 session_id 进行大模型交互,可以根据 session_id 区分不同用户的对话历史

一、添加多轮对话能力

01 存储对话历史

# 存储对话历史
store = {}


def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

02 添加 session_id

# 添加 session_id
cl.user_session.set('session_id', 'abc2')

03 在提示模板中添加 chat_history

# 添加 session_id
cl.user_session.set('session_id', 'abc2')

# 提示模板中添加 chat_history
prompt = ChatPromptTemplate.from_messages(
	[
		(
			"system",
			"You're a very knowledgeable historian who provides accurate and eloquent answers to historical questions.",
		),
		MessagesPlaceholder("chat_history"),
		("human", "{question}"),
	]
)

04 使用 RunnableWithMessageHistory 包装 Chain

# 获取当前的 session_id
session_id = cl.user_session.get("session_id")

# 用 RunnableWithMessageHistory 包装 Chain 添加对话历史能力
runnable_with_history = RunnableWithMessageHistory(
	runnable,
	get_session_history,
	input_messages_key="question",
	history_messages_key="chat_history",
)

05 使用 session_id 进行大模型交互

msg = cl.Message(content="")

# 配置中使用 session_id 进行大模型交互
async for chunk in runnable_with_history.astream(
		{"question": message.content},
		config=RunnableConfig(configurable={"session_id": session_id},
							  callbacks=[cl.LangchainCallbackHandler()])
):
	await msg.stream_token(chunk)

await msg.send()

Tips:用 RunnableWithMessageHistory 包装 Chain 添加对话历史能力,不能将其插入到 Chain 中

二、效果展示

多轮能力展示

标签:RAG,多轮,04,cl,session,添加,id,history
From: https://www.cnblogs.com/fasterai/p/18564937

相关文章

  • Ubuntu20.04换源换回默认源
     在Linux(以Ubuntu为例)下,换回默认软件源主要涉及恢复/etc/apt/sources.list文件中的内容。以下是具体步骤:1.备份当前的源文件在修改之前,建议先备份当前的sources.list文件:bash复制代码sudocp/etc/apt/sources.list/etc/apt/sources.list.backup2......
  • 大模型RAG面试高频知识点
    看到很多同学对RAG比较感兴趣,但是在面试中被问麻了,不知道如何突出自己的能力。就跟之前做GBDT、BERT和LLM微调一样,我们做的不仅仅是算法本身,而是解决问题的项目方案。让大家恨不得在简历上删除的RAG项目,大致有以下几个特点:1、demo简单:RAG易学难精,搭建一个demo非常简单,但......
  • 【041】基于51单片机篮球计分器【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+4*4矩阵键盘+LCD1602液晶显示+按键设置+蜂鸣器。1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,以LCD1602液晶显示屏显示信息;2、采用4*4矩阵键盘进行人机交互,方便快捷;3、具有比赛加减分,比赛节数设置,比赛时间倒计时,24......
  • 深入浅出学算法045-纪念品分组
    题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪......
  • 大模型面试——做RAG的211硕士,面了一个做RAG的211硕士,讲不清知识库构建
    RAG目前属于比较成熟的大模型落地技术,一般以PDF文档、excel、nl2sql和联网检索作为数据来源。今天面的这位同学主要做智能客服业务,利用历史多轮对话QA作为知识库。之前在面RAG项目的时候的时候,大部分都会去问知识库的数量,文档解析效果和chunk切分逻辑。他们以上千条历史多......
  • CF1404B. Tree Tag
    1405D-树标记让我们独立地考虑几个情况。情况1:$\text{dist}(a,b)\leqda$不出所料,在这种情况下,Alice在第一步就通过标记Bob获胜。情况2:$2da\geq\text{树的直径}$在这里,树的直径被定义为最长简单路径的长度。在这种情况下,Alice可以移动到树的中心。一旦Alice......
  • Ubuntu20.04换源
    参考链接:https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/更换方法Ubuntu采用apt作为软件安装工具,其镜像源列表记录在/etc/apt/source.list文件中。首先将source.list复制为source.list.bak备份,然后将source.......
  • x-cmd pkg | chatgpt - ChatGPT 聊天助手,带你体验高效的多轮对话,智能上下文记忆
    目录简介快速上手安装使用功能特点竞品和相关项目进一步阅读简介chatgpt是由github.com/j178使用Go开发的用于ChatGPT的CLI,支持GPT-3.5-turbo和GPT-4。快速上手安装eval"$(curlhttps://get.x-cmd.com)"#安装x-cmdxenvusechatgpt......
  • pragma comment的使用
    #pragma的使用尽管C和C++都已经有标准,但是几乎每个编译器(广义,包含连接器等)扩展一些C/C++关键字。合理地应用这些关键字,有时候能使我们的工作非常方便。下面随便说说VisualC++中#pragma指示符的使用。一、用#pragma导出DLL函数    传统的到出DLL函数的......
  • 嵌入式课程day04-C语言运算符和选择结构
    2.3运算符2.3.1运算符介绍运算符:具有一定运算规则的符号。操作数:运算符的操作对象。~a   ---a就是~运算符的操作数。---单目运算符:运算符只有一个操作数3+5---35就是+运算符的操作数。---双目运算符:运算符有2个操作数    表达式1?表达式2:表达......