微信扫码
添加专属顾问
我要投稿
Java 版 DeepResearch 实现全自动研究流程,从信息搜集到报告生成一气呵成,特别适合需要长期稳定运行的 Java 技术栈场景。核心内容: 1. 基于 SpringAI Alibaba Graph 构建的全自动研究系统架构 2. 11个核心功能节点实现智能任务规划与执行 3. 支持多模型配置、RAG 专业知识库等高级特性
💡 目录 💡
01 引言与概述
02 整体架构概览
03 核心功能与节点实现
04 使用方式与部署方式
05 社区参与方式
01
我们基于 SpringAI Alibaba Graph 构建了一套 Java 版本的 DeepResearch 系统,实现了从信息搜集、分析到结构化报告生成的全自动流程。
02
03
共有11个节点,功能如下:
CoordinatorNode(协调节点):根据用户提问信息,识别任务类型走接下来的流程,非任务类型直接结束
RewriteAndMultiQueryNode(重写和扩展节点):优化用户提问信息,并扩展为多个语义
BackgroundInvestigationNode(背景调查节点):利用搜索引擎查询问题相关资讯,可根据主题类型(学术研究、生活旅游、百科、数据分析、通用研究)定向查找对应内容
PlannerNode(规划节点):将任务拆解为几个步骤
InformationNode(信息节点):判断搜寻的内容是否充足
HumanFeedbackNode(人类节点):支持用户新增反馈内容
ResearchTeamNode(研究组节点):异步并行执行 ReseacherNode、CoderNode,等待返回结果
ReseacherNode(研究者节点):调用搜索引擎,可根据主题类型查找对应内容
CoderNode(数据处理节点):调用 python 处理工具,进行数据分析
RagNode(Rag 节点):针对用户上传的文件,针对提问进行检索出相关内容
ReporterNode(报告节点):整合上述所有节点整理的内容,生成对应的报告
在上述节点的支撑下,引入了如下技术点:多模型配置、提示词工程、多 Agent 写协作、LLM 反思机制、任务规划、Graph(节点并行、流式输出、人类反馈)工作流搭建、工具及自定义 MCP 配置、RAG 专业知识库、链路可观测、报告内容在线可视化
文档处理与索引(Ingestion):此阶段负责处理原始数据。流程包括加载(Loading)不同来源的文档,将其分割(Splitting)成更小的文本块(Chunks),通过嵌入模型(Embedding Model)将文本块转换为向量,最终将这些向量及其元数据存入向量数据库(Vector Store)中。
查询时检索与生成(Retrieval & Generation):当用户发起查询时,系统首先将用户的问题也转换为向量,然后在向量数据库中进行相似性搜索(Similarity Search),找出与问题最相关的文本块。这些检索到的文本块作为上下文(Context),与原始问题一起被整合进一个提示(Prompt)中,最后提交给大语言模型生成最终的、更具事实性的回答。
DeepResearch 项目的 RAG 具体功能点如下:
多源数据检索:支持从多种来源检索知识,包括专业的知识库(通过 API 或 Elasticsearch 接入)和用户上传的本地文件。
混合检索策略:内置了多种检索策略,例如基于API的知识库检索、基于 Elasticsearch 的混合检索(关键词+向量)以及针对用户文件的检索。
可插拔的策略设计:采用策略模式,用户可以轻松扩展和定制自己的检索或融合策略,以适应不同的业务场景。
智能结果融合:使用倒数排序融合(Reciprocal Rank Fusion, RRF)算法,对来自不同检索策略的结果进行综合打分和重排序,提升最终文档集的相关性。
RAG 功能支持灵活设置,主要配置项包括:
simple: 使用 SimpleVectorStore,数据可以持久化到本地文件,通过 storage-path 配置存储路径.
elasticsearch: 使用 ElasticsearchVectorStore,将向量存 Elasticsearch 数据库中,可通过 uris、username、password 和 indexname等属性进行配置.
query-expansion-enabled: 启用查询扩展功能,为原始问题生成多个相关查询,以提高检索覆盖率.
query-translation-enabled: 启用查询翻译功能,将查询翻译成指定语言 (query-translation-language).
post-processing-select-first-enabled: 启用后处理功能,仅选择检索到的第一个文档作为最终结果.
该 RAG 功能的实现基于 Spring AI 框架,主要围绕 VectorStore
和 RetrievalAugmentationAdvisor
两个核心接口构建。
RagDataAutoConfiguration 类在应用启动时或通过定时任务触发数据加载。
VectorStoreDataIngestionService 服务负责处理实际的文档摄取工作。它使用 TikaDocumentReader来读取多种格式的文档(如 PDF, DOCX,MD),然后利用 TokenTextSplitter 将文档分割成小块,最后将些文档块添加到配置好的 VectorStore 中。
RagVectorStoreConfiguration
根
据 spring.ai.alibaba.deepresearch.ra.vector-store-type 的值,动态创建 SimpleVectorStore 或 ElasticsearchVectorStore bean。
RagAdvisorConfiguration 类负责配置 RAG 管道。它创建一个 RetrievalAugmentationAdvisorbean,并将 VectorStoreDocumentRetriever 作为其文档检索器。
根据 RagProperties 的配置,MultiQueryExpander (查询扩展)、TranslationQueryTransformer(查询翻译)和 DocumentSelectFirstProcess (后处理) 等组件被选择性地添加到RAG管道中。
RagNode 是一个 NodeAction,它将 RAG 功能集成到主应用程序的工作流中。
在 RagNode 的 apply 方法中,它从状态中获取用户查询,然后通过 ChatClient 调用配置好的 RetrievalAugmentationAdvisor。RetrievalAugmentationAdvisor 会根据查询从 VectorStore 中检索相关文档,并利用这些文档来增强大语言模型的响应,最后将生成的增强结果放入状态中。
DeepResearchConfiguration 类则负责将 RagNode 添加到整个 StateGraph中,实现了 RAG 功能作为工作流中的一个可执行节点。
DeepResearch
的 RAG 实现在深度整合了 Spring AI 的能力之外,还进行了扩展。核心是 HybridRagProcessor
接口及其默认实现 DefaultHybridRagProcessor
。
下面是 DeepResearch
模块 RAG 功能的扩展架构图,使用 Mermaid 绘制:
代码段

架构解析:
**RagDataController**
):负责处理外部请求,例如用户上传文件进行知识库构建。**HybridRagProcessor**
):这是 RAG 流程的“大脑”,负责协调整个检索和融合过程。它接收查询请求,然后调用注册的各种检索策略。**RetrievalStrategy**
):
ProfessionalKbApiStrategy: 通过API接口从专业的知识库(如DashScope的知识库)中检索文档。
ProfessionalKbEsStrategy: 使用自定义的RrfHybridElasticsearchRetriever从Elasticsearch中进行混合检索。这种检索方式结合了传统关键词搜索和向量相似度搜索的优点。
UserFileRetrievalStrategy: 从用户上传并存储在向量数据库中的文件里检索相关内容。
**FusionStrategy**
):
RrfFusionStrategy: 实现了 RRF 算法。它接收来自所有检索策略返回的文档列表,根据每个文档在不同列表中的排名计算一个综合得分,并据此对所有文档进行重新排序。
为了更直观地理解其工作流程,下面是 RAG 功能的处理流程图:
数据摄取流程
RAG 节点查询流程
工作流程:
流程解析:
HybridRagProcessor接收到查询后,会并发地调用所有已注册的
RetrievalStrategy
。RetrievalStrategy
根据自身的逻辑从对应的数据源(API、ES、文件)检索文档,并返回一个有序的文档列表。HybridRagProcessor将所有策略返回的文档列表集合起来,传递给
RrfFusionStrategy
。RrfFusionStrategy 对这些列表进行融合与重排序,生成一个最终的高度相关的文档列表。
spring-ai-alibaba-deepresearch
模块中的 RAG 功能通过将检索和融合过程抽象为策略接口,实现了高度的灵活性和可定制性。其混合检索的能力,特别是结合了 RRF 算法的多路召回融合机制,能够有效整合来自不同数据源的信息,显著提升信息检索的全面性和准确性,为构建企业级、高可用的 RAG 应用提供了坚实的基础。
在背景调查节点(BackgroundInvestigationNode
)和研究者节点(ResearcherNode
)中,大语言模型(LLM)会根据用户输入的问题自动制定相应的搜索方案,并通过调用外部搜索工具获取相关信息。目前系统支持四种搜索工具:Tavily、Serp、百度搜索以及阿里云AI搜索。用户还可选择启用 JinaCrawler
服务,该服务能够对搜索结果中提取的链接进行进一步抓取和处理,通过 Jina 提供的解析能力增强原始搜索返回的内容。
用户需在 application.yml
配置文件中提前配置相应搜索工具所需的 API Key 或相关环境变量,以便正常调用搜索服务。
搜索功能主要由 SearchFilterService
(搜索过滤服务)实现。该服务根据用户配置选择合适的 SearchService
执行搜索,并对返回的结果依据黑白名单规则进行排序与过滤。系统提供了 LocalConfigSearchFilterService
作为这一服务的实现类,支持从 JSON 配置文件中读取网站黑白名单。该配置文件为一个 JSON 数组,每个数组元素为包含 host
和 weight
字段的对象。
其中 weight
的取值范围为 -1 到 1:数值越高,表示对应网站的可信度越高;而取值为负数则表示该网站不可信——即使搜索工具返回了来自该网站的结果,系统也会将其过滤,确保不会传递给 LLM 模型用于后续生成答案。
DeepResearch 支持用户集成额外的 MCP(Model Context Protocol)服务,以增强研究者节点(ResearcherNode
)和代码节点(CoderNode
)的处理能力。用户可以通过以下两种方式配置 MCP 服务:
mcp-config.json
中预先定义 MCP 服务器信息。启用MCP服务需要将配置文件的spring.ai.mcp.client.enabled
和 spring.ai.alibaba.deepresearch.mcp.enabled
字段设置为 true
。
有效的 MCP 服务配置示例如下:
{
"researchAgent":{
"mcp-servers":[
{
"url":"https://mcp.amap.com?key=${AMAP_API_KEY}",
"sse-endpoint":"/sse",
"description":"高德地图位置服务",
"enabled":true
}
]
},
"coderAgent":{
"mcp-servers":[]
}
}
spring-ai-alibaba-deepresearch
项目的核心能力之一是将多智能体协作的最终研究成果,动态生成为一份结构清晰、内容详实的综合报告。为了便于用户查阅、归档和分享,项目提供了一套完整的报告生成、管理与导出功能。
该功能主要包含以下核心特性:
该功能的实现主要围绕 ReportService
(报告管理)和 ExportService
(报告导出)两个核心服务展开,并通过 ReportController
暴露为 API 接口
ReportService: 报告的存储和管理接口,包括 saveReport、getReport、existsReport 和 deleteReport等核心方法。
ReportRedisService: 这是
ReportService
的默认实现,使用 Redis 作为后端存储。每份报告以字符串形式存储,并使用 report:{threadId}
作为键(Key),保证了高效的读写性能和持久化能力。ReportMemoryService: 这是
ReportService
的另一个实现,使用内存中的 ConcurrentHashMap
来存储报告。它主要用于开发、测试或在没有 Redis 环境下的快速启动。当 Redis 未启用时,该服务会自动生效。ExportService: 这是负责格式转换和文件生成的核心服务。它从
ReportService
获取原始报告内容(Markdown 格式),然后执行相应的转换逻辑。ReportService
获取报告字符串,并利用 FileOperationUtil
工具类将其保存为一个 .md
文件。ReportService
获取原始 Markdown 报告。commonmark-java
库将 Markdown 文本解析并渲染为 HTML 字符串。为了更好地支持 GitHub Flavored Markdown (GFM),还集成了 commonmark-ext-gfm-tables
扩展来处理表格。openhtmltopdf
库接收上一步生成的 HTML,并将其转换为 PDF 文档。该库能够处理复杂的 CSS 样式和布局,为了正确显示中文字符,项目中已预置并加载了兼容 CJK 的字体。GET /api/reports/{threadId}: 根据线程 ID 获取原始报告内容。
POST /api/reports/export: 触发异步导出任务,支持指定 format (pdf/md)。
GET /api/reports/download/{threadId}: 提供已导出文件的下载。
GET /api/reports/interactive-html/{threadId}: 基于报告内容,通过大语言模型流式生成交互式 HTML 响应。
在当前的 DeepResearch
架构中,为了支持用户进行多轮交互并基于上下文进行连续提问,系统实现了会话上下文管理功能。该功能确保在同一个用户会话中,用户之前的问题以及工作流上几次运行输出的报告,能够作为历史上下文信息,被有效地注入到本次工作流的特定节点(BackgroundInvestigationNode
和CoordinatorNode
)的模型请求中。
核心机制:
GraphId
): 用户的每一次请求都会被分配一个唯一的 GraphId
对象。该对象包含两个关键属性:sessionId: 用于标识一个长期的用户会话。同一对话窗口的多次请求会共享同一个 sessionId,从而关联起连续的对话上下文。
threadId: 用于标识单次独立的请求或工作流执行。每次请求通常拥有一个唯一的 threadId,用于区分同一会话内的不同交互回合。
BackgroundInvestigationNode
(背景调查节点)和 CoordinatorNode
(协调节点)会调用 SessionContextService
。服务返回的 SessionHistory
会被作为历史消息添加到发送给大语言模型(LLM)的请求中。这使得LLM能够“记住”之前的对话和报告内容,从而做出具有连贯性和上下文感知的响应。框架目前提供了一个默认的、基于内存的实现——InMemorySessionContextService
。该实现将会话历史临时存储在应用内存中,适用于开发、测试或轻量级部署场景。其特点是速度快,但存在数据易丢失(如应用重启后)和难以横向扩展的限制。根据实际生产环境的需求,可以编写自己的 SessionContextService
实现类。
下图展示了动态报告生成与导出功能的整体架构和组件间的交互关系:
为了更直观地理解其工作流程,下面是报告导出功能(以 PDF 为例)的处理流程图:
spring-ai-alibaba-deepresearch
项目的动态报告生成与导出功能,通过将核心业务逻辑(报告管理、格式转换)与 API 接口解耦,构建了一个清晰、可扩展的模块。它不仅提供了多样的导出选项以满足不同用户的需求,还通过集成开源的第三方库(commonmark
和 openhtmltopdf
)确保了高质量的文档输出。同时,通过提供 Redis
和 内存
两种存储实现,并利用 Spring Boot 的条件化配置自动切换,兼顾了生产环境的可靠性和开发测试的便捷性。这套功能极大地提升了用户使用的便利性和交互体验,是整个应用闭环中不可或缺的重要一环。
04
构建说明
Docker 部署需在本地安装最版本的 Docker 软件,安装方式参考官方文档。
Docker 部署的方式为 Docker 多阶段构建:
pnpm build-only
命令构建前端项目mvn clean install
构建后端项目/app/app.jar
/var/www/html/ui/
部署说明
在项目根目录下执行以下命令:
$ # 第一步 : 在 dockerConfig目录下创建.env 配置文件,并且填写具体的环境变量
$cdspring-ai-alibaba-deepresearch
$dockerbuild-tspring-ai-deepresearch.
$dockerrun--env-file./dockerConfig/.env-p8080:80--namedeepresearch-dspring-ai-deepresearch
.env 配置文件内容:
# 百炼apiKey,地址:https://bailian.console.aliyun.com/
AI_DASHSCOPE_API_KEY=<AI_DASHSCOPE_API_KEY>
# 报告导出地址,填写本地路径
AI_DEEPRESEARCH_EXPORT_PATH=<AI_DEEPRESEARCH_EXPORT_PATH>
# tavily 搜索,地址:https://www.tavily.com/
TAVILY_API_KEY=<TAVILY_API_KEY>
# langfuse 监控,地址:https://langfuse.com/
YOUR_BASE64_ENCODED_CREDENTIALS=<YOUR_BASE64_ENCODED_CREDENTIALS>
当容器正确启动之后访问 :http://localhost:8081/
要求
启动中间件
cd spring-ai-alibaba-deepresearch
docker compose -f docker-compose-middleware.yml up -d
这里中间件只启动了 redis 和 elasticsearch
启动后端项目
首先,编译项目
cd spring-ai-alibaba-deepresearch
mvn clean install -DskipTests
接着,配置 IDEA 环境变量
Edit Configurations -> 选择 DeepResearch 项目 -> Modify options -> Environment variables -> 配置具体的环境变量
最后,启动后端项目。
启动前端项目
下载依赖,并且启动前端项目
cd spring-ai-alibaba-deepresearch/ui-vue3
pnpm install
pnpm run dev
前端项目配置说明:
VITE_BASE_URL
配置为请求后端 URLhttp://127.0.0.1:8080
/deep-research
,这个时候就需要前端代理转发到后端,在vite.config.ts 文件进行配置代理 '/deep-research': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/deep-research/, '')
}
最后,访问前端项目:http://localhost:5173/ui
05
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-09-13
中文显示成功率99% 被低估的文生图工具Qwen-Image,无废话,纯干货 实测提示词
2025-09-13
涌现观点|别被“AI Agent”的万亿神话骗了,这才是你应该知道的真相
2025-09-13
这可能是Human-in-the-Loop最具象化的演绎 | 长程推理Agent设计实践
2025-09-13
ai问答助手类产品策略与指标
2025-09-13
蚂蚁数科宣布:支持企业客户按大模型应用效果付费
2025-09-13
阿里Qoder IDE进行AI辅助编程的简单验证
2025-09-13
Docling将pdf转markdown以及与AI生态集成
2025-09-13
Claude Code 为何如此强大?Anthropic 万字长文揭秘 AI Agent 工具开发五大“心法”
2025-08-21
2025-06-21
2025-08-21
2025-08-19
2025-06-19
2025-07-29
2025-09-08
2025-08-19
2025-08-20
2025-07-04
2025-09-12
2025-09-11
2025-09-11
2025-09-09
2025-09-09
2025-09-08
2025-09-08
2025-09-07