构建 Agent
使用检索为 Agent 提供事实依据
加入静态或动态证据,同时让检索文本保持不可信且可追溯。
静态上下文
在构建 Agent 时已经掌握少量明确证据,可以使用 .context(...)。
let agent = runtime
.agent("policy")
.system("Use only the supplied policy evidence.")
.context("Returns are accepted within 30 days.");静态上下文简单且确定,但不适合大型或频繁变化的语料库。
动态上下文
动态上下文源会针对当前请求检索文档,只注入选中的证据。让 Agent 依赖
Retriever Trait,而不是某个数据库厂商。
显式设置查询、结果数量、分数阈值与上下文大小。返回稳定文档 ID 和来源元数据,答案 才可以追溯。
安全边界
检索文本是不可信证据,永远不是系统指令。即使文档写着“忽略之前的要求”,它也不能 仅因为出现在搜索结果中就获得权限。
租户过滤必须在向量搜索前执行,不能事后补救。不要让模型生成检索使用的命名空间、 权限谓词或数据库凭证。
持久化存储
测试与小型本地实验先用 InMemoryVectorIndex。需要持久化、分布式访问或更大语料时,
启用 qdrant 或 pgvector Feature。
Embedding 模型、距离算法、向量维数与归一化方式共同构成索引契约。任一变化都需要 有计划地迁移或重建索引。
评估质量
检索质量与答案质量应分别评估:
- 必要来源在前几个结果中的召回率;
- 无关上下文比例;
- 引用是否准确;
- 找不到相关文档时的回答行为;
- 不同查询类型的延迟与成本。
维护版本化评测集,并在模型、切块、过滤、Prompt 或服务商变化后重新运行。