珠海网站建设熊掌号,中网-西安网站建设公司,wordpress远程图片本地化插件,视频网站怎么制作一、引言
1.1 当今AI的记忆幻觉
像 ChatGPT 或编码助手这样的工具一开始会让人觉得很有用#xff0c;但当你一遍又一遍地重复指令或偏好设置时#xff0c;就会发现它们有很多使用不便的地方。此时#xff0c;需要构建能够学习、进化和协作的智能体来扩展LLM能力#xff0c;…一、引言1.1 当今AI的记忆幻觉像 ChatGPT 或编码助手这样的工具一开始会让人觉得很有用但当你一遍又一遍地重复指令或偏好设置时就会发现它们有很多使用不便的地方。此时需要构建能够学习、进化和协作的智能体来扩展LLM能力对于智能体来说记忆至关重要。由上下文窗口和巧妙的提示设计所营造的记忆假象让许多人误以为智能体已经“记住”了信息。但实际上如今大多数智能体都是无状态的 它们既无法从过去的交互中学习也无法随时间推移而适应。要从无状态工具过渡到真正智能、自主 有状态 代理我们需要赋予它们记忆 而不仅仅是更大的提示或更好的检索。1.2 AI Agent中的“记忆”指的是什么对AI agents来说 记忆是指跨越时间、任务和多次用户交互来保留和回忆相关信息的能力。它使智能体能够记住过去发生的事情并利用这些信息来改进未来的行为。记忆并非仅仅用于存储聊天记录或向提示框中填充更多tokens它旨在构建一个持久的内部状态该状态会不断演进并影响智能体的每一次交互即使间隔数周或数月。智能体的记忆由三大支柱构成状态 了解当前正在发生的事情持久性 跨会话保留知识选择 决定哪些内容值得记住1.3 记忆如何融入AI Agent系统让我们把记忆融入到现代智能体的架构中常见的组件包括推理和答案生成的 LLM策略或规划工具 例如 ReAct、AutoGPT 等访问工具/API用于检索文档或历史数据的检索器问题在于 这些组件都不记得之前发生的事情没有内部状态没有持续迭代更新的理解能力也没有记忆。记忆在智能体系统的位置这使得智能体从一次性助手转变为持续发展的协作者。1.4 上下文窗口≠记忆一个常见的误解是长上下文窗口可以忽略对记忆的需求。然而使用长上下文的LLM会带来另一个问题更多token更高的成本和延迟。1.5 为什么 RAG 与记忆不同虽然 RAG检索增强生成和记忆系统都获取信息以支持 LLM但它们解决的问题截然不同。RAG 在推理时将外部知识加入到提示词有助于用文件事实为回答打基础。但 RAG 本质上是无状态的——它不了解之前的交互、用户身份或当前查询与过去对话的关联。而记忆则是连续性可以捕捉用户偏好、过去的查询、决策和失败并在未来的互动中提供这些信息。可以这样总结RAG 帮助智能体更好地回答。而记忆则帮助智能体行为更聪明。二、智能体中的记忆类型一般来说AI agents中的记忆有两种形式短期记忆 在单次互动中保持即时语境长期记忆 能够在跨会话、任务和时间保持记忆。就像人类一样这些记忆类型承担着不同的认知功能。短期记忆帮助智能体保持当下回话的连贯性。长期记忆帮助智能体保持持续学习、个性化和适应能力。简单总结短期记忆AI 在与你交谈时“记起”的内容。长期记忆AI 在多次对话后“学习和回忆”的内容。2.1 短期记忆或工作记忆人工智能系统中最基本的记忆形式是上下文窗口内容——就像一个人记住刚才对话中说过的内容。这包括对话历史最近消息及其顺序工作记忆临时变量与状态注意力语境当前对话的焦点2.2 长期记忆更复杂的人工智能应用需要长期记忆以在对话中保留信息。这包括如下几个方面2.2.1 程序内存它定义了你的智能体知道该做什么直接编码在你的代码里。这就是你的智能体的“ 肌肉记忆 ”——学会的行为自动形成的。就像你打字时不会有意识地去考虑每一次按键你的客服也会内化“始终优先处理关于 API 文档的邮件”或“回答技术问题时用更乐观的语气”等流程。2.2.2 情节记忆示例用户具体的过去互动和经历这会保持智能体能力的连续性、个性化和长期学习。这是智能体的“ 相册 ”——关于过去事件和互动的具体记忆。就像你可能记得听到重要消息时身处何地你的智能体也会记得“上次这位客户发邮件说延期截止日期时我的回复太僵硬造成了摩擦”或者“当邮件里有’快速提问’这个词时通常需要详细的技术解释但这些解释根本不够快速。”2.2.3 语义记忆事实通过向量搜索或 RAG 检索的事实世界知识。这是你的智能体的“ 百科全书 ”——它学到的关于你世界的事实。就像你知道巴黎是法国首都但不记得具体时间和方式一样你的智能体也会记得“Alice 是 API 文档的联系人”或“John 更喜欢早会”。三、记忆写入虽然人类常在睡眠中形成长期记忆但AI agents需要不同的方法。AI agents应该何时以及如何创造新的记忆AI agents至少有两种主要的记忆写入方法“前台实时写入”和“后台写入”。这两种方式的流程示意图如下所示四、增加短期记忆短期记忆线程级持久性使智能体能够跟踪多回合对话。下面是LangGraph短期记忆的示例from langchain.chat_models import init_chat_model from langgraph.graph import StateGraph, MessagesState, START from langgraph.checkpoint.memory import InMemorySaver model init_chat_model(modelanthropic:claude-3-5-haiku-latest) def call_model(state: MessagesState): response model.invoke(state[messages]) return {messages: response} builder StateGraph(MessagesState) builder.add_node(call_model) builder.add_edge(START, call_model) checkpointer InMemorySaver() graph builder.compile(checkpointercheckpointer) config { configurable: { thread_id: 1 } } for chunk in graph.stream( {messages: [{role: user, content: hi! Im bob}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print() for chunk in graph.stream( {messages: [{role: user, content: whats my name?}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print()输出如下所示 Human Message hi! Im bob Ai Message Hi Bob! How are you doing today? Is there anything I can help you with? Human Message whats my name? Ai Message Your name is Bob.4.1 生产环境在生产环境中通常需要使用一个数据库作为checkpointer下面我们将MongoDB 作为 checkpointer 进行演示。pip install -U pymongo langgraph langgraph-checkpoint-mongodbfrom langchain.chat_models import init_chat_model from langgraph.graph import StateGraph, MessagesState, START from langgraph.checkpoint.mongodb import MongoDBSaver model init_chat_model(modelanthropic:claude-3-5-haiku-latest) DB_URI localhost:27017 with MongoDBSaver.from_conn_string(DB_URI) as checkpointer: def call_model(state: MessagesState): response model.invoke(state[messages]) return {messages: response} builder StateGraph(MessagesState) builder.add_node(call_model) builder.add_edge(START, call_model) graph builder.compile(checkpointercheckpointer) config { configurable: { thread_id: 1 } } for chunk in graph.stream( {messages: [{role: user, content: hi! Im bob}]}, config, stream_modevalues ): chunk[messages][-1].pretty_print() for chunk in graph.stream( {messages: [{role: user, content: whats my name?}]}, config, stream_modevalues ): chunk[messages][-1].pretty_print()4.2 使用subgraphs如果你的图包含子图 编译父图时只需提供检查点LangGraph 会自动将checkpointer传播到子子图。from langgraph.graph import START, StateGraph from langgraph.checkpoint.memory import InMemorySaver from typing import TypedDict class State(TypedDict): foo: str # Subgraph def subgraph_node_1(state: State): return {foo: state[foo] bar} subgraph_builder StateGraph(State) subgraph_builder.add_node(subgraph_node_1) subgraph_builder.add_edge(START, subgraph_node_1) subgraph subgraph_builder.compile() # Parent graph def node_1(state: State): return {foo: hi! state[foo]} builder StateGraph(State) builder.add_node(node_1, subgraph) builder.add_edge(START, node_1) checkpointer InMemorySaver() graph builder.compile(checkpointercheckpointer)4.3 管理checkpointer可以查看并删除检查点存储的信息查看线程状态检查点config { configurable: { thread_id: 1, # optionally provide an ID for a specific checkpoint, # otherwise the latest checkpoint is shown # checkpoint_id: 1f029ca3-1f5b-6704-8004-820c16b69a5a } } graph.get_state(config)输出结果如下所示StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob), AIMessage(contentHi Bob! How are you doing today?), HumanMessage(contentwhats my name?), AIMessage(contentYour name is Bob.)]}, next(), config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-1f5b-6704-8004-820c16b69a5a}}, metadata{ source: loop, writes: {call_model: {messages: AIMessage(contentYour name is Bob.)}}, step: 4, parents: {}, thread_id: 1 }, created_at2025-05-05T16:01:24.68046200:00, parent_config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-1790-6b0a-8003-baf965b6a38f}}, tasks(), interrupts() )查看该线程的历史信息检查点config { configurable: { thread_id: 1 } } list(graph.get_state_history(config))输出结果如下所示[ StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob), AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?), HumanMessage(contentwhats my name?), AIMessage(contentYour name is Bob.)]}, next(), config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-1f5b-6704-8004-820c16b69a5a}}, metadata{source: loop, writes: {call_model: {messages: AIMessage(contentYour name is Bob.)}}, step: 4, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:24.68046200:00, parent_config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-1790-6b0a-8003-baf965b6a38f}}, tasks(), interrupts() ), StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob), AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?), HumanMessage(contentwhats my name?)]}, next(call_model,), config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-1790-6b0a-8003-baf965b6a38f}}, metadata{source: loop, writes: None, step: 3, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:23.86342100:00, parent_config{...} tasks(PregelTask(id8ab4155e-6b15-b885-9ce5-bed69a2c305c, namecall_model, path(__pregel_pull, call_model), errorNone, interrupts(), stateNone, result{messages: AIMessage(contentYour name is Bob.)}),), interrupts() ), StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob), AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?)]}, next(__start__,), config{...}, metadata{source: input, writes: {__start__: {messages: [{role: user, content: whats my name?}]}}, step: 2, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:23.86317300:00, parent_config{...} tasks(PregelTask(id24ba39d6-6db1-4c9b-f4c5-682aeaf38dcd, name__start__, path(__pregel_pull, __start__), errorNone, interrupts(), stateNone, result{messages: [{role: user, content: whats my name?}]}),), interrupts() ), StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob), AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?)]}, next(), config{...}, metadata{source: loop, writes: {call_model: {messages: AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?)}}, step: 1, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:23.86229500:00, parent_config{...} tasks(), interrupts() ), StateSnapshot( values{messages: [HumanMessage(contenthi! Im bob)]}, next(call_model,), config{...}, metadata{source: loop, writes: None, step: 0, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:22.27896000:00, parent_config{...} tasks(PregelTask(id8cbd75e0-3720-b056-04f7-71ac805140a0, namecall_model, path(__pregel_pull, call_model), errorNone, interrupts(), stateNone, result{messages: AIMessage(contentHi Bob! How are you doing today? Is there anything I can help you with?)}),), interrupts() ), StateSnapshot( values{messages: []}, next(__start__,), config{configurable: {thread_id: 1, checkpoint_ns: , checkpoint_id: 1f029ca3-0870-6ce2-bfff-1f3f14c3e565}}, metadata{source: input, writes: {__start__: {messages: [{role: user, content: hi! Im bob}]}}, step: -1, parents: {}, thread_id: 1}, created_at2025-05-05T16:01:22.27749700:00, parent_configNone, tasks(PregelTask(idd458367b-8265-812c-18e2-33001d199ce6, name__start__, path(__pregel_pull, __start__), errorNone, interrupts(), stateNone, result{messages: [{role: user, content: hi! Im bob}]}),), interrupts() ) ]删除该线程的所有检查点thread_id 1 checkpointer.delete_thread(thread_id)五、增加长期记忆使用长期记忆跨线程持久性来存储用户特定或应用特定的数据。这对像聊天机器人这样的应用非常有用因为你需要记住用户偏好或其他信息。 为了使用长期记忆我们在创建图时需要提供一个存储器 import uuid from typing_extensions import Annotated, TypedDict from langchain_core.runnables import RunnableConfig from langgraph.graph import StateGraph, MessagesState, START from langgraph.checkpoint.memory import InMemorySaver from langgraph.store.memory import InMemoryStore from langgraph.store.base import BaseStore model init_chat_model(modelanthropic:claude-3-5-haiku-latest) def call_model( state: MessagesState, config: RunnableConfig, *, store: BaseStore, ): user_id config[configurable][user_id] namespace (memories, user_id) memories store.search(namespace, querystr(state[messages][-1].content)) info \n.join([d.value[data] for d in memories]) system_msg fYou are a helpful assistant talking to the user. User info: {info} # Store new memories if the user asks the model to remember last_message state[messages][-1] if remember in last_message.content.lower(): memory User name is Bob store.put(namespace, str(uuid.uuid4()), {data: memory}) response model.invoke( [{role: system, content: system_msg}] state[messages] ) return {messages: response} builder StateGraph(MessagesState) builder.add_node(call_model) builder.add_edge(START, call_model) checkpointer InMemorySaver() store InMemoryStore() graph builder.compile( checkpointercheckpointer, storestore, )config { configurable: { thread_id: 1, user_id: 1, } } for chunk in graph.stream( {messages: [{role: user, content: Hi! Remember: my name is Bob}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print() config { configurable: { thread_id: 2, user_id: 1, } } for chunk in graph.stream( {messages: [{role: user, content: what is my name?}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print()输出结果如下所示 Human Message Hi! Remember: my name is Bob Ai Message Hi Bob! Ill remember that your name is Bob. How are you doing today? Human Message what is my name? Ai Message Your name is Bob.5.1 生产环境在生产环境中你需要使用一个数据库的checkpointer我们将使用 Postgres store进行演示 第一次使用 Postgres store时需要调用 store.setuppip install -U psycopg[binary,pool] langgraph langgraph-checkpoint-postgresfrom langchain_core.runnables import RunnableConfig from langchain.chat_models import init_chat_model from langgraph.graph import StateGraph, MessagesState, START from langgraph.checkpoint.postgres import PostgresSaver from langgraph.store.postgres import PostgresStore from langgraph.store.base import BaseStore model init_chat_model(modelanthropic:claude-3-5-haiku-latest) DB_URI postgresql://postgres:postgreslocalhost:5442/postgres?sslmodedisable with ( PostgresStore.from_conn_string(DB_URI) as store, PostgresSaver.from_conn_string(DB_URI) as checkpointer, ): # store.setup() # checkpointer.setup() def call_model( state: MessagesState, config: RunnableConfig, *, store: BaseStore, ): user_id config[configurable][user_id] namespace (memories, user_id) memories store.search(namespace, querystr(state[messages][-1].content)) info \n.join([d.value[data] for d in memories]) system_msg fYou are a helpful assistant talking to the user. User info: {info} # Store new memories if the user asks the model to remember last_message state[messages][-1] if remember in last_message.content.lower(): memory User name is Bob store.put(namespace, str(uuid.uuid4()), {data: memory}) response model.invoke( [{role: system, content: system_msg}] state[messages] ) return {messages: response} builder StateGraph(MessagesState) builder.add_node(call_model) builder.add_edge(START, call_model) graph builder.compile( checkpointercheckpointer, storestore, ) config { configurable: { thread_id: 1, user_id: 1, } } for chunk in graph.stream( {messages: [{role: user, content: Hi! Remember: my name is Bob}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print() config { configurable: { thread_id: 2, user_id: 1, } } for chunk in graph.stream( {messages: [{role: user, content: what is my name?}]}, config, stream_modevalues, ): chunk[messages][-1].pretty_print()5.2 语义搜索可以在图的记忆存储中启用语义搜索这可以让图智能体通过语义相似度搜索存储中的项。from typing import Optional from langchain.embeddings import init_embeddings from langchain.chat_models import init_chat_model from langgraph.store.base import BaseStore from langgraph.store.memory import InMemoryStore from langgraph.graph import START, MessagesState, StateGraph llm init_chat_model(openai:gpt-4o-mini) # Create store with semantic search enabled embeddings init_embeddings(openai:text-embedding-3-small) store InMemoryStore( index{ embed: embeddings, dims: 1536, } ) store.put((user_123, memories), 1, {text: I love pizza}) store.put((user_123, memories), 2, {text: I am a plumber}) def chat(state, *, store: BaseStore): # Search based on users last message items store.search( (user_123, memories), querystate[messages][-1].content, limit2 ) memories \n.join(item.value[text] for item in items) memories f## Memories of user\n{memories} if memories else response llm.invoke( [ {role: system, content: fYou are a helpful assistant.\n{memories}}, *state[messages], ] ) return {messages: [response]} builder StateGraph(MessagesState) builder.add_node(chat) builder.add_edge(START, chat) graph builder.compile(storestore) for message, metadata in graph.stream( input{messages: [{role: user, content: Im hungry}]}, stream_modemessages, ): print(message.content, end)在设计智能体时可以从以下角度考虑智能体应该学习什么类型的内容 事实/知识过去事件的总结规则和风格记忆应该在什么时候形成 以及由谁来形成记忆记忆应该存储在哪里 在提示词里语义存储。这在很大程度上决定了他们的召回方式。六、构建电子邮件智能体详细教程通过将这三种长期记忆类型交织在一起我们的智能体变得真正聪明且个性化。想象一下一位助理通知某客户的邮件如果24小时内未回复通常需要后续处理了解你的写作风格和语气调整正式回复以应对外部沟通调整轻松回复以适应团队成员能记住复杂的项目背景而无需你反复解释它更擅长预测你想看到哪些邮件哪些邮件会自动处理。工作流程如下所示START → Triage (Episodic Procedural Memory) → Decision → Response Agent (Semantic Procedural Memory) → END我正在运营“知识星球”在那里我会分享一些更前沿的技术和干货感兴趣的朋友可以加入一些经典的代码我也会放到那里感谢支持。最终实现的效果如下所示本示例完整的代码请参考https://t.zsxq.com/BnARP七、结论记忆是AI agents的基石使它们能够保留、回忆并适应信息。我们探讨了短期和长期记忆——程序性、情节性和语义性——如何融入AI agents堆栈超越了单纯的上下文窗口或 RAG。通过构建内存增强的电子邮件代理我们展示了这些概念的实际应用从状态管理到语义搜索和自适应指令。掌握内存赋能人工智能提供个性化、情境感知的解决方案为生产环境中更智能、更强大的系统铺平道路。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2025 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取