ARTICLE DETAIL

资讯详情

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

用 Go 与 ADK 构建 LLM Auditor:面向 LLM 输出的自动化事实核查多智能体实战

用 Go 与 ADK 构建 LLM Auditor:面向 LLM 输出的自动化事实核查多智能体实战 用 Go 与 ADK 构建 LLM Auditor面向 LLM 输出的自动化事实核查多智能体实战【免费下载链接】adk-samplesA collection of sample agents built with Agent Development Kit (ADK)项目地址: https://gitcode.com/GitHub_Trending/ad/adk-samplesLLM AuditorGo 版是 Agent Development KitADK官方示例仓库中的一个多智能体示例它作为一层自动事实核查fact-checking机制专门用于评估并增强大语言模型LLM生成内容的事实依据factual grounding。它通过从回答文本中识别可验证的声明claim、利用网络搜索与模型自身知识判定其准确性、输出详细的核查报告并可选地重写原文以修正错误从而提升 LLM 输出的可靠性。读完本文你将掌握这套审稿人critic 修订者reviser双智能体顺序工作流的完整架构、提示词设计、环境配置与本地运行方法并能够基于源码理解其底层实现为构建自己的事实核查类 Agent 提供可直接复用的范式。LLM Auditor 是什么在 go/agents/llm-auditor/README.md 中该项目被明确定义为一个用于评估并改进 LLM 生成回答的事实依据的 Agent其核心定位是充当自动事实核查层通过将 LLM 答案与现实世界信息进行比对来提升可靠性。它具备以下四个核心能力识别并抽取 LLM 生成文本中具体、可验证的陈述verifiable statements借助网络搜索工具web search及模型自身训练所获得的知识判定各声明的准确性产出一份清晰的核查清单列出被识别的声明及其验证状态verification status基于核查结论可选地重写原始回答以纠正发现的不准确之处。整体使用流程是用户向 LLM 提问 → Agent 对答案进行审计 → 抽取声明 → 调用搜索工具验证 → 生成审计报告 → 可选地重写回答。这套流程让先输出、后核查成为可能是缓解 LLM 幻觉问题的一种务实工程手段。Agent 关键特性特性说明交互类型Interaction TypeWorkflow工作流复杂度ComplexityEasy简单Agent 类型Agent TypeMulti Agent多智能体组件Components工具内置 Google SearchGoogle 搜索领域VerticalHorizontal横向通用架构设计顺序执行的双智能体工作流从源码结构看整个 Agent 由三个核心 Go 包组成cmd/main.go、auditor/auditor.go、critic/critic.go、reviser/reviser.go其架构如下图所示根智能体顺序编排器在 auditor/auditor.go 中GetLLmAuditorAgent函数完成了整套工作流的组装首先通过gemini.NewModel(ctx, gemini-2.5-flash, genai.ClientConfig{})创建一个基于gemini-2.5-flash的模型实例该模型会同时被两个子智能体复用然后分别构造criticAgent审稿人与reviserAgent修订者最后通过 ADK 的sequentialagent.New创建根智能体llm_auditor将两个子智能体挂载为SubAgents并声明其描述为 Evaluates LLM-generated answers.。这里的关键在于使用了 ADK 的SequentialAgent顺序智能体子智能体按声明顺序依次执行前一个的输出会作为后一个的输入这与先核查、后修订的任务语义天然匹配。根智能体的名称llm_auditor也正是后续 Web 界面下拉菜单中需要选择的 Agent 名称。入口拉起本地 Web 服务cmd/main.go 是程序入口它展示了 ADK Go 版本拉起 Agent 服务的标准姿势通过session.InMemoryService()与artifact.InMemoryService()创建基于内存的会话与工件服务这意味着数据不持久化进程重启即清空使用services.NewStaticAgentLoader注册静态 Agent 加载器将llm_auditor映射到根智能体调用web.Serve启动本地 Web 服务器并注入会话服务、Agent 加载器与工件服务。因此执行go run ./cmd后终端会打印一个本地 URL浏览器打开后即可在左上角下拉菜单选择llm_auditor开始对话。审稿人critic_agent三步核查法critic 是整个工作流的质检第一关其提示词定义在 critic/critic.go 的CriticPrompt常量中。它被设定为一家高可信度出版物的调查记者任务被拆解为三个明确步骤Step 1识别声明Identify the CLAIMS—— 仔细阅读回答文本抽取其中每一个独立声明。声明可以是关于世界的事实陈述也可以是支撑某一观点的逻辑论证。Step 2逐一验证Verify each CLAIM—— 对每个声明执行以下动作考虑上下文结合原始问题与回答中其他已识别的声明咨询外部来源使用自身知识或网络搜索寻找支持或反驳该声明的证据并尽量引用可靠权威来源判定结论VERDICT为声明分配以下五种判定之一判定Verdict含义Accurate声明中的信息正确、完整且与上下文及可靠来源一致Inaccurate声明中的信息与上下文或可靠来源相比存在错误、遗漏或不一致Disputed可靠权威来源对该声明存在相互冲突的信息客观上缺乏定论Unsupported经过搜索仍无法找到可靠来源支撑声明中的信息Not Applicable声明表达的是主观观点、个人信念或涉及虚构内容无需外部验证给出理由JUSTIFICATION解释判定依据并引用所查来源或说明为何选择 Not Applicable。Step 3整体评估Provide an overall assessment—— 完成所有声明评估后对整个回答文本给出OVERALL VERDICT整体判定与OVERALL JUSTIFICATION整体理由说明各声明的评估结果如何汇聚成整体结论以及回答整体上是否成功回应了原始问题。提示词还特别强调验证过程是迭代式的可以每次挑一个或多个声明进行验证并允许借助已确认的声明去验证后续声明支持基于我的知识Based on my knowledge...进行判断但非平凡的事实声明仍需结合搜索等外部来源对高置信度或主观性声明可仅凭自身知识验证证据不足时可对同一声明执行多次搜索并在推理中通过方括号索引如[2, 3, 6, 9]引用已收集的证据。工具与后处理回调在 critic/critic.go 的New函数中critic 通过llmagent.New创建其核心配置为return llmagent.New(llmagent.Config{ Model: model, Name: critic_agent, Instruction: CriticPrompt, Tools: []tool.Tool{geminitool.GoogleSearch{}}, AfterModelCallbacks: []llmagent.AfterModelCallback{ renderReference, }, })这里有两个值得注意的实现细节内置 Google Search 工具通过geminitool.GoogleSearch{}挂载 ADK 内置的 Google 搜索工具这正是 README 特性表中Components: Tools: built-in Google Search的源码出处。模型可以在核查过程中实时发起搜索来取证renderReference后处理回调模型返回后该回调会读取llmResponse.GroundingMetadata.GroundingChunks把搜索结果中的标题、文本与 URL 组装成 Markdown 格式的引用清单Reference:段落例如* 标题若所有内容部分均为纯文本还会将它们合并为一个文本块保证输出整洁可读。修订者reviser_agent最小化改写在 critic 完成核查并输出报告后reviser 登场。其提示词定义在 reviser/reviser.go 的ReviserPrompt常量中它被设定为高可信度出版物的专业编辑任务是在保持原文整体结构、风格与篇幅基本不变的前提下对回答进行最小化修订使其准确。针对不同判定修订者遵循以下编辑准则判定类型编辑准则Accurate无需编辑Inaccurate尽可能依据审稿人的理由进行修正Disputed尽量呈现论点的两个或多个侧面使回答更加平衡Unsupported若声明并非回答核心可省略否则可弱化表述或明确说明其缺乏支撑Not Applicable无需编辑作为最后手段若某声明非回答核心且无法修正可以省略同时修订者需要保证改写后的回答自洽、流畅不得引入任何新的声明或陈述且编辑应保持最小化。提示词中内置了两个完整的 few-shot 示例示例 1美国第一任总统是谁判定 Accurate要求原样输出与示例 2太阳是什么形状答案称太阳是立方体且很热其中立方体判定 Inaccurate 需修正为球体而很热判定 Accurate 保留用于示范不同判定下的输出形态。输出终止标记与清理回调为了让工作流的输出边界清晰reviser 被要求若回答准确则原样输出若不准确/存疑/缺乏支撑则输出修订后的文本输出结束后单独打印一行---END-OF-EDIT---并停止。该标记定义在reviser.go顶部的常量EndMark ---END-OF-EDIT---。随后removeEndOfEditMark 作为AfterModelCallbacks注册的回调会在响应返回给用户前扫描内容部分一旦发现EndMark就截断其后的所有内容并把标记本身从文本中剥离最终只把修订结果呈现给用户。这一约定标记 后处理剥离的模式是控制多智能体输出格式的轻量且有效的手段。环境准备与配置前置条件Go 1.24一个Google Cloud PlatformGCP项目Google Cloud CLIgcloud安装方式请遵循 Google Cloud 官方 SDK 安装说明。安装步骤# 克隆本仓库 git clone https://gitcode.com/GitHub_Trending/ad/adk-samples.git cd adk-samples/go/agents/llm-auditor # 整理依赖 go mod tidy说明本仓库当前检出的go/agents/llm-auditor目录内并不包含go.mod/go.sum仓库中仅有cmd/、auditor/、critic/、reviser/四个包与 README、架构图因此按 README 指引在本地执行go mod tidy以解析并生成依赖清单是启动前的必要一步。方式一使用 Vertex AI推荐依赖 Google Cloud在 shell 中设置以下环境变量export GOOGLE_GENAI_USE_VERTEXAItrue export GOOGLE_CLOUD_PROJECTyour-project-id export GOOGLE_CLOUD_LOCATIONyour-project-location然后认证 GCloud 账号gcloud auth application-default login gcloud auth application-default set-quota-project $GOOGLE_CLOUD_PROJECT其中set-quota-project用于将配额项目绑定到你自己的 GCP 项目避免因默认配额项目导致调用受限。方式二本地运行不依赖 Vertex AI / Cloud若希望在本地运行而无需 Google Vertex AI 或 Cloud 依赖可改为export GOOGLE_GENAI_USE_VERTEXAIfalse export GOOGLE_API_KEYPASTE_YOUR_ACTUAL_API_KEY_HERE获取 Gemini API Key 的方法参见 Google Gemini API 官方 Go 快速入门文档。注意即使本地模式绕开了 GCP 项目critic 的Google Search 工具仍需经由模型服务端执行因此本地模式下核查过程的搜索能力是否可用取决于所用 API Key 的权限范围。运行 Agent 并与之交互启动方式ADK 提供了便捷的本地拉起方式直接使用 CLI 与 Agent 对话go run ./cmd该命令会在本机启动一个 Web 服务器并打印访问 URL。打开 URL 后在左上角下拉菜单中选择llm_auditor右侧即出现聊天界面初始对话为空。以下是一些可以向 LLM Auditor 提出的示例核查请求Double check this: Earth is further away from the Sun than Mars.请核查地球比火星离太阳更远Q: Why the blueberries are blue? A: Because blueberries have pigments on their skin.问题蓝莓为什么是蓝色的回答因为蓝莓果皮上有色素完整交互示例下面是 README 中记录的一次真实交互示例注意Agent 每次输出的精确内容可能不同user: Double check this: Earth is further away from the Sun than Mars. [critic_agent]: Okay, I will double-check the statement: Earth is further away from the Sun than Mars. **Step 1: Identify the CLAIMS** The answer contains one claim: * CLAIM 1: Earth is further away from the Sun than Mars. **Step 2: Verify each CLAIM** * CLAIM 1: Earth is further away from the Sun than Mars. * Context: This is a direct statement of fact about the relative distances of Earth and Mars from the Sun. * External Sources: I will use Google Search to check the average distances of Earth and Mars from the Sun. * Verdict: **Inaccurate**. * Justification: According to the search results, the average distance of Earth from the Sun is approximately 150 million kilometers [2, 3, 6, 9], while the average distance of Mars from the Sun is approximately 228 million kilometers [1, 4, 5, 8, 10]. Therefore, Mars is further away from the Sun than Earth, contradicting the claim. **Step 3: Provide an overall assessment** * OVERALL VERDICT: Inaccurate * OVERALL JUSTIFICATION: The single claim made in the answer is demonstrably false based on widely available astronomical data. Therefore, the answer as a whole is incorrect. Heres a summary of my verification results: * Claim: Earth is further away from the Sun than Mars. * Part in answer text: Earth is further away from the Sun than Mars. * Verdict: Inaccurate * Justification: The average distance of Earth from the Sun is about 150 million kilometers, while the average distance of Mars from the Sun is about 228 million kilometers. Thus, Mars is farther from the sun than the Earth. Reference: omitted for clarity [reviser_agent]: Mars is further away from the Sun than Earth.从示例中可以清晰看到完整链路critic 识别声明 → 调用搜索取证方括号索引即对应Reference段落中的多个搜索来源→ 给出单条声明判定与整体判定 → reviser 基于判定对回答做最小化改写最终输出修正后的结论火星比地球离太阳更远。从测试看如何验证整套工作流仓库中的 auditor/auditor_test.go 提供了TestHappyPath端到端测试展示了不使用 Web 服务、以编程方式驱动该工作流的方法调用GetLLmAuditorAgent(ctx)获取根智能体创建内存会话服务session.InMemoryService()并建立新会话通过runner.New与r.Run(ctx, userID, sessionID, userMsg, ...)直接运行 Agent输入为为什么天空是蓝色的答案是因为水是蓝色的这类错误回答断言响应文本包含scattering光散射关键词从而验证错误回答被核查并修订为正确物理解释这一核心行为。该测试同时是理解 ADK Go 运行时 APIrunner、session、agent.RunConfig的最小可运行范例可以作为后续开发或集成时的参考模板。代码结构与延伸阅读go/agents/llm-auditor/ ├── README.md # 官方说明文档本文依据 ├── llm_auditor_architecture.webp # 架构示意图 ├── cmd/main.go # 程序入口拉起本地 Web 服务 ├── auditor/ │ ├── auditor.go # 根顺序智能体组装llm_auditor │ └── auditor_test.go # 端到端 happy path 测试 ├── critic/ │ └── critic.go # 审稿人声明识别/验证/整体评估 搜索引用渲染 └── reviser/ └── reviser.go # 修订者最小化改写 END-OF-EDIT 清理如果需要进一步理解 ADK Go 生态可以阅读仓库根目录的 go/README.md 了解 Go 示例的整体结构与环境变量约定。需要特别说明的是根据该文档go/agents/目录目前已停止接收新示例或修改处于退休状态新示例统一迁移至contrib/go/本示例属于既有存量内容其架构与代码对学习多智能体事实核查流程仍然具有完整的参考价值。注意事项与使用边界按照 README 的声明该示例仅用于演示目的不适用于生产环境它没有经过严格测试可能包含缺陷或局限缺少生产环境通常需要的特性与优化例如健壮的错误处理、安全措施、可扩展性、性能考量、完善的日志记录以及高级配置选项基于本示例进行二次开发、测试、安全加固与部署的责任完全由使用者承担在真实或关键系统上使用任何衍生 Agent 之前建议进行充分的审查、测试并实施恰当的安全防护。另外需要提醒的是核查结论的可靠性高度依赖搜索工具与模型知识库的覆盖范围Disputed/Unsupported等判定本身也反映了现实世界中存在的信息不确定性因此应把本 Agent 定位为辅助事实核验工具而非绝对真理来源关键结论仍需人工复核权威来源。【免费下载链接】adk-samplesA collection of sample agents built with Agent Development Kit (ADK)项目地址: https://gitcode.com/GitHub_Trending/ad/adk-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表