网站推广易网宣,网站建设简述需求分析的基本概念及内容,成都市建设工程质量协会网站,免费的网站建设langchain学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储#xff1a;完整代码 引言
本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。
背景
在与大模型交互过程中#xff0c;经常出现消息管理方… langchain学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储完整代码 引言
本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。
背景
在与大模型交互过程中经常出现消息管理方面的问题。一些大模型的上下文窗口包含的 token \text{token} token数量往往是有限的如何将有限的大模型 memory \text{memory} memory合理利用是十分关键的问题。
再比如在与大模型交互时可能会产生一系列连续的对话这些对话往往不是独立的我们更期望大模型能够合理找出这些对话之间的语义联系并从而给出更符合要求的答案。
消息存储在内存的实现方法
基于上述背景第一个朴素的想法是与大模型连续交互的过程中大模型能够认识到若干个prompt之间的语义联系从而给出合理的回复。
准备工作将模型、prompt以及初始chain的部分进行定义其中使用MessagePlaceholder给交互过程中产生的历史信息留下位置
from langchain_community.llms import Tongyi
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder def get_model():return Tongyi(model_nametongyi-7b-chinese,temperature0.5,max_tokens100,)def get_runnable_chain():chat_prompt ChatPromptTemplate.from_messages([(system,你是一个擅长{field_input}的智能助理,返回结果不超过200字。),# 历史消息相关的placeholderMessagesPlaceholder(variable_namehistory),(human,{prompt_input})])llm get_model()# 创建一个chain式调用,和历史信息相关的可运行chainrunnable chat_prompt | llmreturn runnable创建一个store_message字典在与大模型交互交互过程中将历史会话记录存储在字典中
store_message {}在用户prompt过程中设置一个名为session_id的参数目的是将相同session_id的prompt归结为具有语义联系的prompt。定义函数get_session_history该函数的目的是将store_message中当前session_id包含的所有交互信息获取出来。若未获取消息即session_id第一次出现在store_message中则需要新创建一个ChatMessageHistory的对象将消息存入其中
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistorydef get_session_history(session_id: str) - InMemoryChatMessageHistory:if session_id not in store_message:store_message[session_id] ChatMessageHistory()return store_message[session_id]创建一个包含历史会话记录的运行器通过RunnableWithMessageHistory类通过history的标识将get_session_history中获取的历史会话记录结合当前交互步骤的prompt_input(该部分中包含session_id)映射在MessagePlaceHolder中并最终生成包含交互历史记录的runnable_chain:
from langchain_core.runnables.history import RunnableWithMessageHistorymessage_history_runnable RunnableWithMessageHistory(runnableget_runnable_chain(),get_session_historyget_session_history,input_messages_keyprompt_input,history_messages_keyhistory)最终使用该runnable_chain进行交互。示例
response_1 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 简单介绍一下李白},config{configurable: {session_id: libai_introduction}})for chunk in response_1:print(chunk, end, flushTrue)首先是通过field_input对大模型进行角色定义并提出prompt以及当前交互步骤的session_id。返回结果如下
李白701762字太白号青莲居士唐代著名诗人。出生于中亚碎叶城少年时迁居四川。他性格豪放不羁好饮酒作乐游历名山大川留下大量诗篇。其诗歌风格飘逸洒脱、意境开阔充满浪漫主义色彩善于运用夸张手法和奇特想象。李白与杜甫并称“李杜”代表作品有《将进酒》、《静夜思》、《望庐山瀑布》等对后世影响深远。安史之乱爆发后因参与永王李璘起兵而获罪流放晚年生活困顿在当涂病逝。继续执行第二次交互的respense_2表示如下
response_2 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 他具体受到哪些政治迫害?},config{configurable: {session_id: libai_introduction}})需要注意的是仅从response_2交互自身我们无法知晓prompt_input中的他描述的具体是谁但由于与response_1共享同一个session_id结合历史会话信息能够得到这个他描述的是李白。返回结果如下
李白在安史之乱期间因卷入永王李璘的起兵事件而遭受政治迫害。756年永王李璘起兵东下李白应邀加入其幕府。然而李璘与唐肃宗争夺帝位失败李白因此获罪被捕入狱。虽经友人营救得以免死但仍被流放夜郎今贵州一带。后因朝廷大赦李白途中遇赦返回但晚年生活穷困潦倒最终客死当涂。这次政治牵连对李白的晚年生活和创作产生了重大影响。创建一个反例基于response_2若prompt_input不变但调整session_id
response_3 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 他具体受到哪些政治迫害?},config{configurable: {session_id: libai_politics}})预期结果是大模型不清楚这个他指代的是谁。返回结果如下
你提到的政治迫害对象不明确呢。如果你是指历史上某个特定人物遭受的政治迫害比如屈原他因谗言被楚怀王疏远放逐汉北或岳飞被秦桧以“莫须有”的罪名陷害等你可以具体说说你关注的人物哦这样我能更准确作答。至少和李白没什么关系~
消息完整存储完整代码
# 引入聊天信息历史记录
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_community.llms import Tongyi# 用于储存历史会话记录
store_message {}def get_model():return Tongyi(model_nametongyi-7b-chinese,temperature0.5,max_tokens100,)def get_runnable_chain():chat_prompt ChatPromptTemplate.from_messages([(system,你是一个擅长{field_input}的智能助理,返回结果不超过200字。),# 历史消息相关的placeholderMessagesPlaceholder(variable_namehistory),(human,{prompt_input})])llm get_model()runnable chat_prompt | llmreturn runnable# 获取历史会话
def get_session_history(session_id: str) - InMemoryChatMessageHistory:if session_id not in store_message:# 没有查到session_id,使用ChatMessageHistory做一个初始化store_message[session_id] ChatMessageHistory()return store_message[session_id]message_history_runnable RunnableWithMessageHistory(runnableget_runnable_chain(),get_session_historyget_session_history,input_messages_keyprompt_input,history_messages_keyhistory)if __name__ __main__:response_1 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 简单介绍一下李白},config{configurable: {session_id: libai_introduction}})for chunk in response_1:print(chunk, end, flushTrue)print(\n)print(----- * 30)response_2 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 他具体受到哪些政治迫害?},config{configurable: {session_id: libai_introduction}})for chunk in response_2:print(chunk, end, flushTrue)print(\n)print(----- * 30)response_3 message_history_runnable.stream(input{field_input: 历史科普,prompt_input: 他具体受到哪些政治迫害?},config{configurable: {session_id: libai_politics}})for chunk in response_3:print(chunk, end, flushTrue)观察一下执行了三次交互后的store_message:
{libai_introduction: InMemoryChatMessageHistory(messages[HumanMessage(content简单介绍一下李白, additional_kwargs{}, response_metadata{}), AIMessage(content李白701-762字太白号青莲居士唐代伟大诗人。生于绵州昌隆祖籍陇西成纪。其诗风豪放飘逸想象丰富语言流转自然音律和谐多变。他喜好饮酒作乐常与友人畅饮赋诗留下“斗酒诗百篇”的佳话。代表作有《静夜思》《望庐山瀑布》等。李白一生游历名山大川交友广泛曾任翰林供奉后因卷入永王李璘事件被流放夜郎途中遇赦返回晚年生活困顿病逝于当涂。他与杜甫并称为“李杜”对后世影响深远。, additional_kwargs{}, response_metadata{}), HumanMessage(content他具体受到哪些政治迫害?, additional_kwargs{}, response_metadata{}), AIMessage(content李白在安史之乱期间因卷入永王李璘的起兵事件而遭受政治迫害。永王李璘是唐玄宗之子在安禄山叛乱时他试图争夺帝位李白误以为他是中兴之主便加入其幕府。然而永王兵败后李白被指控参与谋反获罪下狱后被判流放夜郎今贵州一带。幸而在流放途中遇赦免得以返回。这次政治风波对李白晚年生活影响极大也使他失去了仕途机会。, additional_kwargs{}, response_metadata{})]), libai_politics: InMemoryChatMessageHistory(messages[HumanMessage(content他具体受到哪些政治迫害?, additional_kwargs{}, response_metadata{}), AIMessage(content你提到的政治迫害对象不明确呢。如果你是指历史上某个特定人物遭受的政治迫害比如屈原他因谗言被楚怀王疏远放逐汉北或岳飞被秦桧以“莫须有”的罪名陷害等你可以具体说说你关注的人物哦这样我能更准确作答。, additional_kwargs{}, response_metadata{})])
}很明显store_message中的两个session_idlibai_introduction和libai_politics相互独立。