新闻详情

新闻详情

首页 / 资讯中心 / 详情

langchaingo 实战:用 Zep 长期记忆 + OpenAI 构建带上下文的 Go 对话链

发布时间:2026/9/16 14:54:49来源:尧图网络
langchaingo 实战:用 Zep 长期记忆 + OpenAI 构建带上下文的 Go 对话链
langchaingo 实战用 Zep 长期记忆 OpenAI 构建带上下文的 Go 对话链【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo导读本篇基于仓库中的官方示例 zep-memory-chain-example完整讲解如何在 Go 项目中组合Zep 记忆服务、OpenAI 语言模型与langchaingo 的 Conversation 链实现一个能跨会话记住用户信息的对话式 AI。读完本文你将掌握Zep 记忆的初始化方式、chains.NewConversation的组装方法、Zep 记忆的全部可配置选项及其默认值以及消息在 langchaingo 与 Zep 之间的存取与角色转换原理。一、示例解决什么问题常规的 LLM 对话是无状态的每次请求独立模型不记得上一轮说过什么。要让 AI 在对话中记住用户的名字、偏好等上下文就必须引入**记忆Memory**组件。本示例演示的是三种技术的组合组件作用Zep外部长期记忆服务负责跨会话存储、总结对话并提取对话事实FactsOpenAI对话生成模型负责根据历史 当前输入产出回答langchaingoGo 侧的编排层通过chains.NewConversation把 LLM 与记忆绑定成一条对话链与 langchaingo 内置的 ConversationBuffer仅保存在进程内存、会话结束即丢失不同Zep 记忆把历史消息持久化到 Zep 服务端并以Perpetual永久记忆类型维护长期上下文同时还返回对话摘要与事实Facts作为系统提示注入模型。二、运行前提与环境变量运行示例前需要准备三个环境变量变量用途说明ZEP_API_KEYZep API 密钥创建 Zep 客户端时使用见 main.goZEP_SESSION_ID会话标识同一会话 ID 对应同一段记忆历史跨请求共享上下文OPENAI_API_KEYOpenAI API 密钥由openai.New()自动读取OpenAI 客户端要求示例的依赖声明在 go.mod 中github.com/getzep/zep-go v1.0.4Zep 官方 Go SDK提供客户端与类型定义github.com/tmc/langchaingo v0.1.14-pre.4langchaingo 本体。在设置了上述环境变量后进入示例目录直接运行go run main.go三、代码逐段拆解从客户端到对话链示例的完整实现位于 main.go核心流程可以划分为四步。3.1 初始化 Zep 客户端与会话 IDctx : context.Background() client : zepClient.NewClient(zepOption.WithAPIKey(os.Getenv(ZEP_API_KEY))) sessionID : os.Getenv(ZEP_SESSION_ID)zepClient.NewClient是 zep-go SDK 提供的构造入口通过WithAPIKey传入密钥sessionID直接取自环境变量。后续所有记忆读写都通过该客户端、以会话 ID 为键执行。3.2 创建 OpenAI 语言模型llm, err : openai.New() if err ! nil { fmt.Printf(Error: %s\n, err) }openai.New()不带任何参数即可创建默认 OpenAI 客户端自动读取OPENAI_API_KEY。示例采用打印错误并继续的宽松处理方式生产代码建议直接panic或返回错误。3.3 组装带 Zep 记忆的对话链这是全示例的核心c : chains.NewConversation( llm, zepLangchainMemory.NewMemory( client, sessionID, zepLangchainMemory.WithMemoryType(zep.MemoryGetRequestMemoryTypePerpetual), zepLangchainMemory.WithReturnMessages(true), zepLangchainMemory.WithAIPrefix(Robot), zepLangchainMemory.WithHumanPrefix(Joe), ), )chains.NewConversation定义见 conversation.go接收一个llms.Model和一个schema.Memory内部使用一段固定的对话模板The following is a friendly conversation between a human and an AI. ... Current conversation: {{.history}} Human: {{.input}} AI:模板中的{{.history}}变量就由记忆组件动态填充——这正是NewMemory被传入链中的原因。zepLangchainMemory.NewMemory的第一个参数是 Zep 客户端第二个是会话 ID之后的MemoryOption依次配置了记忆类型、返回格式和角色前缀。3.4 连续两轮对话验证记忆res, err : chains.Run(ctx, c, Hi! Im John Doe) if err ! nil { fmt.Printf(Error: %s\n, err) } fmt.Printf(Response: %s\n, res) res, err chains.Run(ctx, c, What is my name?) if err ! nil { fmt.Printf(Error: %s\n, err) } fmt.Printf(Response: %s\n, res)第一轮输入自我介绍我是 John Doe第二轮询问我叫什么名字。如果记忆链路正常工作第二轮模型应能引用第一轮的信息准确回答。四、Zep 记忆的配置选项与默认值NewMemory的完整签名是NewMemory(client *zepClient.Client, sessionID string, options ...MemoryOption) *Memory见 zep_memory.go。所有选项定义在 zep_memory_options.go其默认值在applyZepMemoryOptions中统一设定选项默认值说明WithMemoryTypePerpetual永久记忆指定 Zep 记忆类型如MemoryGetRequestMemoryTypePerpetual、MemoryGetRequestMemoryTypeSummaryRetrieverWithReturnMessagestrue为 true 时记忆变量是[]schema.ChatMessage消息切片为 false 时是拼好的 buffer 字符串WithHumanPrefixHuman人类消息前缀同时作为写入 Zep 时的消息 role 传入WithAIPrefixAIAI 消息前缀同样会写入 Zep 的 role 字段WithMemoryKeyhistory记忆变量在链中的键名对应对话模板里的{{.history}}WithInputKey/WithOutputKey保存上下文时定位输入/输出值的键为空时要求输入/输出 map 中只有一个键从源码结构看NewMemory内部会基于同样的记忆类型与前缀自动构造一个NewZepChatMessageHistory实例作为底层历史存储zep_memory.go。也就是说Memory与ChatMessageHistory共享同一套MemoryType、HumanPrefix、AIPrefix配置。示例中用WithAIPrefix(Robot)和WithHumanPrefix(Joe)把对话双方人格化为 Robot 与 Joe——这些前缀不仅出现在返回的缓冲字符串中还会作为 role 传给 Zep 服务端存储。五、底层原理消息如何读写 Zep5.1 读取记忆注入事实与摘要Memory.LoadMemoryVariableszep_memory.go会调用ChatHistory.Messages后者是 Zep 集成的精髓所在zep_chat_history.go调用ZepClient.Memory.Get(ctx, sessionID, zep.MemoryGetRequest{...})拉取该会话的完整记忆将 Zep 消息转换为 langchaingo 的llms.ChatMessage把记忆中的Facts对话事实逐条拼进系统提示内容若存在摘要memory.Summary继续追加摘要内容最终将拼接好的系统消息插到消息列表最前面再返回。这意味着模型每轮不仅能读到历史消息还能额外看到Zep 提炼出的用户事实与对话摘要——这就是Perpetual记忆能跨会话保持长期上下文的关键机制。5.2 写入记忆角色映射SaveContextzep_memory.go把用户输入与 AI 输出分别通过AddUserMessage/AddAIMessage写入历史ChatMessageHistory的messagesToZepMessages负责角色转换zep_chat_history.golangchaingo 消息类型Zep 角色类型RoleType备注HumanChatMessageRoleTypeUserRole若配置了 HumanPrefix 则同时写入自定义 roleAIChatMessageRoleTypeAssistantRole同上写入 AIPrefixFunctionChatMessageRoleTypeFunctionRole—ToolChatMessageRoleTypeToolRole—反向读取时messagesFromZepMessageszep_chat_history.go执行同样的映射user 转为HumanChatMessage、assistant 转为AIChatMessage、tool/function 转为ToolChatMessage未知角色则打印日志并跳过。5.3 清空记忆Memory.Clear与ChatMessageHistory.Clear都会调用ZepClient.Memory.Delete(ctx, sessionID)zep_chat_history.go从服务端删除该会话的全部记忆——适合开始新会话前重置上下文的场景。六、测试佐证默认值与行为验证仓库为 Zep 集成提供了较完整的单元测试 zep_test.go可用来印证上述结论TestNewMemory验证NewMemory的默认值MemoryKey history、HumanPrefix Human、AIPrefix AI、ReturnMessages trueTestNewMemoryWithOptions验证每个选项都能覆盖默认值含SummaryRetriever记忆类型TestLoadMemoryVariablesBufferString验证ReturnMessagesfalse时两条消息会被拼成Human: Hello\nAI: Hi there形式的缓冲字符串TestMessagesToZepMessages/TestMessagesFromZepMessages验证双向角色映射包括自定义前缀User、Bot会正确写入 Zep 的 role 字段TestSaveContext覆盖了基本保存、自定义 InputKey/OutputKey、缺失键报错、写入失败传播等路径。测试中使用了MockZepClient与MockMemoryService隔离外部依赖感兴趣的读者可以据此了解如何为自己的集成代码编写可测试的记忆层。七、运行结果与验证要点正常运行时程序会依次输出两轮响应。验证记忆是否生效的关键在第二轮成功场景第二轮回答应体现对 John Doe 的记忆例如直接报出名字失败排查若第二轮回答不知道按以下顺序排查ZEP_API_KEY/ZEP_SESSION_ID是否正确设置Zep 服务是否可达两次chains.Run是否使用了同一个c同一个Memory实例、同一个 session ID——更换会话 ID 或重建链都会导致历史丢失观察输出是否有Error:前缀示例中错误只被打印但不会中断程序。八、扩展建议切换记忆类型把WithMemoryType(zep.MemoryGetRequestMemoryTypeSummaryRetriever)换成摘要检索式记忆适合超长会话场景让模型基于摘要而非全文作答返回缓冲字符串若下游提示模板期望纯文本历史可用WithReturnMessages(false)langchaingo 会自动用HumanPrefix/AIPrefix拼出缓冲串自定义记忆键通过WithMemoryKey改变模板变量名需要同步调整使用该键的提示模板多用户隔离每个用户/会话使用独立ZEP_SESSION_ID即可天然实现数据隔离无需维护多份内存。总而言之langchaingo 的memory/zep包让 Go 开发者可以用几行代码把 Zep 的永久记忆能力接入任何chains链实现真正的过目不忘式对话应用。完整的可运行代码见 examples/zep-memory-chain-example记忆包实现见 memory/zep。【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于Matlab的高斯随机粗糙面生成:频域滤波法与参数验证 2026/9/16 15:37:09

基于Matlab的高斯随机粗糙面生成:频域滤波法与参数验证

简介:面向MATLAB随机粗糙面建模需求,该源码包提供高斯随机粗糙面生成函数,只需输入点数、长度、相关长度、均方根高度,即可获得符合统计分布的粗糙面数据。四个参数分别控制生成面型的规模尺寸、横向相关特性与起伏程度&#xff0…

阅读更多 →
Flask二手交易平台源码解析:从数据库设计到部署加固 2026/9/16 15:37:09

Flask二手交易平台源码解析:从数据库设计到部署加固

简介:一份完整的基于Flask的二手物品交易平台项目资料,面向Web开发学习者与有课程设计、毕业设计需求的学生,提供源码、数据库脚本、说明文档及视频演示。项目围绕二手交易场景,实现了用户注册登录、物品发布、搜索筛选、交易管理…

阅读更多 →
2026最权威AI论文写作软件排名:这些被高校和导师悄悄推荐的工具你还不知道? 2026/9/16 15:37:09

2026最权威AI论文写作软件排名:这些被高校和导师悄悄推荐的工具你还不知道?

AI论文写作软件已全面升级为学术研究的得力助手。依托中国信息通信研究院、教育部科技发展中心、知网AIGC检测报告及多所高校师生的实际使用反馈,这些工具在提升效率、保障合规性方面展现出显著优势。本文将盘点2026年最受高校和导师推荐的AI论文写作软件&#xff0…

阅读更多 →
OpenProject 6.0.3 安全维护版本发布:Rails 4.2.7.1 升级与关键缺陷修复深度解析 2026/9/16 15:37:09

OpenProject 6.0.3 安全维护版本发布:Rails 4.2.7.1 升级与关键缺陷修复深度解析

OpenProject 6.0.3 安全维护版本发布:Rails 4.2.7.1 升级与关键缺陷修复深度解析 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative…

阅读更多 →
Django构建高校慕课学习行为分析系统 2026/9/16 15:37:09

Django构建高校慕课学习行为分析系统

简介:本资源是一个基于Django开发的线上课程推荐数据分析系统,面向Python与Web开发初学者及毕业设计、课程设计学习者,聚焦教育平台课程数据的可视化分析与属性管理,解决教学类项目中缺乏BI式交互分析能力的问题。压缩包共252个文…

阅读更多 →
基于微信官方API的Python公众号数据分析系统 2026/9/16 15:33:59

基于微信官方API的Python公众号数据分析系统

简介:本资源是一个面向Python开发者与数据分析师的微信公众号数据分析系统源码包,聚焦新媒体运营数据采集与统计分析场景,解决公众号内容效果评估、竞品对比及粉丝规模预估等实际问题。压缩包共1055个文件,主体为1032个Java class…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞