AI学习_06_短期记忆与长期记忆

短期记忆

  • 就是存储在内存当中的
python 复制代码
from langchain_community.chat_models import ChatOpenAI
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableLambda, RunnableWithMessageHistory

module = ChatOpenAI(
    model="deepseek-v4-flash",  # 也可以使用 "deepseek-coder" 专门处理代码任务
    openai_api_key='',  # DeepSeek 的 OpenAI 兼容接口地址
    openai_api_base="https://api.deepseek.com",  # DeepSeek 的 OpenAI 兼容接口地址
)

# first_template = PromptTemplate.from_template("")
template = ChatPromptTemplate([
    ("system", "请更具历史会话,来简单回答问题,历史如下:"),
    MessagesPlaceholder("chain_history"),
    ("user", "请回答如下问题:{input}"),
])


def print_prompt(prompt):
    print("=" * 20, prompt.to_string(), "=" * 20)
    return prompt


parser = StrOutputParser()

base_chain = template | print_prompt | module | parser

store = {}


def get_history_session(session_id):
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()

    return store[session_id]


history_chain = RunnableWithMessageHistory(base_chain, get_history_session, input_messages_key="input",
                                           history_messages_key="chain_history")

if __name__ == '__main__':
    config = {
        "configurable": {
            "session_id": "001",
        }
    }
    res = history_chain.invoke({"input": "小明有两只孔雀"}, config)
    print("第1次执行:", res)

    res = history_chain.invoke({"input": "小红有5只老虎"}, config)
    print("第2次执行:", res)

    res = history_chain.invoke({"input": "现在一共有多少宠物?"}, config)
    print("第3次执行:", res)

长期记忆

  • 把历史记录放在了文件当中
python 复制代码
import json
import os
from typing import Sequence

from langchain_community.chat_models import ChatOpenAI
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.messages import BaseMessage, messages_from_dict, message_to_dict
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory


class FileChatMessageHistory(BaseChatMessageHistory):
    def __init__(self, session_id, storage_path):
        self.session_id = session_id
        self.storage_path = storage_path

        self.file_path = os.path.join(storage_path, session_id)
        os.makedirs(os.path.dirname(self.file_path), exist_ok=True)

    @property
    def messages(self) -> list[BaseMessage]:
        try:
            with open(
                    os.path.join(self.storage_path, self.session_id),
                    "r",
                    encoding="utf-8",
            ) as f:
                messages_data = json.load(f)
            return messages_from_dict(messages_data)
        except FileNotFoundError:
            return []

    def add_messages(self, messages: Sequence[BaseMessage]) -> None:
        all_messages = list(self.messages)  # Existing messages
        all_messages.extend(messages)  # Add new messages

        serialized = [message_to_dict(message) for message in all_messages]
        file_path = os.path.join(self.storage_path, self.session_id)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump(serialized, f)

    def clear(self) -> None:
        file_path = os.path.join(self.storage_path, self.session_id)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump([], f)


module = ChatOpenAI(
    model="deepseek-v4-flash",  # 也可以使用 "deepseek-coder" 专门处理代码任务
    openai_api_key='',  # DeepSeek 的 OpenAI 兼容接口地址
    openai_api_base="https://api.deepseek.com",  # DeepSeek 的 OpenAI 兼容接口地址
)

# first_template = PromptTemplate.from_template("")
template = ChatPromptTemplate([
    ("system", "请更具历史会话,来简单回答问题,历史如下:"),
    MessagesPlaceholder("chain_history"),
    ("user", "请回答如下问题:{input}"),
])


def print_prompt(prompt):
    print("=" * 20, prompt.to_string(), "=" * 20)
    return prompt


parser = StrOutputParser()

base_chain = template | print_prompt | module | parser

store = {}


def get_history_session(session_id):
    return FileChatMessageHistory(session_id, storage_path='./history')


history_chain = RunnableWithMessageHistory(base_chain, get_history_session, input_messages_key="input",
                                           history_messages_key="chain_history")

if __name__ == '__main__':
    config = {
        "configurable": {
            "session_id": "001",
        }
    }
    res = history_chain.invoke({"input": "小明有两只孔雀"}, config)
    print("第1次执行:", res)

    res = history_chain.invoke({"input": "小红有5只老虎"}, config)
    print("第2次执行:", res)

    res = history_chain.invoke({"input": "现在一共有多少宠物?"}, config)
    print("第3次执行:", res)
相关推荐
Shell运维手记2 分钟前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
Vaxmzzy8 分钟前
AI直播浪潮下的行业重构:从“人海战术”到“智能基建”
人工智能·重构
朴马丁10 分钟前
国际与国产PLM在精细化工赛道的布局:2026年主要厂商技术特色
大数据·运维·人工智能·流程行业plm·化工新材料
狂奔蜗牛(bradley)29 分钟前
深度学习三大基础激活函数详解:Sigmoid、Tanh、ReLU 公式、导数、图像与优缺点对比
人工智能·深度学习
ctlover31 分钟前
Streamlit 框架
python
阿里云大数据AI技术32 分钟前
借助 EMR Serverless StarRocks 实现电商平台图搜图、文搜图场景
人工智能
不吃辣49042 分钟前
vibe coding | 如何做一个AI制图小程序?
人工智能·小程序·ai编程
ι:1 小时前
MATLAB 与 Python 搭建无人机地面站:优势、劣势与选型逻辑
python·matlab·无人机
船厂电气自动化ai大模型1 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing1 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习