链载Ai

标题: Java 版 DeepResearch 的实现和使用方式 [打印本页]

作者: 链载Ai    时间: 昨天 19:30
标题: Java 版 DeepResearch 的实现和使用方式

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;text-align: center;line-height: 1.5em;visibility: visible;">

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;text-align: center;line-height: 1.5em;visibility: visible;">💡 目录💡


ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;"> 01 引言与概述

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;">

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;"> 02 整体架构概览

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;">

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;"> 03核心功能与节点实现

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;">

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;"> 04使用方式与部署方式

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-style: initial;text-decoration-color: initial;background-color: rgba(148, 162, 217, 0.12);line-height: 1em;visibility: visible;">

05社区参与方式




01

引言与概述

我们基于 SpringAI Alibaba Graph 构建了一套 Java 版本的 DeepResearch 系统,实现了从信息搜集、分析到结构化报告生成的全自动流程。


系统主要具备以下能力:


02

整体架构概览

系统节点图


03

核心功能与节点实现

任务规划

共有11个节点,功能如下:


在上述节点的支撑下,引入了如下技术点:多模型配置、提示词工程、多 Agent 写协作、LLM 反思机制、任务规划、Graph(节点并行、流式输出、人类反馈)工作流搭建、工具及自定义 MCP 配置、RAG 专业知识库、链路可观测、报告内容在线可视化


RAG

1. 功能说明

spring-ai-alibaba-deepresearch项目集成的 RAG 功能,并非依赖单一的检索方式,而是通过策略模式,灵活地从多种异构数据源中检索信息,并将检索结果进行智能融合与重排序,最终为语言模型提供最相关的上下文信息。RAG功能总体来说包含两个核心阶段:

  1. 文档处理与索引(Ingestion):此阶段负责处理原始数据。流程包括加载(Loading)不同来源的文档,将其分割(Splitting)成更小的文本块(Chunks),通过嵌入模型(Embedding Model)将文本块转换为向量,最终将这些向量及其元数据存入向量数据库(Vector Store)中。

  2. 查询时检索与生成(Retrieval & Generation):当用户发起查询时,系统首先将用户的问题也转换为向量,然后在向量数据库中进行相似性搜索(Similarity Search),找出与问题最相关的文本块。这些检索到的文本块作为上下文(Context),与原始问题一起被整合进一个提示(Prompt)中,最后提交给大语言模型生成最终的、更具事实性的回答。


DeepResearch 项目的 RAG 具体功能点如下:

  1. 多源数据检索:支持从多种来源检索知识,包括专业的知识库(通过 API 或 Elasticsearch 接入)和用户上传的本地文件。

  2. 混合检索策略:内置了多种检索策略,例如基于API的知识库检索、基于 Elasticsearch 的混合检索(关键词+向量)以及针对用户文件的检索。

  3. 可插拔的策略设计:采用策略模式,用户可以轻松扩展和定制自己的检索或融合策略,以适应不同的业务场景。

  4. 智能结果融合:使用倒数排序融合(Reciprocal Rank Fusion, RRF)算法,对来自不同检索策略的结果进行综合打分和重排序,提升最终文档集的相关性。


RAG 功能支持灵活设置,主要配置项包括:

属性可以控制 RAG 功能的开启与关闭。




2. 实现方式

该 RAG 功能的实现基于 Spring AI 框架,主要围绕VectorStoreRetrievalAugmentationAdvisor两个核心接口构建。






3. 架构和流程图

架构图

DeepResearch的 RAG 实现在深度整合了 Spring AI 的能力之外,还进行了扩展。核心是HybridRagProcessor接口及其默认实现DefaultHybridRagProcessor


下面是DeepResearch模块 RAG 功能的扩展架构图,使用 Mermaid 绘制:

代码段



架构解析:

  1. 入口点 (**RagDataController**):负责处理外部请求,例如用户上传文件进行知识库构建。

  2. 核心处理器 (**HybridRagProcessor**):这是 RAG 流程的“大脑”,负责协调整个检索和融合过程。它接收查询请求,然后调用注册的各种检索策略。

  3. 检索策略 (**RetrievalStrategy**):

  1. 融合策略 (**FusionStrategy**):

  1. 数据源:包括外部 API、Elasticsearch 实例和用于存储用户文件的向量数据库。


流程图

为了更直观地理解其工作流程,下面是 RAG 功能的处理流程图:

数据摄取流程

RAG 节点查询流程


工作流程:


流程解析:

  1. 用户通过 API 发起查询。
  2. HybridRagProcessor接收到查询后,会并发地调用所有已注册的RetrievalStrategy
  3. 每个RetrievalStrategy根据自身的逻辑从对应的数据源(API、ES、文件)检索文档,并返回一个有序的文档列表。
  4. HybridRagProcessor将所有策略返回的文档列表集合起来,传递给RrfFusionStrategy
  5. RrfFusionStrategy 对这些列表进行融合与重排序,生成一个最终的高度相关的文档列表。
  6. 这个列表最终被用作大型语言模型的上下文,帮助其生成更准确、更具信息量的回答。


4. 总结

spring-ai-alibaba-deepresearch模块中的 RAG 功能通过将检索和融合过程抽象为策略接口,实现了高度的灵活性和可定制性。其混合检索的能力,特别是结合了 RRF 算法的多路召回融合机制,能够有效整合来自不同数据源的信息,显著提升信息检索的全面性和准确性,为构建企业级、高可用的 RAG 应用提供了坚实的基础。


Tools 搜索能力 + MCP

1. 通用搜索工具

在背景调查节点(BackgroundInvestigationNode)和研究者节点(ResearcherNode)中,大语言模型(LLM)会根据用户输入的问题自动制定相应的搜索方案,并通过调用外部搜索工具获取相关信息。目前系统支持四种搜索工具:Tavily、Serp、百度搜索以及阿里云AI搜索。用户还可选择启用 JinaCrawler服务,该服务能够对搜索结果中提取的链接进行进一步抓取和处理,通过 Jina 提供的解析能力增强原始搜索返回的内容。


用户需在application.yml配置文件中提前配置相应搜索工具所需的 API Key 或相关环境变量,以便正常调用搜索服务。


搜索功能主要由SearchFilterService(搜索过滤服务)实现。该服务根据用户配置选择合适的SearchService执行搜索,并对返回的结果依据黑白名单规则进行排序与过滤。系统提供了LocalConfigSearchFilterService作为这一服务的实现类,支持从 JSON 配置文件中读取网站黑白名单。该配置文件为一个 JSON 数组,每个数组元素为包含hostweight字段的对象。


其中weight的取值范围为 -1 到 1:数值越高,表示对应网站的可信度越高;而取值为负数则表示该网站不可信——即使搜索工具返回了来自该网站的结果,系统也会将其过滤,确保不会传递给 LLM 模型用于后续生成答案。


2. MCP

DeepResearch 支持用户集成额外的 MCP(Model Context Protocol)服务,以增强研究者节点(ResearcherNode)和代码节点(CoderNode)的处理能力。用户可以通过以下两种方式配置 MCP 服务:


启用MCP服务需要将配置文件的spring.ai.mcp.client.enabledspring.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":[]
}
}


结果生成

1. 功能说明

spring-ai-alibaba-deepresearch项目的核心能力之一是将多智能体协作的最终研究成果,动态生成为一份结构清晰、内容详实的综合报告。为了便于用户查阅、归档和分享,项目提供了一套完整的报告生成、管理与导出功能。

该功能主要包含以下核心特性:

  1. 动态报告生成与存储:在每个研究任务(由唯一的 threadId 标识)完成后,系统会自动捕获最终结论,并将其作为一份报告持久化存储。
  2. 多种导出格式:为了适应不同场景的需求,报告支持导出为多种主流文档格式,包括 Markdown 和 PDF。
  3. 交互式HTML预览:除了静态文件导出,系统还提供了一个实时流式接口,可以将报告内容动态渲染为一个可交互的 HTML 页面,提供更丰富的展现形式。
  4. RESTful API 接口:功能通过一套标准的 RESTful API 暴露,允许用户和外部系统对报告进行全生命周期的管理,包括查询、检查存在性、删除、导出以及获取下载链接。


2. 实现方式

该功能的实现主要围绕ReportService(报告管理)和ExportService(报告导出)两个核心服务展开,并通过ReportController暴露为 API 接口

报告生命周期管理:
报告导出服务:

PDF 导出:

API 接口层:


连续对话能力

在当前的DeepResearch架构中,为了支持用户进行多轮交互并基于上下文进行连续提问,系统实现了会话上下文管理功能。该功能确保在同一个用户会话中,用户之前的问题以及工作流上几次运行输出的报告,能够作为历史上下文信息,被有效地注入到本次工作流的特定节点(BackgroundInvestigationNodeCoordinatorNode)的模型请求中。


核心机制:


框架目前提供了一个默认的、基于内存的实现——InMemorySessionContextService。该实现将会话历史临时存储在应用内存中,适用于开发、测试或轻量级部署场景。其特点是速度快,但存在数据易丢失(如应用重启后)和难以横向扩展的限制。根据实际生产环境的需求,可以编写自己的SessionContextService实现类。


1. 架构和流程图

下图展示了动态报告生成与导出功能的整体架构和组件间的交互关系:


为了更直观地理解其工作流程,下面是报告导出功能(以 PDF 为例)的处理流程图:


2. 总结

spring-ai-alibaba-deepresearch项目的动态报告生成与导出功能,通过将核心业务逻辑(报告管理、格式转换)与 API 接口解耦,构建了一个清晰、可扩展的模块。它不仅提供了多样的导出选项以满足不同用户的需求,还通过集成开源的第三方库(commonmarkopenhtmltopdf)确保了高质量的文档输出。同时,通过提供Redis内存两种存储实现,并利用 Spring Boot 的条件化配置自动切换,兼顾了生产环境的可靠性和开发测试的便捷性。这套功能极大地提升了用户使用的便利性和交互体验,是整个应用闭环中不可或缺的重要一环。


04

使用方式与部署方式


方式一:Docker部署完整项目

构建说明

Docker 部署需在本地安装最版本的 Docker 软件,安装方式参考官方文档。

Docker 部署的方式为 Docker 多阶段构建:


部署说明

在项目根目录下执行以下命令:

$# 第一步 : 在 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/


方式二:Idea 启动后端服务 + Docker 启动中间件 + 前端启动:

要求


启动中间件

cdspring-ai-alibaba-deepresearch
dockercompose-fdocker-compose-middleware.ymlup-d

这里中间件只启动了 redis 和 elasticsearch


启动后端项目

首先,编译项目

cdspring-ai-alibaba-deepresearch
mvncleaninstall-DskipTests

接着,配置 IDEA 环境变量

Edit Configurations -> 选择 DeepResearch 项目 -> Modify options -> Environment variables -> 配置具体的环境变量


最后,启动后端项目。


启动前端项目

下载依赖,并且启动前端项目

cdspring-ai-alibaba-deepresearch/ui-vue3
pnpminstall
pnpmrundev

前端项目配置说明:

  '/deep-research':{
target:'http://localhost:8080',
changeOrigin:true,
rewritepath)=>path.replace(/^\/deep-research/,'')
}






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5