内容参考于:图灵AI大模型全栈

我们的大模型都是没有记忆的,现在我们用的ai它只是在大模型的基础上进行了开发,把我们的聊天信息搞成了提示词,它分短期记忆和长期记忆,随着我们多轮的对话,提示词会非常大,提示词会爆,会非常销毁Token,现在的大模型都会有这个问题

短期记忆

一般记录十轮到三十轮左右的记录,如果超出了就提示网络不可用,或者说三十轮之前的聊天记录不要了

长期记忆

记录一百到二百轮,可以把聊天记录进行压缩,然后把聊天记录存储成知识库(RAG)

现在写的都是短期记忆,长期记忆后面再写

短期记忆LangChain给我们提供了ChatMessageHistory类

如下图内存存储

# 作用:导入聊天消息历史记录类,用于存储和管理对话消息
# 来源:langchain_community.chat_message_histories 社区库
# 入参:无
# 可传:无
# 值来源:固定导入
from langchain_community.chat_message_histories import ChatMessageHistory

# 作用:创建对话消息历史实例,用于存储用户+AI的所有消息
# 入参:无
# 可传:无
# 值来源:实例化对象
history = ChatMessageHistory()

# 作用:向消息历史中添加用户发送的消息
# 入参:字符串类型,用户发送的文本内容
# 可传:任意用户消息文本
# 值来源:自定义输入
history.add_user_message("hi!")

# 作用:向消息历史中添加用户发送的消息
# 入参:字符串类型,用户发送的文本内容
# 可传:任意用户消息文本
# 值来源:自定义输入
history.add_user_message("你好")

# 作用:向消息历史中添加AI回复的消息
# 入参:字符串类型,AI回复的文本内容
# 可传:任意AI回复文本
# 值来源:自定义输入
history.add_ai_message("whats up?")

# 作用:打印消息历史中的所有消息列表
# 入参:history.messages 消息列表
# 可传:消息历史对象的messages属性
# 值来源:存储的所有对话消息
print(history.messages)

记忆

import json
# 作用:带记忆的对话链 | 来源:langchain_core
from langchain_core.runnables.history import RunnableWithMessageHistory
# 作用:内存对话历史存储 | 来源:langchain_community
from langchain_community.chat_message_histories import ChatMessageHistory
# 作用:提示模板+历史占位符 | 来源:langchain_core
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 作用:大模型调用 | 来源:langchain_openai
from langchain_openai import ChatOpenAI
# 作用:消息与字典互转 | 来源:langchain_core
from langchain_core.messages import messages_from_dict, messages_to_dict
# 作用:加载环境变量 | 来源:python-dotenv
from dotenv import load_dotenv
# 作用:系统环境操作 | 来源:Python内置
import os

# 作用:加载.env配置 | 入参:无 | 可传:无 | 来源:固定调用
load_dotenv()

# 作用:初始化通义千问大模型
# api_key:密钥 | 入参:字符串 | 可传:阿里云API Key | 来源:.env
# base_url:接口地址 | 入参:字符串 | 可传:官方地址 | 来源:阿里云
# model:模型名 | 入参:字符串 | 可传:qwen系列 | 来源:官方
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen-plus"
)

# 作用:创建对话提示模板
# system:系统设定 | 入参:字符串 | 可传:自定义角色 | 来源:自定义
# MessagesPlaceholder:历史占位符 | 入参:变量名 | 可传:history | 来源:固定
# user:用户输入 | 入参:变量 | 可传:input | 来源:固定
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个友好的助手"),
MessagesPlaceholder(variable_name="history"),
("user", "{input}")
])

# 作用:基础对话链 | 入参:提示词+模型 | 可传:自定义 | 来源:上方变量
base_chain = prompt | llm

# 作用:全局存储会话历史 | 入参:无 | 可传:无 | 来源:内存存储
store = {}

# 作用:获取/创建会话历史
# 入参:session_id 会话ID
# 可传:任意字符串ID
# 来源:函数调用
def get_session_history(session_id):
if session_id not in store:
   store[session_id] = ChatMessageHistory()
return store[session_id]

# 作用:创建带记忆的对话链
# base_chain:基础链 | 来源:上方变量
# get_session_history:历史函数 | 来源:上方函数
# input_messages_key:输入键 | 来源:固定input
# history_messages_key:历史键 | 来源:固定history
conversation = RunnableWithMessageHistory(
base_chain,
get_session_history=get_session_history,
input_messages_key="input",
history_messages_key="history"
)

# 作用:旧版预测接口
# 入参:input_text用户输入,session_id会话ID
# 可传:任意文本、任意ID
# 来源:调用传入
def legacy_predict(input_text: str, session_id: str = "default") -> str:
return conversation.invoke(
   {"input": input_text},
   config={"configurable": {"session_id": session_id}}
).content

# 作用:保存历史到文件
# 入参:filepath路径,session_id会话ID
# 可传:json路径、任意ID
# 来源:调用传入
def save_memory(filepath, session_id):
history = get_session_history(session_id)
dicts = messages_to_dict(history.messages)
with open(filepath, "w", encoding='utf-8') as f:
   json.dump(dicts, f, ensure_ascii=False)

# 作用:从文件加载历史
# 入参:filepath路径,session_id会话ID
# 可传:json路径、任意ID
# 来源:调用传入
def load_memory(filepath, session_id):
with open(filepath, "r", encoding='utf-8') as f:
   dicts = json.load(f)
messages = messages_from_dict(dicts)
store[session_id] = ChatMessageHistory(messages=messages)

# 作用:主程序测试
if __name__ == "__main__":
# 作用:会话ID | 入参:字符串 | 可传:任意 | 来源:自定义
SESSION_ID = "default"

# 作用:连续对话测试
print("============================")
print(legacy_predict("你好,我是计算机王", SESSION_ID))
print("============================")
print(legacy_predict("你是谁", SESSION_ID))
print("============================")
print(legacy_predict("我叫什么名字", SESSION_ID))

# 作用:保存对话历史
save_memory("./memory_new.json", SESSION_ID)
# 作用:加载历史记录
# load_memory("./memory_new.json", SESSION_ID)
# 作用:验证历史恢复
# reload_response = legacy_predict("我回来了,我们之前都聊了一些什么?", SESSION_ID)
# print("\n恢复后的回答:", reload_response)

LangSmith是一个用来构建、监控和调试大模型的平台,由LangChain提供,LangSmith可以本地部署

首先注册LangSmith账号

LangSmith官网: https://smith.langchain.com/

如下图登录之后,可能会是下图的页面

需要再次访问LangSmith,就会来到下图的页面

然后点击下图红框的设置

然后点击下图红框创建一个API秘钥

然后在.env文件中写下图红框的内容,写完之后就可以了,直接运行LangChain的代码就可以了

LANGSMITH_API_KEY = "这里替换成上方申请的api密钥"
LANGCHAIN_TRACING_V2="true"
LANGCHAIN_PROJECT="在Langsmith存储的名称"
LANGCHAIN_ENDPOINT="https://api.smith.langchain.com" # 任务发布站点

然后再次运行上方记忆的代码,如下图,点击下图红框

然后就可以看我们的内容了

如下图,一个简单的LangSmith测试代码

如下图红框是代码调用的核心函数

下图红框是入参和出参信息

如下图红框调用OpenAi的入参和出参,也就是给大模型的提示词和大模型给我的答案

点击下图红框

可以手动调整提示词

如下图红框改成了生成300到550字

点击下图红框可以修改模型

点击下图红框

输入在大模型平台申请的apiKey

点击下图红框运行

运行之后

from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()

import os




# 定义小红书文案提示词
prompt = PromptTemplate.from_template("""
你是一位小红书内容创作者,擅长撰写简洁、吸引人的种草文案。目标是创作100-150字的小红书风格文案,面向18-35岁用户,激发兴趣和互动。

**输入**:
- 产品/主题:{product}
- 核心特点:{features}
- 目标情绪:{emotion}
- 目标行动:{action}

**要求**:
1. 风格:亲切、口语化,带小幽默或生活场景,融入“种草”“安利”等流行词。
2. 结构:吸睛开头(问题/场景),中间突出特点,结尾引导互动(提问/号召)。
3. 使用1-2个emoji,保持自然。
4. 标题:10字以内。

**输出**:
标题:
文案正文:分2-3段,每段2-3句,结尾带互动引导
""")

llm = ChatOpenAI(
  api_key=os.getenv("DASHSCOPE_API_KEY"),  # 从环境变量读取API密钥
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 阿里云兼容端点
  model="qwen-plus"  # 使用qwen-turbo模型
)
# 创建 LangChain 链
chain = prompt | llm

# 输入示例
input_data = {
  "product": "无线耳机",
  "features": "音质清晰、佩戴舒适、续航长",
  "emotion": "科技感、轻松",
  "action": "分享体验"
}
response = chain.invoke(input_data)
# 输出生成的小红书文案
print(response.content)

点击下图红框可以保存提示词

输入一个名字,然后点击Save保存

在下图红框位置就可以选择保存过的提示词

在代码中也可以使用,如下图效果图

from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
from langsmith import Client

import os

client = Client(api_key=os.getenv("LANGSMITH_API_KEY"))
prompt = client.pull_prompt("tttt")

print(prompt)
llm = ChatOpenAI(
   api_key=os.getenv("DASHSCOPE_API_KEY"),  # 从环境变量读取API密钥
   base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 阿里云兼容端点
   model="qwen-plus"  # 使用qwen-turbo模型
)

# 创建 LangChain 链
chain = prompt | llm

# 输入示例
input_data = {
   "product": "无线耳机",
   "features": "音质清晰、佩戴舒适、续航长",
   "emotion": "科技感、轻松",
   "action": "分享体验"
}

response = chain.invoke(input_data)

# 输出生成的小红书文案
print(response.content)


img

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐