开源:基于 LangGraph + RAGFlow 的三智能体长文档生成平台 OpenSpec

开源:基于 LangGraph + RAGFlow 的三智能体长文档生成平台 OpenSpec

项目简介

OpenSpec 是一个企业级 AI 专业长文档生成平台,采用 RAG + 三智能体工作流架构,适用于建筑设计、招投标、汽车维修、医疗等需要生成结构化长文档的行业场景。

要解决的问题

在建筑设计、招投标等行业,从业者需要频繁产出几十页甚至上百页的专业文档。这些文档必须引用行业标准、前后数据一致、格式符合模板要求。

直接用 ChatGPT / 通义千问等通用大模型生成存在以下问题:

  1. 上下文丢失:写到第 30 页时前面的数据已经"忘了",前后矛盾
  2. 幻觉严重:编造不存在的国标编号,张冠李戴引用条文
  3. 无审核机制:单个 AI 自己写自己审,发现不了自身错误
  4. 无知识库:不知道企业用的哪版规范、哪些设计参数

系统架构

整体架构

 ┌─────────────────────────────┐ │ Knowledge Base (RAG) │ │ Standards / Cases / Docs │ └──┬────────────┬────────────┬─┘ │ │ │ query on query on query on demand demand demand │ │ │ ┌────────┐ ┌──────────▼─┐ ┌─────▼─────┐ ┌▼──────────┐ ┌────────┐ │ Input │──▶│ Researcher │──▶│ Generator │──▶│ Auditor │──▶│ Export │ │ │ │ │ │ │ │ │ │ │ └────────┘ └────────────┘ └─────▲─────┘ └─────┬─────┘ └────────┘ │ │ └── revise ──────┘ 

三智能体工作流

基于 LangGraph 构建有向图状态机,三个智能体各司其职,每个智能体在发现上下文不足时自主查询知识库:

1. Researcher(检索智能体)

从知识库检索规范条文、历史案例、参考资料。

researcher_tools =[retrieve_case, retrieve_standard] researcher_llm = llm.bind_tools(researcher_tools)

循环控制:

  • MAX_RESEARCH_LOOPS = 3(硬性上限)
  • MIN_CONTENT_THRESHOLD = 1000(字符最小阈值)
  • 支持提前退出:内容充足 / 连续空结果 / LLM 判断资料足够

执行策略为两步式:先流式输出推理链(思考阶段),再生成 Tool Calls 调用检索工具(行动阶段)。

2. Generator(生成智能体)

基于检索上下文逐章生成内容。

核心能力:

  • 跨章节关联:提取已生成章节 extract_previous_chapters(),做参数一致性检查
  • 关联章节分析:find_related_chapters() 确保引用关系正确
  • 智能 Token 计数:calculate_available_tokens() 精确控制篇幅
  • 后处理:检测 XX、___ 等占位符替换为 [待填写]

上下文来源:从 Researcher 产出的 ToolMessage 中提取检索结果(最多保留 30 条)。

3. Auditor(校验智能体)

审核生成内容的质量。

auditor_tools =[retrieve_standard, retrieve_case] auditor_llm = llm.bind_tools(auditor_tools)

五维度校验:

维度说明
逻辑一致性开头声明数量与表格数据是否匹配
参数合理性数值是否在规范允许范围内
规范符合性国标编号是否正确引用
内容完整性必要章节和数据是否完整
格式规范性符号、单位是否正确

校验结果:pass → 结束;revise → 带修改意见打回 Generator 重写。

控制参数:MAX_AUDIT_LOOPS = 1MAX_AUDITOR_TOOL_CALLS = 5

RAG 知识库

基于 RAGFlow 实现,提供两类检索工具:

@tooldefretrieve_case(query:str)->str:"""从知识库检索历史案例"""return _retrieve_from_kb(query, CASE_KB_IDS,"案例库")@tooldefretrieve_standard(query:str)->str:"""从知识库检索行业规范"""return _retrieve_from_kb(query, STAND_KB_IDS,"规范库")

通用检索函数:

def_retrieve_from_kb(query, kb_ids, kb_name): rag_object = RAGFlow(api_key=RAGFLOW_API_KEY, base_url=RAGFLOW_BASE_URL) chunks = rag_object.retrieve( question=query, dataset_ids=kb_ids, page=1, page_size=10, similarity_threshold=0.55)# 返回格式:【来源: XXX | 相关度: 0.95】内容...

支持动态知识库:set_kb_ids() 可在基础库上追加企业特定知识库,retrieve_from_project_kb() 支持按项目 ID 查询。

Prompt 管理

所有 Prompt 通过 Langfuse 统一管理:

prompt_manager = PromptManager() researcher_prompt = prompt_manager.get_prompt("langchain_researcher") generator_prompt = prompt_manager.get_prompt("construction_agent_system") auditor_prompt = prompt_manager.get_prompt("langchain_auditor")

支持在线调整 Prompt,无需改代码重新部署。

API 接口

# 流式生成(单章节,支持审核) POST /chat/stream # 参数:message, project_id, template, enable_audit, document_id, chapter_name...# 批量生成(多章节,非流式) POST /chat/batch # 简化流水线:Researcher → Generate,无 Auditor

技术栈

层级技术说明
前端Vue 3 + TypeScript + ViteSPA
后端Spring Boot 3 + Java 17RESTful API
AI 工作流Python + LangGraph + LangChain状态机式多智能体编排
知识检索RAGFlow向量检索,支持多知识库
Prompt & 可观测性LangfusePrompt 管理 + LLM 调用追踪 + 成本分析
数据库PostgreSQL项目和文档数据
部署Docker Compose一键部署全部服务

项目结构

apps/ ├── web/ # Vue 3 前端 ├── backend/ # Spring Boot 后端 └── agent/ # AI Agent(核心) ├── service/workflow/ │ ├── construction_agent.py # 完整流程(Router + 三智能体) │ ├── batch_construction_agent.py # 批量生成(无 Auditor) │ └── rag_graph.py # RAG 简化流程 ├── service/tools/ │ └── construction_tools.py # RAG 检索工具 └── api/ └── workflow_api.py # API 端点 

应用场景

领域知识库内容生成文档
建筑设计国标/地方标准、历史设计说明施工图设计说明、可研报告
招投标历史方案、施工规范、企业资质投标技术方案
汽车维修维修手册、故障案例、配件标准维修技术手册
医疗健康临床指南、诊疗规范临床试验报告

快速部署

git clone https://github.com/zhuzhaoyun/OpenSpec.git cd OpenSpec cp deploy/docker/.env.example deploy/docker/.env # 编辑 .env,填入以下必要配置:# RAGFLOW_API_KEY, RAGFLOW_BASE_URL, DASHSCOPE_API_KEYcd deploy/docker docker compose up -d

关键环境变量:

变量说明必填
RAGFLOW_API_KEYRAGFlow API 密钥
RAGFLOW_BASE_URLRAGFlow 服务地址
DASHSCOPE_API_KEYLLM API 密钥(默认通义千问)
LANGFUSE_SECRET_KEYLangfuse 私钥
LANGFUSE_PUBLIC_KEYLangfuse 公钥

启动后访问 http://localhost 即可使用。


GitHub:github.com/zhuzhaoyun/OpenSpec

欢迎 Star / Fork / PR / Issue,有问题评论区交流。

Read more

Java 大视界 -- 基于 Java 的大数据实时流处理在工业物联网设备状态监测中的应用与挑战

Java 大视界 -- 基于 Java 的大数据实时流处理在工业物联网设备状态监测中的应用与挑战

Java 大视界 -- 基于 Java 的大数据实时流处理在工业物联网设备状态监测中的应用与挑战 * 引言 * 正文 * 一、工业物联网设备状态监测概述 * 二、基于 Java 的大数据实时流处理技术 * 2.1 技术架构与原理 * 2.2 状态管理与故障恢复 * 三、应用案例分析 * 四、引入边缘计算优化架构 * 五、面临的挑战与应对策略 * 5.1 数据质量问题 * 5.2 系统性能瓶颈 * 5.3 安全与隐私保护 * 结束语 * 🗳️参与投票和联系我: 引言 亲爱的 Java 和 大数据爱好者们,大家好!在科技引领产业变革的时代,大数据技术已成为推动各行业智能化转型的核心引擎。此前,我们通过一系列文章,深入探讨了 Java 大数据在金融、

By Ne0inhk
Java static避坑:静态与非静态访问规则全解析

Java static避坑:静态与非静态访问规则全解析

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * Java static避坑:静态与非静态访问规则全解析 * 📝 文章摘要 * 一、先搞懂:访问规则的底层逻辑 🧠 * 二、三大核心访问规则(必记)✅ * 规则1:静态方法 → 静态成员 ✅ 允许 * 正确案例:静态方法调用静态变量/方法 * 规则2:静态方法 → 非静态成员 ❌ 禁止(直接访问) * 错误案例:静态方法直接访问非静态成员 * 特殊情况:静态方法间接访问非静态成员(不推荐) * 规则3:非静态方法 → 静态/非静态成员 ✅ 全允许

By Ne0inhk
Java 中间件:Dubbo 服务降级(Mock 机制)

Java 中间件:Dubbo 服务降级(Mock 机制)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:Dubbo 服务降级(Mock 机制) * 什么是服务降级? * Dubbo Mock 机制简介 * Mock 的触发条件 * Dubbo Mock 的配置方式 * 1. XML 配置方式 * 2. 注解配置方式(推荐) * 3. 自定义 Mock 类 * 4. 强制 Mock(force) * Mock 机制的工作原理 * 实战案例:电商系统中的服务降级 * 场景描述 * 1. 定义服务接口 * 2. 实现

By Ne0inhk
打破AI调用壁垒:Antigravity Tools如何用Rust+Tauri重构你的AI工作流

打破AI调用壁垒:Antigravity Tools如何用Rust+Tauri重构你的AI工作流

当Claude Code遇上Gemini配额,当协议鸿沟阻碍创新,一个开源项目正在悄然改变游戏规则 引子:一个真实的痛点 你是否遇到过这样的场景:手握多个Google账号的Gemini免费配额,却无法在Claude Code CLI中使用?想要统一管理十几个AI账号,却被各家厂商的协议壁垒搞得焦头烂额?或者,你的团队需要一个本地化的AI网关,既要保护隐私,又要实现智能调度? 如果你点头了,那么今天要聊的这个项目,可能会让你眼前一亮。它叫Antigravity Tools——一个用Rust和Tauri打造的"反重力"AI调度系统,正在以一种优雅的方式,解决开发者们长期面临的多账号管理和协议转换难题。 一、项目背景:为什么需要"反重力"? 1.1 AI时代的新痛点 2024年以来,AI工具呈现爆发式增长。Claude、Gemini、GPT-4各有千秋,但问题也随之而来: * 协议碎片化:OpenAI用/v1/chat/completions,Anthropic用/

By Ne0inhk