首页 > 其他分享 >记忆的力量:使用Langchain为AI助手添加持久记忆

记忆的力量:使用Langchain为AI助手添加持久记忆

时间:2024-08-27 22:51:21浏览次数:14  
标签:AI self redis 用户 Langchain 记忆 chat history

在使用Langchain构建智能对话系统时,记忆库的作用不可小觑。记忆库能够存储和管理对话历史,让AI在交流中更加连贯和个性化。通过Langchain的记忆库集成,我们可以轻松地将Redis等数据库作为后端存储,实现聊天消息的持久化。这样,无论用户何时返回,AI都能够回忆起之前的对话内容,提供更加贴心的服务。例如,用户询问天气后,AI不仅能够提供即时信息,还能记住用户之前询问的城市,下次直接提供相关信息。这种记忆能力极大地提升了用户体验,使得对话更加流畅自然。Langchain的记忆库功能,为构建智能、有记忆的AI助手提供了强大的支持。

在使用Langchain处理Redis Chat Message History时,很多朋 友可能会遇到手册说明不详细和代码示例无法正常运行的问题。我这通过2天的摸索自定义开发langchain利用redis库存放会员的记忆系统,提高了记忆的利用效率

1,关于redis数据库的链接代码实现:

import json
import os
import configparser
import redis

class RedisHashClient:
    def __init__(self):
        # config = common.readConfig()
        config = configparser.ConfigParser()
        config_file = './config.ini'
        config.read(config_file, 'utf8')

        self.client = redis.Redis(host=config.get('redis_conf', 'host')
                                  , port=config.get('redis_conf', 'port')
                                  , db=config.get('redis_conf', 'db')
                                  , password=config.get('redis_conf', 'password'))

2,关于记忆体的存放与提取代码:

from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain.schema import BaseMessage, HumanMessage, AIMessage

def llMmodel(self):
        try:
            
                api_key = self.config.get('chatgpt', 'zhipu_apikey')
                llMmodel_instance = ChatOpenAI(
                    temperature=0.9,
                    # model="glm-4-0520",
                    # model="glm-4",
                    model="glm-4-air",
                    openai_api_key=api_key,
                    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
                )
                
            return llMmodel_instance

        except Exception as e:           
            print(f"An unexpected error occurred: {e}")


    # 定义一个函数来保存聊天历史到 Redis
    # 保存聊天历史到 Redis(使用 JSON)
    def save_chat_history_to_redis(self, chat_history):
        chat_history_str = json.dumps([msg.dict() for msg in chat_history.messages],ensure_ascii=False)
        # 将 JSON 字符串中的汉字转换为 Base64 编码
        RedisHashClient().client.hset("langchain:chat_history",self.session_id,chat_history_str)


    # 定义一个函数来从 Redis 获取聊天历史
    # 从 Redis 获取聊天历史(使用 JSON)
    def get_chat_history_from_redis(self):
        chat_history_str = RedisHashClient().client.hget("langchain:chat_history",self.session_id)
        chat_history = InMemoryChatMessageHistory()
        if chat_history_str:
            messages = json.loads(chat_history_str)
            for msg in messages:
                if msg['type'] == 'human':
                    chat_history.add_message(HumanMessage(content=msg['content']))
                elif msg['type'] == 'ai':
                    chat_history.add_message(AIMessage(content=msg['content']))
        return chat_history
		
	# 用户的背景信息	
	def getUserBginformation(self):
	    return "姓名:黑金;职务:从事IT开发10年; 爱好:喜欢研究新代码"
	
	def chatmsg(self):
        user_background_information = self.getUserBginformation()
        prompt = ChatPromptTemplate.from_messages(
            [
                ("system", "你是一个AI聊天助手"),
                ("system", "请使用中文语言回复,并且回复token的长度不要超过100字。回复不要出现Note"),
                ("user",user_background_information),
                ("placeholder", "{chat_history}"),
                ("human", "{input}"),
            ]
        )

        # 使用示例
        session_id = f"user_id::{self.user_id}"  # 假设这是用户的会话 ID
        chat_history = self.get_chat_history_from_redis()
        if chat_history is None:
            chat_history = InMemoryChatMessageHistory()  #BaseChatMessageHistory类自带的
        #调试history是字符串吗?
        chain = prompt | self.llMmodel
        wrapped_chain = RunnableWithMessageHistory(chain, lambda x: chat_history)
        
        try:
            AIMessageObj = wrapped_chain.invoke(
                {
                    "input": $input_chat,  # 用户输入
                },
                config={"configurable": {"session_id":session_id}}
            )
                
            self.historyMsg = chat_history.messages
            self.aiOutMsg = AIMessageObj.content.strip()
            if not self.aiOutMsg:
                self.error = "AI回复为空"
                raise ValueError("AI回复为空")

            input_msg = self.input_json['input_chat']
            self.saveAiChatLog(input_msg, 'user', 0)
        
            self.token_usage = AIMessageObj.response_metadata['token_usage']
            print('用户输入:',input_msg)
            
            # 添加消息到聊天历史
            self.save_chat_history_to_redis(chat_history)            
            self.saveAiReplyHistory()            
            return

        except Exception as e:            
            print(f"发生错误:{str(e)}")            
            raise ValueError(e)
        

上述代码的逻辑流程可以概括如下:

  1. 设置Prompt:首先,定义一个prompt,它是一个用于与AI模型交互的模板。这个模板包括系统消息、用户背景信息、一个占位符用于插入聊天历史,以及一个用于用户输入的占位符。

  2. 获取聊天历史:接着,通过get_chat_history_from_redis方法从Redis中检索用户的聊天历史。如果用户是第一次访问或者没有历史记录,就创建一个新的InMemoryChatMessageHistory实例。

  3. 调用对话模型:使用Langchain的RunnableWithMessageHistory包装器,结合定义好的prompt和用户的输入,调用智谱清言的对话模型(llMmodelInherit)。这个模型会根据提供的信息生成回复。

  4. 存储模型返回的消息:将AI模型返回的消息(AIMessageObj.content)处理后,存储到聊天历史中。这通常涉及到将消息添加到内存中的聊天历史对象,并同步更新到Redis数据库,以便持久化存储。

  5. 异常处理:在整个过程中,如果发生任何异常,代码会捕获这些异常,并记录错误信息。同时,会向飞书(Feishu)发送错误通知,以便开发者能够及时了解并处理问题。

  6. 返回结果:最后,处理完用户的消息并更新聊天历史后,代码会返回AI模型的响应,以便可以将其发送给用户。

这段代码的核心目的是实现一个具有记忆功能的聊天系统,它能够记住用户的历史对话,并在后续的交互中使用这些信息来提供更加个性化和连贯的回复。

以下是针对AI记忆的应用场景的详细解释:

  1. 医疗健康助手

    • 长期记忆跟踪:AI记忆系统能够长期存储患者的病史、用药计划和治疗进展。通过这种方式,AI助手可以提供个性化和连续的医疗建议,帮助医生和患者更好地管理健康。
    • 个性化和连续性:AI助手能够根据患者的病史和当前状况,提供针对性的建议。例如,提醒患者按时服药、预约检查或根据最新的医学研究调整治疗方案。
  2. 虚拟伴侣

    • 记住个人细节:AI伴侣能够记住用户的个人喜好、习惯和过去的对话内容。这种记忆能力使得AI能够提供更加个性化和有意义的交互体验。
    • 深层次关系:通过记住用户的喜好和习惯,AI伴侣能够提供更加贴心的服务,比如推荐音乐、电影或餐厅,甚至参与到用户的日常生活中,提供情感支持。
  3. 生产力工具

    • 记住用户习惯:AI工具能够学习并记住用户的工作习惯和常用文档,从而简化工作流程。
    • 提高效率:通过自动整理文档、提醒任务和预测用户需求,AI工具能够显著提高工作效率。例如,AI可以根据用户的工作模式,提前准备好所需的文件或数据,减少手动搜索和整理的时间。
  4. 客户支持AI代理

    • 保留交互信息:客户支持机器人能够记住与用户的 previous 交互信息,从而提供更准确和上下文感知的帮助。
    • 提高服务质量:通过记住用户的偏好和历史问题,AI代理能够更快地解决用户的问题,减少重复提问,提高客户满意度。
  5. 游戏AI NPC

    • 记住玩家选择:游戏中的AI NPC能够记住玩家的选择、策略和进度,从而动态适应游戏环境。
    • 沉浸式体验:通过记住玩家的行为,AI NPC能够提供更加真实和沉浸的游戏体验。例如,NPC可以根据玩家的行为调整对话内容,提供更加真实的互动。



还有,AI记忆库的后期画像如何定位在以下功能:

  1. 实时记录:软件可能会通过摄像头、麦克风或其他传感器实时捕捉用户的所见所闻。

  2. 活动追踪:软件可以追踪用户的位置、移动轨迹、步数等,通过GPS或其他定位技术。

  3. 事件标记:用户可以手动标记重要事件或由软件自动检测特定事件(如会议开始、电话呼叫等)。

  4. 语音到文本:软件可以将用户的对话或周围的声音转换成文本,方便日后检索。

  5. 情感分析:通过分析用户的语音语调、表情或文本内容,软件可能能够记录用户的情绪变化。

  6. 健康监测:如果集成了健康监测工具,软件还可以追踪用户的心率、睡眠质量等健康数据。

  7. 数据整理:软件会将收集的数据整理成易于理解的格式,如时间线、日记条目或摘要。

  8. 搜索和回顾:用户可以轻松搜索和回顾记录的内容,软件可能会提供基于时间、地点或事件的筛选功能。

  9. 智能提醒:软件可以根据记录的内容提供智能提醒,比如提醒用户重要的日程或回忆特殊的日子。

  10. 数据存储:软件需要有足够的存储空间来保存大量的数据,并且可能需要云同步功能以便在不同设备间访问。

这样的软件可以用于多种目的,比如提高个人生产力、帮助记忆、记录生活故事或用于健康监测。然而,它也引发了关于隐私、数据安全和用户习惯的伦理和实践问题。

说明实现的代码是作者【黑金】业务需求经过采坑已经实现的,不是网上抄袭的。感兴趣的朋友可以加微信来聊。

标签:AI,self,redis,用户,Langchain,记忆,chat,history
From: https://blog.csdn.net/ylong52/article/details/141499912

相关文章

  • 构建高效NLP管道:PydanticOutputParser与Langchain的结合
    PydanticOutputParser是一个用于解析语言模型输出的实用工具,它允许用户指定一个Pydantic模型,并查询语言模型以生成符合该模型的JSON输出。这个工具特别有用,因为它可以帮助开发者确保从语言模型获得的结构化数据符合预期的格式,从而简化了数据处理和集成的过程。使用Pyda......
  • Datawhale X 李宏毅苹果书 AI夏令营 Task1.2 笔记
    《深度学习详解》3.2节中关于批量和动量的主要内容总结: 批量的概念:在深度学习训练过程中,数据不是一次性全部用于计算梯度,而是被分成多个小批量(batch),每个批量包含一定数量的数据。每个批量的损失函数用于计算梯度并更新模型参数。批量大小对梯度下降法的影响:两种极端情况:......
  • Datawhale X 李宏毅苹果书 AI夏令营:task1通过案例了解机器学习
    隐藏任务:①:找出本篇中形如回归(regression)加粗字体的术语,并用自己的话进行解释,列成表格,与学习群的其他小伙伴讨论你的理解和搜索到的相关案例。②:整理出本篇中所有的公式,手动摘录,并尝试理解。③:找出机器学习找函数的3个步骤!并查找资料,交叉佐证这些步骤。④:归纳梯度下降的步骤。......
  • Datawhale X 李宏毅苹果书 AI夏令营(Task2)
     一、学前概览        任务内容:criticalpoint并不一定是训练神经网络遇到的最大的阻碍,还有一种叫AdaptiveLearningRate的技术。        任务目的:了解掌握LearningRate和分类损失的计算。        本节出现术语:自适应学习率(rootmeansquare、RM......
  • 【效率提升工具推荐】AI编程工具合集
    AI编程工具是指那些专门为开发和训练人工智能模型而设计的工具和框架。这些工具可以帮助开发者更高效地构建、训练和部署机器学习和深度学习模型。以下是一些常用的AI编程工具及其特点:1.TensorFlow简介:由Google开发,是最流行的开源机器学习框架之一。特点:支持广泛的机器学......
  • 设计模式Chain of Responsibility(责任链)
    ChainofResponsibility(责任链)模式是一种行为型设计模式,用于处理请求的多个处理者之间的职责分配。它允许请求沿着一条处理链传递,直到有一个处理者能够处理它为止。这种模式可以避免请求发送者和请求处理者之间的紧耦合关系。主要概念Handler(处理者):定义了处理请求的接口,并实现......
  • 云知声多模态模型:实时多模态输入输出;独立于 Siri ,苹果或开发新 AI 用于机器人丨 RTE
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • C# generate thumbnailimage via System.Drawing
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media.I......
  • Datawhale X 李宏毅苹果书(进阶) AI夏令营 task01笔记
    官方学习文档:https://linklearner.com/activity/16/14/42目录深度学习基础局部极小值与鞍点临界点及其种类判断临界值种类的方法逃离鞍点的方法批量和动量批量大小对梯度下降法的影响大的批量跟小的批量的对比        动量法深度学习基础       ......
  • wrapper chain
    芯片的规模大小决定了DFT的架构,对于小芯片而言,我们可以把一整个芯片独立测试,甚至都不需要对其内部的chain进行压缩,而对于大芯片而言,如果把一整个芯片当作测试对象,那么无论是对于工具开发商而言还是对于测试时间而言,都是一个巨大的挑战。甚至在很多时候,由于pad的限制,我们无法做......