Spring AI Alibaba DeepResearch:智能问答与报告生成系统架构解析

Spring AI Alibaba DeepResearch是Java驱动的全自动智能研究系统,集成多Agent协作、RAG与报告生成,实现信息搜集、分析与报告自动产出,并支持Spring生态与可观测性。

原文标题:基于Spring AI Alibaba 的 DeepResearch 架构与实践

原文作者:阿里云开发者

冷月清谈:

本文详细介绍了Spring AI Alibaba社区贡献的DeepResearch系统,这是一个基于Spring AI Alibaba Graph构建的Java版本全自动智能研究系统。它能够从信息搜集、分析到结构化报告生成,实现全流程自动化。

系统核心能力体现在其推理链路、Java技术栈、Spring生态集成、可观测性(支持Langfuse)、以及可溯源输出等方面,尤其适合对长期稳定运行有要求的企业级场景。

DeepResearch的架构包含11个核心节点,协同完成任务规划与执行。例如,CoordinatorNode负责任务类型识别,BackgroundInvestigationNode和ResearcherNode利用搜索引擎收集信息,PlannerNode进行任务拆解,CoderNode处理数据分析,而ReporterNode则负责整合内容生成报告。这些节点共同支持了多模型配置、提示词工程、多Agent协作、LLM反思机制、任务规划、Graph工作流搭建、工具及自定义MCP配置、RAG专业知识库、链路可观测和报告内容在线可视化等关键技术点。

特别值得关注的是其RAG(Retrieval Augmented Generation)功能。它采用策略模式,支持多源数据检索(知识库、用户文件),结合混合检索策略(如关键词+向量)和可插拔的设计,并通过倒数排序融合(RRF)算法智能整合并重排序检索结果,从而提升信息检索的全面性和准确性。RAG的实现基于Spring AI框架,围绕VectorStore和RetrievalAugmentationAdvisor接口构建,支持多种向量存储类型和灵活的数据摄取方式。

在工具支持方面,系统集成了Tavily、Serp、百度、阿里云AI搜索等多种搜索引擎,并通过JinaCrawler增强内容抓取与处理。SearchFilterService服务可根据黑白名单对搜索结果进行过滤和排序,确保信息质量。同时,DeepResearch支持集成额外的MCP(Model Context Protocol)服务,以增强研究者和代码节点的能力,灵活扩展系统功能。

报告生成是系统的另一大亮点,它能将多智能体协作的成果动态生成结构清晰的综合报告,支持Markdown、PDF等多种导出格式,并提供交互式HTML预览和RESTful API接口进行全生命周期管理。报告存储服务支持Redis和内存两种方式,保障了报告的持久化与高效访问。

此外,系统还具备连续对话能力,通过SessionContextService管理会话上下文,确保LLM在多轮交互中能够“记住”之前的对话和报告内容,提供连贯性响应。

文章最后提供了Docker和IDEA+Docker中间件+前端启动两种部署方式,方便用户快速上手与参与社区。

怜星夜思:

1、DeepResearch里有很多智能体(Agent)和节点协同工作,比如PlannerNode负责拆解任务,ResearcherNode负责信息搜集,CoderNode做数据分析。在实际项目中,管理这么多智能体和它们之间的协作流程是不是很复杂?有没有什么最佳实践或者未来展望,能让这种多智能体系统更容易被开发者驾驭?
2、文章里提到RAG功能支持多种数据源和混合检索策略,甚至用了RRF算法进行结果融合。在实际应用场景中,尤其是在不同行业(比如医疗、金融、法律)面对的专业知识库和数据格式差异巨大的情况下,这种多源RAG如何保证检索的准确性和召回率?对于一些高度领域化的查询,RRF融合算法的效果总是最优的吗,有没有可能需要针对特定领域做更多定制化开发?
3、DeepResearch提供了一个“动态报告生成与存储”功能,支持多种导出格式和交互式HTML预览。从用户的角度来看,这种灵活性意味着什么?在企业内部知识管理、项目汇报或者对外宣传中,这块功能能带来哪些创新的应用场景?有没有什么建议,可以让报告功能在用户体验上更上一层楼?

原文内容

本文作者:Spring AI Alibaba 社区贡献者

一、引言与概述

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

系统主要具备以下能力:

  • 推理链路: 通过多轮信息收集,自动构建从资料到结论的分析过程。
  • Java 技术栈:适合对长期稳定运行有要求的场景。
  • Spring 生态集成:可直接使用 Spring Boot、Spring Cloud 等组件,提升开发与集成效率。
  • 可观测性:支持 Spring AI Alibaba Graph 的可观测,提供Langfuse平台观测实现,能够清晰的查看调用链路,便于调试和运维。
  • 可溯源输出:搜索到的相关内容,配有原始信息来源,便于验证。

二、整体架构概览

系统节点图

公众号后台回复【系统节点图】查看高清大图

三、核心功能与节点实现

任务规划

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

  • CoordinatorNode(协调节点):根据用户提问信息,识别任务类型走接下来的流程,非任务类型直接结束;
  • RewriteAndMultiQueryNode(重写和扩展节点):优化用户提问信息,并扩展为多个语义;
  • BackgroundInvestigationNode(背景调查节点):利用搜索引擎查询问题相关资讯,可根据主题类型(学术研究、生活旅游、百科、数据分析、通用研究)定向查找对应内容;
  • PlannerNode(规划节点):将任务拆解为几个步骤;
  • InformationNode(信息节点):判断搜寻的内容是否充足;
  • HumanFeedbackNode(人类节点):支持用户新增反馈内容;
  • ResearchTeamNode(研究组节点):异步并行执行ReseacherNode、CoderNode,等待返回结果;
  • ReseacherNode(研究者节点):调用搜索引擎,可根据主题类型查找对应内容;
  • CoderNode(数据处理节点):调用python处理工具,进行数据分析;
  • RagNode(Rag节点):针对用户上传的文件,针对提问进行检索出相关内容;
  • ReporterNode(报告节点):整合上述所有节点整理的内容,生成对应的报告;

在上述节点的支撑下,引入了如下技术点:多模型配置、提示词工程、多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 启用/禁用: 通过
    spring.ai.alibaba.deepresearch.rag.enabled 属性可以控制 RAG 功能的开启与关闭。
  • 向量存储类型: 支持两种向量存储类型:
  • simple: 使用 SimpleVectorStore,数据可以持久化到本地文件,通过 storage-path 配置存储路径。
  • elasticsearch: 使用
    ElasticsearchVectorStore,将向量存储在 Elasticsearch 数据库中,可通过 urisusernamepassword 和 index-name 等属性进行配置。
  • 数据摄取: 项目支持多种数据加载方式:
  • 启动时加载: 应用程序启动时,
    自动从 classpath:/data/ 目录加载文件。
  • 定时扫描: 通过 cron 表达式 (cron: "0 */5 * * * *") 定时扫描指定目录 (directory),并将处理后的文件归档到另一个目录 (archive-directory)。
  • 手动上传: 提供 REST API 接口 (/api/rag/data/upload),允许用户通过文件上传的方式手动摄取文档数据。
  • api接入:也支持通过api等形式接入第三方知识库的数据。
  • RAG 管道: RAG 管道(pipeline)功能允许在检索前和检索后对查询或文档进行处理。
  • query-expansion-enabled: 启用查询扩展功能,为原始问题生成多个相关查询,以提高检索覆盖率。
  • query-translation-enabled: 启用查询翻译功能,将查询翻译成指定语言 (query-translation-language)。
  • post-processing-select-first-enabled: 启用后处理功能,仅选择检索到的第一个文档作为最终结果。
2、实现方式

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

  • 数据摄取流程:
  • RagDataAutoConfiguration类在应用启动时或通过定时任务触发数据加载。
  • VectorStoreDataIngestionService服务负责处理实际的文档摄取工作。
    它使用 TikaDocumentReader 来读取多种格式的文档(如 PDF, DOCX, MD),然后利用 TokenTextSplitter 将文档分割成小块,最后将这些文档块添加到配置好的 VectorStore 中。
  • 向量存储配置:
  • RagVectorStoreConfiguration 根据
    spring.ai.alibaba.deepresearch.rag.vector-store-type的值,动态创建 SimpleVectorStore 或 ElasticsearchVectorStore bean
  • RAG 管道和顾问:
  • RagAdvisorConfiguration类负责配置 RAG 管道。它创建一个
    RetrievalAugmentationAdvisor bean,并将VectorStoreDocumentRetriever 作为其文档检索器。
  • 根据 RagProperties 的配置,MultiQueryExpander (查询扩展)、TranslationQueryTransformer(查询翻译)和 DocumentSelectFirstProcess (后处理) 等组件被选择性地添加到 RAG 管道中。
与主工作流的集成:
  • RagNode 是一个 NodeAction,它将 RAG 功能集成到主应用程序的工作流中。
  • 在 RagNode 的 apply 方法中,它从状态中获取用户查询,然后通过 ChatClient 调用配置好的 RetrievalAugmentationAdvisorRetrievalAugmentationAdvisor 会根据查询从 VectorStore中检索相关文档,并利用这些文档来增强大语言模型的响应,最后将生成的增强结果放入状态中。
  • DeepResearchConfiguration类则负责将 RagNode 添加到整个 StateGraph 中,实现了 RAG 功能作为工作流中的一个可执行节点。

3、架构和流程图

架构图

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

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

代码段

架构解析:

1. 入口点 (**RagDataController**):负责处理外部请求,例如用户上传文件进行知识库构建。
2. 核心处理器 (**HybridRagProcessor**):这是RAG流程的“大脑”,负责协调整个检索和融合过程。它接收查询请求,然后调用注册的各种检索策略。
3. 检索策略 (**RetrievalStrategy**):
  • ProfessionalKbApiStrategy:通过API接口从专业的知识库(如DashScope的知识库)中检索文档。
  • ProfessionalKbEsStrategy:使用自定义的RrfHybridElasticsearchRetriever从Elasticsearch中进行混合检索。这种检索方式结合了传统关键词搜索和向量相似度搜索的优点。
  • UserFileRetrievalStrategy:从用户上传并存储在向量数据库中的文件里检索相关内容。
4. 融合策略 (**FusionStrategy**):
  • RrfFusionStrategy:实现了RRF算法。它接收来自所有检索策略返回的文档列表,根据每个文档在不同列表中的排名计算一个综合得分,并据此对所有文档进行重新排序。
5. 数据源:包括外部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

通用搜索工具

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

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

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

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

MCP

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

  • 静态配置文件方式:在 mcp-config.json 中预先定义 MCP 服务器信息。
  • 动态请求方式:在每次向 /chat/stream 接口发送请求时,通过 mcp_settings 字段实时携带 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": []
    }
}

当用户通过 API 传递自定义的 MCP 配置时,后端会利用 McpProviderFactory 将配置内容动态组装为 AsyncMcpToolCallbackProvider,供 ChatClient 在会话中调用相应的 MCP 工具和服务。这一机制使用户能够灵活扩展系统功能,并在运行时按需引入外部服务。

结果生成

1、功能说明

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

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

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

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

报告生命周期管理:
  • ReportService: 报告的存储和管理接口,包括 saveReportgetReportexistsReport 和 deleteReport等核心方法。
  • ReportRedisService: 这是 ReportService 的默认实现,使用 Redis 作为后端存储。每份报告以字符串形式存储,并使用 report:{threadId} 作为键(Key),保证了高效的读写性能和持久化能力。
  • ReportMemoryService: 这是 ReportService 的另一个实现,使用内存中的 ConcurrentHashMap 来存储报告。它主要用于开发、测试或在没有 Redis 环境下的快速启动。当 Redis 未启用时,该服务会自动生效。
报告导出服务:
  • ExportService: 这是负责格式转换和文件生成的核心服务。它从 ReportService获取原始报告内容(Markdown 格式),然后执行相应的转换逻辑。
  • Markdown 导出: 从 ReportService获取报告字符串,并利用 FileOperationUtil工具类将其保存为一个 .md 文件。
PDF 导出:
  • 从 ReportService 获取原始 Markdown 报告。
  • 使用 commonmark-java 库将 Markdown 文本解析并渲染为 HTML 字符串。为了更好地支持 GitHub Flavored Markdown (GFM),还集成了 commonmark-ext-gfm-tables 扩展来处理表格。
  • 使用 openhtmltopdf 库接收上一步生成的 HTML,并将其转换为 PDF 文档。该库能够处理复杂的 CSS 样式和布局,为了正确显示中文字符,项目中已预置并加载了兼容 CJK 的字体。
  • 最终生成的 PDF 文件被保存到临时目录中,并准备好供用户下载。
API 接口层:
  • 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架构中,为了支持用户进行多轮交互并基于上下文进行连续提问,系统实现了会话上下文管理功能。该功能确保在同一个用户会话中,用户之前的问题以及工作流上几次运行输出的报告,能够作为历史上下文信息,被有效地注入到本次工作流的特定节点

BackgroundInvestigationNodeCoordinatorNode)的模型请求中。

核心机制:

  • 会话标识 (GraphId): 用户的每一次请求都会被分配一个唯一的GraphId对象。该对象包含两个关键属性:
  • sessionId: 用于标识一个长期的用户会话。同一对话窗口的多次请求会共享同一个sessionId,从而关联起连续的对话上下文。
  • threadId: 用于标识单次独立的请求或工作流执行。每次请求通常拥有一个唯一的threadId,用于区分同一会话内的不同交互回合。
  • 上下文获取与服务 (SessionContextService): 该功能的核心由SessionContextService(会话上下文服务)接口及其实现承担。其主要职责是:
  • 根据当前请求的sessionId,获取与该会话相关的最近数次请求的完整历史记录(SessionHistory)。
  • 上下文应用: 在工作流执行过程中,BackgroundInvestigationNode(背景调查节点)和CoordinatorNode(协调节点)会调用SessionContextService。服务返回的SessionHistory会被作为历史消息添加到发送给大语言模型(LLM)的请求中。这使得LLM能够“记住”之前的对话和报告内容,从而做出具有连贯性和上下文感知的响应。

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

1、架构和流程图

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

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

2、总结

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

四、使用方式与部署方式

方式一:Docker部署完整项目

构建说明

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

https://www.docker.com/

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

  • 第一阶段 - 前端构建 (frontend-builder)
    • 使用 Node.js 21 Alpine 镜像
    • 安装 pnpm 包管理器
    • 复制前端项目文件并安装依赖
    • 执行 pnpm build-only 命令构建前端项目
  • 第二阶段 - 后端构建 (backend-builder)
    • 使用 Dragonwell JDK 17 Ubuntu 镜像
    • 安装 Maven
    • 复制 Maven 配置文件和项目源码
    • 执行 mvn clean install 构建后端项目
  • 第三阶段 - 运行时镜像
    • 基于 Dragonwell JDK 17 Ubuntu 镜像
    • 安装 Nginx 和 Supervisor
    • 从构建阶段复制编译产物:
      • 后端 JAR 包复制到 /app/app.jar
      • 前端构建产物复制到 /var/www/html/ui/

部署说明

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

$ # 第一步 : 在 dockerConfig目录下创建.env 配置文件,并且填写具体的环境变量
$ cd spring-ai-alibaba-deepresearch 
$ docker build -t spring-ai-deepresearch .
$ docker run --env-file ./dockerConfig/.env -p 8080:80 --name deepresearch -d spring-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启动中间件+前端启动

要求:

  • docker
  • JDK17及以上
  •  Node 16及以上

启动中间件

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

 前端项目配置说明:

  • .env 配置文件的 VITE_BASE_URL配置为请求后端 URL
    • 可以配置后端具体地址,例如:http://127.0.0.1:8080
    • 可以配置相对路径,例如:/deep-research ,这个时候就需要前端代理转发到后端,在vite.config.ts 文件进行配置代理;
  • 代理配置,当.env 配置文件使用相对路径,则需要配置代理。例如:
      '/deep-research': {
        target: 'http://localhost:8080',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/deep-research/, '')
      }

最后,访问前端项目:http://localhost:5173/ui

五、社区参与方式

  • Github 项目地址:https://github.com/alibaba/spring-ai-alibaba
  • 欢迎 PR / Issues / Feature Request
  • 社区交流方式(Github 及 DeepResearch 用户群)
  • yingzi:https://github.com/GTyingzi
  • zhouyou:https://github.com/zhouyou9505
  • NOBODY:https://github.com/SCMRCORE
  • xiaohai-78:https://github.com/xiaohai-78
  • VLSMB:https://github.com/VLSMB
  • disaster1-tesk:https://github.com/disaster1-tesk
  • Allen Hu:https://github.com/big-mouth-cn
  • Makoto:https://github.com/zxuexingzhijie
  • sixiyida:https://github.com/sixiyida
  • Gfangxin:https://github.com/Gfangxin
  • AliciaHu:https://github.com/AliciaHu
  • swl:https://github.com/hbsjz-swl
  • huangzhen:https://github.com/james-huangzhen
  • Tfh-Yqf:https://github.com/Tfh-Yqf
  • anyin-xyz:https://github.com/anyin-xyz
  • zhou youkang:https://github.com/mengnankkkk
  • supermonkeyguys:https://github.com/supermonkeyguys
  • yuluo-yx:https://github.com/yuluo-yx
  • Ken Liu:https://github.com/chickenlj
  • co63ox:https://github.com/co63oc

啊哈,医学影像分析报告!这可是个硬骨头。你不能指望一个RAG系统只靠简单的检索和融合就搞定。针对RAG的RetrievalStrategy,我觉得首先要考虑的就是多模态检索。光搜文字不行,影像数据怎么搜?能不能把影像特征也向量化,然后跟文字查询一起匹配?再来,专业术语的索引必须超级精细,比如同一种病,不同医生可能描述不一样,RAG能不能理解这些“黑话”?

至于FusionStrategy,RRF是个好开始,但在医学这种“宁可信其有,不可滥用”的领域,它可能有点“民主”过头了。万一某个次权威但排名靠前的资料给了个错误信息,而权威但排名靠后的信息才是正解,RRF搞不好就选错了。所以,我们需要的是一个**“带着偏见的”融合策略**,这个偏见是基于医学界的公认权威。比如,如果某个检索结果来自《柳叶刀》或者某个顶级医院的病例库,那它的权重应该远高于某个不知名博客。甚至可以考虑引入一个“专家裁判 Agent”,在RRF融合后再来根据专业知识做一次评估。单一RRF当然可能无法有效融合所有信息,特别是在信息质量参差不齐或专业知识深度差异巨大的情况下。所以,RAG本身就是一个持续优化的过程,需要不断注入领域知识和专家经验来打磨。

这个问题就像是,我们是该只听’主流媒体’的声音,还是也应该允许’小道消息’或’独立思想’存在?严格的信息过滤固然能保证信息的"正确性"和"安全性",但在AI领域,追求的往往是**“智能"和"创新”。过度的过滤可能会扼杀创新。我的建议是:

首先,权重可以是一个多维度的参数,不仅仅是单一的信任度。它还可以包含"信息密度"、“新颖性”、"争议性"等维度。比如,对于探讨新技术的任务,我们可能更倾向于那些新颖性权重高的来源,即便它们可能还未被广泛验证。

其次,引入
"不确定性探索机制"**。比如在多轮研究的初期,可以稍微放宽对低权重或非主流来源的过滤,允许LLM对这些信息进行"探索性分析",评估其潜力。只有当进入到"结论生成"阶段时,再收紧过滤,优先采信高权重、权威的来源。

最后,透明化! 即便我们过滤了信息,也应该在系统的某个地方记录"被过滤的信息列表",并简要说明原因。这样用户就知道"哦,这个信息没被采纳,因为它的来源不在我的信任列表里",而不是完全感知不到。这种透明度有助于建立用户信任,也能让用户在必要时Override这种过滤。

要实现更智能的可信度评估,可以考虑构建一个多维度评估模型。首先是源头权威性,可以结合知识图谱和机构信用评分,对域名进行初始打分。其次是内容质量分析,利用NLP技术识别文本中的偏见、虚假信息模式(如情绪化表达、缺乏引用、以偏概全),甚至可以通过LLM进行跨领域的事实核查(fact-checking)。再者,可引入传播网络分析,评估信息的传播路径和广度,结合社交媒体的反馈和情绪分析。最终,可以设计一个自动学习系统,根据用户对搜索结果的反馈和纠正,持续优化可信度评估的特征和模型参数,逐步减少对人工维护的依赖。

在满足高级报告需求方面,系统可以在现有基础上进行模块化扩展。首先,对于数据可视化,可以考虑引入一个**“图表即服务”的中间层,允许用户或系统通过API传递数据和图表配置,由后端生成高分辨率图片或SVG嵌入到MD/PDF中,甚至提供JS驱动的交互式图表。其次,可以增强报告模板引擎**,允许用户自定义基于HTML/JS/CSS的报告模板,并在报告生成时注入动态数据。对于嵌入互动元素,可以将交互式HTML预览进一步提升为完整的Web应用,通过前端框架(如Vue/React)渲染数据和组件,从而实现更强大的交互能力。这需要将数据层、模板层和渲染层进一步解耦,以支持更高度的定制化和动态性。

哎呀,你问到点子上了!我们之前搞RAG也遇到类似问题。技术上是能融合了,但内容来源靠不靠谱,这是个大头。比如,你让它去查股市信息,如果引用的新闻源都是小道消息或过时的,那报告出来不就误导人了嘛!所以,我觉得得有个“内容把关人”,或者系统里能给信息源分个“可信度星级”,自动过滤掉那些不靠谱的。还有就是,很多时候用户想要的不是纯粹的“事实”,而是某种“观点”或“趋势”,这个RAG怎么去理解和满足,也挺挑战的。

hmm这个问题挺实在的。省人肯定是第一个想到的,但深层次的价值嘛……我觉得首先是**“信息平权”。以前只有大公司能养得起庞大的研究团队,现在中小企业也能通过这样的工具获取深度研究报告,这对于整个社会的信息流动和创新活力都有好处。其次,它可以作为“研究大脑”的补充**,而不是替代。比如,研究员可以把繁琐的资料搜集、初步筛选交给机器,自己去专注更需要创造力和人文理解的分析环节。当然,也得警惕过度依赖,别让系统说啥就信啥,毕竟机器目前还没法完全理解人类社会的复杂性。但总的来说,提速、增效、拓宽视野,这三点是绝对的。

RRF算法听起来像是武林秘籍里的“乾坤大挪移”,能把各路信息汇聚起来。但就像练武,除了招式精妙,你还得看你学的内功心法对不对路,你的“根骨”好不好!这“根骨”就是指原始知识库的质量和结构,如果基础内容都是错的,再怎么花哨的融合也可能“走火入魔”。另外,还得考虑使用者的“心理预期”,是想看一篇严谨的学术论文,还是轻松的百科条目?这些“非技术”的预期管理,我觉得也挺重要的,不然技术再牛,用的人不买账也白搭。

从创业公司的角度看,DeepResearch这种自动化研究系统简直是“降维打击”!以前我们做竞品分析、行业调研,得雇好多人,花无数时间。现在呢?系统一跑,几个钟头报告就出来了,极大地缩短了产品上市周期,抢占市场先机。而且,它能做的深度和广度是人类个体难以企及的。想象一下,如果一个创业公司能轻松获得比大公司专业团队更全面、更新鲜的研究报告,那决策效率和创新能力简直要飞起。这不仅是省钱,更是时间的价值和洞察力的提升,能帮助小企业快速变大,大企业保持领先。

这个问题就像管理一个项目团队!CoordinatorNode就好比我们的项目经理,分配任务、协调资源。ResearcherNode和CoderNode就是具体干活的同事。如果大家职责不明确,就容易出现“踢皮球”或者“重复劳动”。所以,首先得把每个Agent的“OKR”或者“KPI”定清楚,明确输入和输出是什么。其次,要有通畅的沟通渠道,比如它们之间传递的数据格式要统一,这样才不会出现“我以为你懂,你以为我懂,结果都不懂”的情况。最后,得有“复盘机制”,每次协作完看看哪里做得好,哪里可以优化,不然怎么进步呢?机器也得“开会”总结经验嘛!

针对“RAG的混合检索策略和倒数排序融合(RRF)算法在实际应用中,除了技术实现,还需要考虑哪些非技术因素才能让RAG效果最大化?”这个问题,我认为除了技术,数据治理和内容管理是核心。首先,不同数据源的质量和时效性差异很大,需要制定严格的数据清洗、标注和更新机制。其次,要理解业务场景中用户对“事实性”和“实时性”的需求权重。比如金融报告和科普文章,对信息准确性的容忍度不一样。最后,需要与领域专家紧密合作,持续反馈检索结果的质量,优化检索策略,这其实是一个持续迭代的过程,而非一蹴而就的技术堆栈。

“打架”?哈哈哈,你是不是觉得这些Agent会像《变形金刚》一样,一言不合就开战?讲真,避免它们“打架”最简单粗暴的方法就是——给它们严谨的接口定义和明确的调用流程,让它们根本没机会“自由发挥”到打起来!至于提升能力,那就像是团队里大家各有所长,但只有在“有意识”地配合下才能打出连招技能。比如,Coder处理完数据给Researcher提供了新线索,Researcher又根据线索去搜集更精准的信息。这个“有意识”,其实就是系统设计时,让它们能循环迭代、相互启发的能力,而不是做完自己的事就完事儿。毕竟,LLM反思机制不就是让它们“自我提升”嘛!

回答“自动化研究系统除了节省人力,还能带来哪些深层次业务价值?”这个提问,我认为其价值远不止于成本节约。首先是决策质量的提升:系统能从海量信息中提取关键洞察,并以结构化报告呈现,减少了人为偏见和信息遗漏,使决策更基于数据和事实。其次是市场响应速度的提升:面对瞬息万变的市场,自动化系统可以在短时间内完成对竞争对手、新法规、消费者趋势的深度分析,帮助企业快速调整战略。再者,它能赋能非专业人员:让没有深厚研究背景的员工也能快速获取专业领域的报告,促进知识普惠和创新。最后,风险预警与管理:通过持续监控和分析,系统可自动识别潜在风险(如舆情风险、供应链风险),提供早期预警,有效规避损失。

关于“DeepResearch系统里多Agent协作,怎么设计Agent之间的责权利才能避免互相‘打架’或效率低下,又能在需要时发挥超越单一Agent的能力?”在我看来,关键在于建立清晰的Agent角色定义和一套有效的协调机制。每个Agent应有明确的职能边界(“责”),例如Researcher负责信息收集,Coder负责数据处理,Reporter负责整合。但同时,需要为它们设定明确的协作协议(“权”),比如通过共享状态(StateGraph)传递信息,或者通过MCM/MCP(模型上下文协议)进行工具调用。解决“打架”问题,可以引入“仲裁Agent”或优先级机制。至于效率,并行执行(如ResearchTeamNode)是提升效率的直接手段,同时辅以错误处理和回溯机制,确保任务流的稳健性。

“人类节点”在AI系统中扮演的角色确实至关重要,它代表了Human-in-the-loop (HITL)的设计理念。要发挥其最大价值,而非瓶颈,核心在于精确定位人类介入的时机和范围。首先,人类应专注于高风险、高价值、高不确定性的决策点,例如当AI模型对某个结论的置信度低于某个阈值时,或涉及到复杂伦理判断、创造性思维和常识性推理时。其次,应设计高效的用户界面和反馈机制,让人类能够快速理解AI的上下文、提供清晰的指导或纠正,并让这些反馈能够被系统学习和迭代,形成闭环。最后,'人类节点’不应是简单的批准或拒绝,而更像一个“智慧顾问”,在系统提供的多种方案中进行权衡,或者在AI无法提供答案时进行“知识注入”,从而将人类的认知优势与AI的规模化处理能力深度融合。

关于RAG和它的融合策略嘛,我觉得文章里提的RRF确实是一种很有效的综合排名方法,但在不同行业肯定需要精调。比如金融领域,对数据的实时性、权威性要求特别高,传统的关键字匹配和特定金融机构报告的向量检索可能比通用语料的检索权重更高。医疗报告则更强调专业术语的准确性、诊疗指南的时效性和医学文献的证据等级。所以,与其说RRF是“一定最好”,不如说它提供了一个很好的框架,我们还得在具体业务场景下,通过A/B测试、调整召回源权重,甚至引入垂直领域专家知识库来定制最合适的策略。毕竟,再好的算法也得喂对“食材”才能做出美味佳肴嘛!

我觉得“人类节点”这个配置太有远见了!AI再厉害,也总有它搞不懂的地方。要让它不成为瓶颈,关键在于分工明确:AI负责重复性高、数据量大、逻辑清晰的任务,把初步结果和不确定的点提炼出来。而“人类节点”就负责那些需要创造性判断、情感洞察、复杂常识推理,或者涉及伦理、价值观决策的任务。比如说,AI可以罗列出某个投资方案的所有风险点并预测收益,但最终是否要承担这个风险,或者怎么去平衡社会责任,这还得人类来拍板。也就是说,让人类去做AI做不好,或者做不了的事情,并确保人类的反馈能被AI学习和利用,这样才能让AI成为人类的强大工具,而不是一个只知道“按部就班”的傻瓜。

嘿,多Agent协作系统听起来很酷,但实际运维起来,那真是……一言难尽!最常见的坑就是:
1. 通信协议地狱:随着Agent数量增多,它们之间的消息格式、同步异步、超时重试等,管理起来就是一团麻。
2. 状态管理爆炸:每个Agent都有自己的状态,如何保证全局状态的一致性,防止数据冲突,是个大挑战。
3. 死锁和竞争条件:多个Agent抢占资源或相互等待,一不小心就僵住了,整个流程卡死。
4. 回溯与调试:某个Agent出了问题,错误信息可能被层层传递,甚至被其他Agent“消化”了,想定位源头简直是大海捞针。
5. 性能瓶颈不是你想的那样:可能不是单个Agent慢,而是某个协调步骤的并发度或通信开销成了瓶颈,优化起来很玄学。
6. 扩展性陷阱:加一个Agent容易,但验证新Agent加入后对整个流程的冲击,确保不引入新的问题,可就难了。
所以说,设计阶段就得考虑好Agent的职责边界、错误上报机制,以及强力的监控和日志系统,不然线上出问题,运维工程师真的要 ‘谢顶’ 了!

哎呀,这“人类节点”就跟咱们看电影时,遇到剧情bug或者电脑死机,忍不住想上去拍一拍键盘一样。AI再智能,总有它“卡壳”的时候。要让这个“人类节点”不拖后腿,我觉得应该把它设置成一个“紧急救援通道”或者“VIP决策通道”。平时让AI自己玩,但在它遇到以下几种情况时,就自动呼叫“人类节点”:1. 发现超纲问题,完全没头绪;2. 给出的答案自己都觉得“离谱”,置信度太低;3. 涉及到法律、道德、或者政治敏感话题,需要人类最终把关;4. 卡在一个死循环里出不来了。这样,人类就不必一直盯着,只在最关键的时候“出场”,发挥四两拨千斤的作用,当一个称职的“总设计师”,而不是“流水线工人”,是不是更有价值?

多智能体系统在生产环境的挑战可不少。首先是资源管理,每个Agent都可能消耗计算、内存甚至GPU资源,如何动态分配和隔离这些资源是个大问题,尤其当任务量激增时,防止单个Agent过载进而影响整个系统。其次是Agent间的通信延迟和可靠性,如果协调节点发出的指令不能及时或准确地被执行,整个流程就会中断。错误处理上,最头疼的是故障定位和恢复,一个Agent出错了,怎么确保不影响其他Agent,并快速恢复其功能,防止 ‘蝴蝶效应’ 导致系统雪崩。可观测性虽然文章提了,但实际链路追踪、异常告警和自动修复机制的建立至关重要。最后,Agent行为的可解释性也是个难题,当结果不如预期时,很难快速判断是哪个Agent ‘犯了错’。