ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LangGraph 长短期记忆示例跑通:Key 用 TaoToken

LangGraph 长短期记忆示例跑通:Key 用 TaoToken 1. LangGraph 记忆示例跑不通多半卡在模型通道LangGraph 的长短期记忆示例是很多人从「会写 Prompt」走向「会做 Agent」的第一道坎。短期记忆靠 checkpointer 把同一个 thread_id 的对话状态存下来长期记忆靠 store 把跨线程的用户信息持久化两者配合才能让 Agent 记住「你叫什么」「你上次订了哪家酒店」。但实际照着文档敲完代码最常见的报错不是 checkpointer 写错也不是 store 的 namespace 拼错而是init_chat_model里的模型通道根本没通——BASE_URL和TOKEN两处空着或者填了一个连不上的地址结果agent.invoke直接抛连接异常后面的记忆链路压根没机会验证。这篇就按「验证用量」这个视角来写先把模型通道用 TaoToken 打通再跑原文的 thread_id 短期记忆和跨线程长期记忆代码只要能正常返回「记住名字」和「跨线程读到 Ada」就说明 LangGraph 的模型调用走通了记忆链路本身也同时得到了验证。适合已经会写 Python、正在跟 LangGraph 官方示例、但被模型初始化卡住的同学。2. 前置准备TaoToken 的 Key 与 BASE_URL 怎么填LangGraph 本身不绑定任何模型厂商它通过init_chat_model走 OpenAI 兼容协议。所以只要有一个兼容 OpenAI 接口的通道填对三个值就能用BASE_URL、TOKEN、MODEL_NAME。我试过的方式是打开https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end注册账号然后在控制台创建一个 Key。创建入口在https://taotoken.net/consoleKey 管理页在https://taotoken.net/api-keys。拿到 Key 之后三个值这样填参数填什么说明BASE_URLhttps://taotoken.net/api注意结尾不要多加/v1init_chat_model会自己拼TOKEN你创建的 Key形如sk-开头的一串字符MODEL_NAME控制台里可用的模型名选一个你账号下能调用的即可注意BASE_URL和TOKEN这两处是原文示例里留空的地方也是绝大多数人跑不通的根因。填错地址会报连接超时填错 Key 会报 401两种报错长得不一样后面排障章节会分开讲。如果你只是想先验证模型能不能通可以顺手在https://taotoken.net/models的模型对话页里发一句话确认账号和 Key 是活的再回到代码里跑 LangGraph。这样能把「Key 本身有问题」和「LangGraph 代码有问题」两件事拆开。3. 可复制配置短期记忆 长期记忆完整代码下面这段是原文短期记忆示例的完整版只把BASE_URL、TOKEN、MODEL_NAME三处补上。依赖先装好pip install -U langgraph langchain langchain-openai短期记忆用InMemorySaver核心是thread_id相同就记得住换thread_id就忘掉from langchain.chat_models import init_chat_model from langgraph.checkpoint.memory import InMemorySaver from langgraph.prebuilt import create_react_agent BASE_URL https://taotoken.net/api TOKEN 你的Key MODEL_NAME 你的模型名 checkpointer InMemorySaver() model init_chat_model( modelMODEL_NAME, model_provideropenai, base_urlBASE_URL, api_keyTOKEN, temperature0, ) agent create_react_agent( modelmodel, tools[], checkpointercheckpointer, ) config {configurable: {thread_id: 1}} response agent.invoke( {messages: [{role: user, content: 你好我叫ada}]}, config, ) print(fthread1_bot_answer{response[messages][-1].content}) response agent.invoke( {messages: [{role: user, content: 你好请问你还记得我叫什么名字么}]}, config, ) print(------------线程1------------------) print(fthread1_bot_answer{response[messages][-1].content}) new_config {configurable: {thread_id: 2}} response agent.invoke( {messages: [{role: user, content: 你好请问你还记得我叫什么名字么}]}, new_config, ) print(------------线程2------------------) print(fthread2_bot_answer{response[messages][-1].content})长期记忆用InMemoryStore核心是store.put写、store.get读跨线程共享。下面这段把用户信息写进 store再在工具函数里读出来from langchain.chat_models import init_chat_model from langchain_core.runnables import RunnableConfig from langgraph.store.memory import InMemoryStore from langgraph.config import get_store from langgraph.prebuilt import create_react_agent BASE_URL https://taotoken.net/api TOKEN 你的Key MODEL_NAME 你的模型名 store InMemoryStore() model init_chat_model( modelMODEL_NAME, model_provideropenai, base_urlBASE_URL, api_keyTOKEN, temperature0, ) store.put( (users,), user_123, {name: ada, language: 中文}, ) def get_user_info(config: RunnableConfig) - str: 查找用户信息的函数可以查看长期记忆中存储的用户信息 store get_store() user_id config[configurable].get(user_id) user_info store.get((users,), user_id) return str(user_info.value) if user_info else Unknown user agent create_react_agent( modelmodel, tools[get_user_info], storestore, ) response agent.invoke( {messages: [{role: user, content: 帮我查找长期记忆中存储的用户信息}]}, config{configurable: {user_id: user_123}}, ) print(response[messages])两段代码的差别只在记忆载体短期记忆挂在checkpointer上靠thread_id区分长期记忆挂在store上靠namespace key区分。模型初始化部分完全一样所以只要第一段能跑通第二段的模型通道也一定是通的。4. 验证请求看到「记住名字」和「跨线程读到 Ada」才算过先跑短期记忆那段。预期输出分三块第一块是第一次对话Agent 回应你的自我介绍类似「你好Ada很高兴认识你」。第二块是同一个thread_id1下追问名字Agent 应该答出「当然记得你叫 Ada」。第三块是换到thread_id2再问名字Agent 应该答「我无法记住之前对话中的个人信息」之类——因为它确实没在这个线程里见过你。关键判断点线程 1 记得、线程 2 不记得说明 checkpointer 的短期记忆生效了。如果线程 1 也答不出名字那要么是thread_id没传对要么是模型通道没通导致第一次 invoke 就失败了。再跑长期记忆那段。预期输出里工具函数get_user_info被调用后返回的内容里应该能看到ada和中文。因为store.put是提前写好的store.get在工具里读出来模型只是负责把读到的内容组织成自然语言。判断点只要response[messages]里出现了ada就说明长期记忆的读写链路通了。如果工具没被调用或者调用后返回Unknown user那多半是user_id没对上——store.put用的 key 是user_123config里传的user_id也必须是user_123。提示想更直观地看用量可以在https://taotoken.net/console的用量页里对照每次 invoke 的调用记录。跑完上面两段应该能看到对应的请求条数这比只看终端输出更能确认「模型通道真的被调用了」。5. 本篇常见错排查5.1 报连接超时或 DNS 错误现象是agent.invoke直接抛ConnectionError或APIConnectionError。九成是BASE_URL写错了。正确值是https://taotoken.net/api不要写成https://taotoken.net/api/v1也不要漏掉https。init_chat_model内部会按 OpenAI 协议拼/chat/completions多写一层/v1会变成/v1/v1/chat/completions自然连不上。5.2 报 401 或 invalid api key现象是返回AuthenticationError。检查TOKEN是不是复制时带了空格或者 Key 已经被删除。可以到https://taotoken.net/api-keys重新生成一个粘贴时注意别把首尾空白带进去。另外确认api_keyTOKEN这个参数名没写错写成token或key都不会生效。5.3 报 model not found现象是返回NotFoundError或提示模型不存在。这是MODEL_NAME填了一个你账号下没有权限的模型。回到控制台确认可用模型列表换一个能调用的名字。注意模型名大小写敏感别自己加前缀。5.4 短期记忆不生效线程 1 也答不出名字如果模型通道是通的但线程 1 追问名字时 Agent 说不知道先检查config是不是每次 invoke 都传了同一个thread_id。create_react_agent的checkpointer参数必须传漏了它状态就不会被保存。另外InMemorySaver是进程内存储程序一退出就清空所以两次 invoke 必须在同一个进程里连续跑。5.5 长期记忆读到 Unknown userstore.get((users,), user_id)返回空说明 namespace 或 key 对不上。store.put的第一个参数是元组(users,)第二个是字符串 keystore.get必须用完全一样的元组和 key。常见错误是put用(users,)、get用(user,)差一个字母就查不到。5.6 工具函数没被调用如果response[messages]里只有普通回复、没有工具调用痕迹可能是模型没理解要调工具。可以在提问里写得更明确比如「请调用工具查找用户信息」。另外确认create_react_agent的tools[get_user_info]传了且函数有 docstring——ReAct 靠 docstring 判断工具用途。6. 把模型通道固定下来记忆链路才可复现跑通之后建议把BASE_URL、TOKEN、MODEL_NAME抽到环境变量里别硬编码在示例代码中import os from langchain.chat_models import init_chat_model model init_chat_model( modelos.environ[MODEL_NAME], model_provideropenai, base_urlos.environ[BASE_URL], api_keyos.environ[TOKEN], temperature0, )这样短期记忆和长期记忆两段代码可以共用同一个模型初始化片段换模型时只改环境变量不用动业务逻辑。如果你后面要长期跑编码类 Agent或者把 LangGraph 接进持续运行的流程可以看下https://taotoken.net/coding-plan的套餐说明只是想验证模型和记忆链路用https://taotoken.net/api-keys创建的 Key 就够了。接入细节和参数说明在https://taotoken.net/doc遇到报错先对照文档里的错误码表比盲猜快得多。
返回列表