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)
相关推荐
玉鸯10 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_4462608511 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
a11177611 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
计算机魔术师11 小时前
Karpathy:用语音与LLM长谈可提升理解效率
人工智能·ai编程
我的xiaodoujiao11 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
qetfw11 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
甲维斯11 小时前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
周末程序猿11 小时前
图解 120 个大语言模型(LLM)核心概念(61-90)
人工智能
科技圈快迅11 小时前
游戏投影仪和普通投影仪区别是什么?2026游戏投影仪测评
人工智能