跳至主要内容

博文

目前显示的是 八月, 2025的博文

LLM 应用的单元测试要点

  LLM 应用的单元测试要点 在 LLM 应用里,“对话变动大、输出不稳定、依赖外部服务”让单元测试比传统业务代码更棘手。核心是把“模型不确定性”与“业务逻辑确定性”解耦:对外用真实模型做集成/评测,对内用可控的 mock 做纯单元测试。 难点与解决思路 非确定性输出: 相同输入得到不同文本,难以断言结果。 解决: 抽象 LLM 接口并使用 mock ,对业务只断言“是否调用正确、是否走对分支、结构是否满足”,不要对真实语言内容做严格匹配。 提示词/链路易碎: Prompt 修改会击穿大量断言。 解决: 断言“包含关系/结构特征”而非完整字符串 ;对关键 prompt 片段做“黄金样本”回归测试,允许非关键部分漂移。 上下文与状态: 记忆、工具调用、RAG 依赖外部 IO。 解决: 边界外置 (向量检索、工具、存储均以接口注入),在单元测试中替换为纯内存和 mock。 流式与并发: Token 级别回调、取消、超时。 解决:为流式接口引入 回调/通道 ,在测试里用 可控的 fake 逐步推送 token,断言顺序、取消与资源回收。 评测与单测边界: 质量评测更像端到端测试或离线评估,而不是单元测试。 解决:把“是否答对/是否优于基线”放到 集成/评测 ,把“代码在给定条件下的行为”放到 单元 。 单元测试的实践策略 用接口隔离 LLM: 依赖 llms.Model (或等价)而非具体实现;在测试里注入 mock。 只测可控行为: 分支选择、参数传递、prompt 关键片段、错误传播与重试逻辑。 黄金样本回归: 对关键输出做少量 golden files(或字符串快照),配合 Review 审核变更。 流式测试: fake 模型分片发送 token,测试消费端时序、背压与取消。 并发与超时: 用 context.WithTimeout ,断言超时路径与资源释放。 RAG/工具 mock: 检索与函数调用以接口注入,测试中返回固定结果,覆盖“无结果/多结果/冲突结果”。 用 langchain-go 构建一个极简聊天机器人 下面示例基于 langchain-go( github.com/tmc/langchaingo ),构建一个无记忆的“简洁助理”聊天机器人。实际接入 OpenA...

大模型agent记忆方案有哪几种

 大模型 Agent 的 记忆(Memory)方案 ,按存储方式、时间跨度、结构化程度可以分成几类,通常会结合使用。大体可以分成以下几种主流思路: 1. 短期记忆(Short-term / Context Memory) 特点 :直接放在模型上下文(prompt)里,随每次请求发送。 优点 :读取快、无需额外存储。 缺点 :受限于模型上下文长度,成本随 token 增加。 常用方式 : 最近 N 条对话直接拼接到 Prompt 重要信息提炼成总结(Summary)再附加 Sliding Window(滑动窗口)策略 2. 长期记忆(Long-term Memory) 特点 :将过往信息存到外部存储,按需检索。 常见实现 : 向量数据库(Vector DB) 将历史对话/文档向量化(Embedding),用相似度搜索(如 cosine similarity)取回相关内容。 代表工具:Milvus、Weaviate、Pinecone、FAISS。 优点:语义检索,不依赖关键词;可扩展到百万级数据。 关键词索引(Keyword Index) 存储结构化信息,按关键词或标签匹配。 适合对高精确度、结构化查询有要求的场景。 混合索引(Hybrid Search) 语义检索 + BM25 等关键词检索混合,提高召回率。 3. 工作记忆(Working Memory) 特点 :专门存储当前任务的中间结果、计划、变量等,不与长期对话混合。 实现方式 : JSON 状态对象(State Store) 临时数据库或内存缓存(Redis) 文件缓存(JSON/YAML) 4. 结构化知识库(Structured Knowledge Base) 特点 :将 Agent 学到的事实或规则转化为结构化数据存储,方便精确调用。 实现 : Graph Database(Neo4j、ArangoDB)存实体与关系 SQL 数据库存事实表 用 Schema 存储技能(Skill)、工具(Tool)、知识点 5. 外部记忆插件(External Memory Plug...