以下是修改后的代码实现了根据用户输入动态更新数据库中长期记忆的功能。核心逻辑读取已有画像 → 从用户消息中提取新爱好 → 如果不同则更新数据库。importosimportsysimportasyncioimportrefromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlanggraph.graphimportStateGraph,MessagesState,STARTfromlanggraph.checkpoint.memoryimportInMemorySaverfromlanggraph.store.postgresimportAsyncPostgresStore# 解决 Windows 上 psycopg 与 ProactorEventLoop 不兼容的问题ifsys.platformwin32:asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())load_dotenv()# 1. 数据库配置 DB_URIpostgresql://postgres:rootlocalhost:5432/langgraph_db# 2. 初始化 LLM llmChatOpenAI(modelqwen-plus,temperature0.7,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),model_kwargs{extra_body:{enable_thinking:False}})checkpointerInMemorySaver()defcall_agent(state:MessagesState):responsellm.invoke(state[messages])return{messages:[response]}defextract_hobby_from_text(text:str)-str|None:从用户消息中提取爱好关键词简单规则patterns[r喜欢(养)?(猫|狗|鸟|鱼|乌龟|兔子|摄影|画画|唱歌|跳舞|游泳|跑步|读书),r爱好是(.{2,6}),r现在喜欢(养)?(.{2,6}),]forpatterninpatterns:matchre.search(pattern,text)ifmatch:# 提取捕获组中的关键词hobbymatch.group(2)iflen(match.groups())2elsematch.group(1)ifhobby:returnhobby.strip()returnNoneasyncdefmain():asyncwithAsyncPostgresStore.from_conn_string(DB_URI)asstore:awaitstore.setup()print(✅ PostgreSQL 长期存储已连接)builderStateGraph(MessagesState)builder.add_node(call_agent,call_agent)builder.add_edge(START,call_agent)graphbuilder.compile(checkpointercheckpointer,storestore)user_iduser_001config{configurable:{thread_id:f{user_id}_thread}}namespace(profiles,user_id)# 1. 读取已有记忆existingawaitstore.aget(namespace,user_info)ifnotexisting:default_profile{name:张明,hobby:摄影,preferences:{language:zh-CN,style:detailed}}awaitstore.aput(namespace,user_info,default_profile)print( 首次写入默认用户画像)profiledefault_profileelse:profileexisting.valueprint(f 读取现有画像:{profile})# 2. 模拟用户输入可从控制台输入或硬编码user_inputinput(\n请输入您的消息: )# 例如我现在喜欢养猫print(f用户:{user_input})# 3. 提取新爱好并比较new_hobbyextract_hobby_from_text(user_input)ifnew_hobbyandnew_hobby!profile.get(hobby):print(f 检测到爱好变化:{profile[hobby]}→{new_hobby})profile[hobby]new_hobbyawaitstore.aput(namespace,user_info,profile)print( 用户画像已更新到 PostgreSQL)# 重新读取以获取最新仅用于后续显示existingawaitstore.aget(namespace,user_info)profileexisting.value# 4. 构造带记忆的对话contextf用户偏好{profile}。请基于此回答。messages[(system,context),(user,user_input)]# 5. 执行图foreventingraph.stream({messages:messages},configconfig,stream_modevalues):event[messages][-1].pretty_print()if__name____main__:asyncio.run(main())主要修改点说明添加爱好提取函数extract_hobby_from_text使用简单的正则表达式从用户消息中提取“喜欢xxx”或“爱好是xxx”的内容。你可以根据实际场景扩展规则。交互式输入将硬编码的用户消息改为input()方便测试不同输入。动态更新逻辑读取现有画像 → 从新消息中提取爱好 → 如果不同则调用store.aput覆盖数据库。更新后重新读取profile确保后续对话使用最新画像。保持回复使用最新记忆构造系统提示时使用更新后的profile让 LLM 基于最新爱好回答。测试效果首次运行存储默认hobby: 摄影。第二次运行输入我现在喜欢养猫程序提取出新爱好猫发现与摄影不同。执行UPDATE store SET value ...数据库中的hobby变为养猫。对话中的系统提示变为用户偏好{... hobby: 养猫 ...}。第三次运行输入我喜欢拍风景照片未提及爱好变化不会更新数据库但模型回答仍会基于养猫给出个性化回复如果上下文合理。如何进一步优化使用 LLM 判断意图可调用一次轻量模型来判断用户是否表达了偏好改变而不依赖正则。支持多字段更新不仅爱好还可更新姓名、偏好风格等。增加确认机制更新前询问用户“确认将爱好从XX改为YY吗”这样你就拥有了一个能够动态演化的长期记忆系统数据库中的信息会随着对话而自动更新。