ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MiroFish-Offline报告Agent源码解析:ReAct推理循环+InsightForge/Panorama工具链如何自动生成舆情分析报告

MiroFish-Offline报告Agent源码解析:ReAct推理循环+InsightForge/Panorama工具链如何自动生成舆情分析报告 MiroFish-Offline报告Agent源码解析ReAct推理循环InsightForge/Panorama工具链如何自动生成舆情分析报告【免费下载链接】MiroFish-OfflineOffline multi-agent simulation prediction engine. English fork of MiroFish with Neo4j Ollama local stack.项目地址: https://gitcode.com/gh_mirrors/mi/MiroFish-OfflineMiroFish-Offline 报告 AgentReportAgent是基于 ReActReasoning Acting推理循环构建的自动报告生成器它先规划报告大纲再逐节调用 InsightForge、Panorama 等图检索工具从模拟知识图谱中提取证据最终输出一份完整的舆情/预测分析报告。本文带你拆解这套先规划、再推理、后装配的 Agent 流水线。报告 Agent 在项目中的位置MiroFish-Offline 是一个全本地化的多智能体舆情模拟引擎Neo4j Ollama 技术栈完整工作流分为五步图谱构建 → 环境配置 → 模拟运行 → 报告生成 → 交互问答。报告 Agent 正是第四步的核心模拟跑完后它需要回答在这个推演出的未来里发生了什么、各方如何反应、有哪些风险。整个模块的代码集中在三个文件文件职责backend/app/services/report_agent.pyReAct 推理循环、Prompt 模板、日志与持久化backend/app/services/graph_tools.pyInsightForge / PanoramaSearch / QuickSearch / InterviewAgents 四大检索工具backend/app/api/report.py/api/report/generate等 REST 接口后台线程驱动生成三阶段生成流水线规划 → 生成 → 装配入口是 report_agent.py 的 generate_report()它把报告生成拆成三个阶段阶段一Planning大纲规划plan_outline() 先通过get_simulation_context()拿到图谱统计节点数、边数、实体类型分布和 10 条相关事实样本再让 LLM 以上帝视角的设定输出一份 2~5 节的 JSON 大纲。若 LLM 失败会降级为一份内置的三节默认大纲——报告永远有产出。阶段二Generating逐节 ReAct 生成每节内容交给 _generate_section_react() 处理。关键约束写在系统 Prompt 里每节必须调用工具3~5 次才能输出 Final Answer且内容只能来自工具返回的模拟数据禁止模型编造——这从机制上保证了报告是有据可查的。阶段三装配ReportManager.assemble_full_report() 按顺序拼接section_01.md、section_02.md… 加上标题与摘要产出full_report.md并做标题层级清洗把正文里误写的###子标题转成加粗保证 Markdown 结构规整。ReAct 推理循环Agent 如何思考—行动—观察ReActReasoning Acting让 LLM 像研究员一样工作先思考缺什么信息再调用工具获取观察结果后继续直到证据足够才动笔。核心循环在 _generate_section_react()Thought → Action(工具调用) → Observation(检索结果) → ... → Final Answer工程上值得学习的几个细节工具调用解析_parse_tool_calls() 优先解析tool_call{...}/tool_callXML 格式失败时再回退到裸 JSON / 行尾 JSON兼容不同本地模型的输出习惯。冲突降级策略若 LLM 一次回复里同时出现工具调用和 Final Answer前两次直接打回重答第三次降级为截断到第一个工具调用并强制执行避免死循环。配额控制每节最多 5 次工具调用MAX_TOOL_CALLS_PER_SECTION、至少 3 次达到上限后系统会注入请立刻输出 Final Answer的指令强制收敛。多样性提示系统会跟踪已用工具并在 Observation 里提示你还没用过 xxx 工具鼓励多角度取证而非单点查询。工具链拆解InsightForge 与 Panorama 搜索四大工具定义在 _define_tools()实现在 graph_tools.py1. InsightForge深度洞察检索— insight_forge()最强大的重火力工具一次调用完成五步用 LLM 把问题分解为最多 5 个子问题_generate_sub_queries对每个子问题在 Neo4j 中做向量 BM25 混合语义检索抽取相关实体并补充实体摘要构建实体 A --[关系]-- 实体 B的关系链汇总为可引用的事实、实体洞察与关系链2. PanoramaSearch全景广度搜索— panorama_search()拉取图谱中全部节点与带时间信息的边按valid_at / invalid_at区分当前有效事实与历史/已过期事实并按查询相关度排序。它擅长回答事件是如何演变的这类时序问题。3. QuickSearch快速检索— quick_search()轻量级单次语义检索适合快速验证某个具体事实。4. InterviewAgents深度访谈— interview_agents()最独特的一个它不查图谱而是调用 OASIS 模拟环境的真实访谈 API在 Twitter/Reddit 双平台上采访正在运行的模拟 Agent——由 LLM 挑选受访者、生成问题再把双平台回答清洗出关键引语和多方观点摘要。这让报告能包含当事人原话级别的鲜活素材。可观测性每一步都留痕Report Agent 天生自带黑匣子。ReportLogger 把每个动作启动、大纲、每轮 Thought、每次工具调用及完整结果、LLM 回复、章节完成、错误以 JSONL 追加写入agent_log.jsonlReportConsoleLogger 同步把控制台日志落盘到console_log.txt。前端可增量轮询这两份日志实现报告逐节流式呈现如上图右侧的实时进度面板。同时 ReportManager 维护如下文件结构任何一节完成后立即落盘中途失败也不丢已完成内容reports/{report_id}/ ├── meta.json # 报告元信息与状态 ├── outline.json # 大纲 ├── progress.json # 实时进度前端轮询 ├── section_01.md ... # 逐节输出 ├── full_report.md # 最终完整报告 ├── agent_log.jsonl # Agent 结构化日志 └── console_log.txt # 控制台日志从前端到 Agent 的调用链前端点击生成报告后请求进入 /api/report/generate接口先做幂等检查已有完成报告则直接返回再注入 Neo4j 存储实例构造GraphToolsService最后在后台线程中实例化ReportAgent并回调更新任务进度前端轮询task_id即可拿到 planning / generating / completed 各阶段的状态。总结这套设计给 Agent 开发者的启示MiroFish-Offline 的报告 Agent 展示了纯本地环境下的一个完整 Agent 范本ReAct 循环 强制取证配额最少 3 次、最多 5 次工具调用杜绝幻觉式报告多粒度工具分层深度InsightForge、广度Panorama、轻量QuickSearch、交互InterviewAgents让模型按需取用冲突降级 强制收敛保证循环必然终止全量日志 逐节落盘可观测、可中断恢复、可流式呈现如果你想动手实践建议从 report_agent.py 的_generate_section_react()读起再对照 graph_tools.py 里的四个工具实现一条思考 → 检索 → 观察 → 成文的链路就清晰了。【免费下载链接】MiroFish-OfflineOffline multi-agent simulation prediction engine. English fork of MiroFish with Neo4j Ollama local stack.项目地址: https://gitcode.com/gh_mirrors/mi/MiroFish-Offline创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进