端到端的训练,怎么复现 Deep ReSearch(中) :围绕着’Deep’,解构 Jina 项目的实现
仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
在上一个篇章,端到端的训练,怎么复现DeepReSearch(上):先从DeepSearch做起中,我们介绍了一些论文的工作,这些工作主要涉及怎么通过一个很长的思维链,让模型去不断思考和搜索,根据搜索结果回答一些多跳的问题。但那只是让大家找到感觉,与实际我们想复现出完整的DeepRessearch还有很大差距。
经过这几周对各家DeepResearch产品的持续测试,越来越感觉到:**能真正留住用户的,一定是”Deep”**。
为什么要聚焦于”Deep”?因为它是DeepResearch的核心价值。当用户愿意等待5-30分钟来获得一份研究报告,他们期待的必然是高质量的内容,能为他们节省大量时间和精力。这也是所有成功的DeepResearch应用的关键—如果最终报告无法让用户产生”啊哈”时刻,无法让他们在某些时刻惊叹”这报告真厉害””这报告部分内容写得比我还好””考虑得比我还全面”,那么这款应用很可能注定失败。
因此,今天,我们将探讨如何真正做到DeepResearch中的”Deep”展开讨论。
虽然没有一个明确的标准,更多是一种感觉,但从openai所说的,DeepResearch对标行业分析师的角度看,至少应该满足以下要求:
内容篇幅充足:如果最终输出仅有1-2千字,很难让用户满意。想想市面上的专业分析报告,哪个不是成千上万字?内容过少往往意味着分析不够全面深入。
描述具体且有洞察力:比如分析”人工智能对就业市场的影响”时,浅层表达是”AI将替代一些工作岗位”,而深度表达是”AI将重塑金融行业的职业结构,替代初级分析师的数据处理工作,同时创造数据伦理专家和AI-人类协作经理等新岗位,预计到2026年净就业影响为正增长12%”。
引用权威且适当的资料:专业分析报告通常会引用大量权威资料佐证观点。如果你的DeepResearch缺乏引用或引用了不可靠来源,将很难让用户信服。
…
在复现DeepResearch时,请始终记住目标是让你的agent变得更”Deep”,围绕这这个目标去构建工作流、调整prompt、微调等等等等。
下图为jina项目中的浏览图,可以跟着本文一起解构里面的实现思路。
让我们以这个问题为例:”京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?”。来具体解析Jina是如何实现”Deep”的。
当研究问题进入agent系统后,首先会由一个专门的Prompt,让LLM来判断该问题需要通过哪些评估标准,prompt如下:
包含四种核心评估维度:
Definitive(明确性):判断问题是否需要明确的答案,而非模糊表述。例如:”谁发明了微积分?”—需要明确的答案
Freshness(时效性):判断问题是否需要最新信息。例如:”当前美国的利率是多少?”—需要最新经济数据
Plurality(多样性):判断问题是否需要多个项目或示例。例如:”请列出五个最著名的莎士比亚悲剧”—需要列出多个项目
Completeness(完整性):判断问题是否包含多个需要全面解答的元素。例如:”赤壁之战的历史背景、参与者、战略意义及影响是什么?”—需要全面回答多个方面
对于我们的京东外卖问题,LLM判断需要满足”明确性”和”完整性”两个评估标准:
这些评估标准背后各自对应不同的Prompt。例如,”明确性”评估的Prompt如下:
这些评估标准将在最终答案生成后使用,即在得到答案之后,系统会通过这些评估标准来检查答案。如果答案满足所有评估标准,系统才会输出最终结果。如果不满足标准,系统会持续优化答案,直到预设的token额度消耗完或答案通过所有必要的评估。
此外,Jina还提供了一个有趣的评估选项—“拒绝一切”模式。如果启用此模式,系统将一直拒绝得到的答案,此时直到消耗完预设的token额度,系统才会停止,输出最终答案。
本质上,不同问题必须根据其本质通过特定评估,才算真正解决。如果不满足标准,系统会持续优化答案。这就是”deep”的一个体现。
在确定了问题需要的评估标准之后,我们才进入真正的工作流程。Jina将深度研究抽象为四个核心动作(action)的不断选择。具体来说,系统会让LLM基于当前的记忆(包括之前的步骤和已获取的知识)通过Prompt来决定采取哪一个核心动作。
这四个核心动作分别是:搜索(Search)、阅读(Visit)、思考(Reflect)和回答(Answer)。
这四个动作构成了Jina对深度研究核心流程的精妙抽象。虽然看似简单,但每个动作背后都有复杂的实现机制和精细的工程思考。
关键在于问题的抽象和抽象后的具体实现细节。接下来,我们将深入探讨每个动作的具体实现方法,看看它们如何协同工作,创造出真正”Deep”的研究结果。
当系统选择Search动作时,它不仅仅是用原始问题进行直接搜索,而是让大模型生成多个相关的searchquery(搜索查询),以获取全面的信息。
例如,对于京东外卖问题,模型第一步决定,采用searchaction,并生成了以下searchquery:
美团与京东的外卖市场对比分析
京东在外卖领域的竞争优势
外卖市场未来发展趋势与挑战
京东外卖进军市场的战略分析
这些问题会分别调用s.jina.search的搜索API获取结果。搜索结果包含有初步的信息,包含title、description、url、date等,注意,这里的description只是这个url内容的一个概述,并不是完整内容。如下图是jina官网中的测试示例,跟用api调用返回结果是一样的
有趣的是,Jina不会在第一轮搜索后就停止search这一步。而是根据初步搜索结果,对searchquery进行改写,以进一步细化搜索问题。
query改写的prompt很有趣,如下,让llm扮演一个专家怀疑者、细节分析师、历史研究院等等等等,根据初步searchquery和搜索出来的内容,去进一步挖掘新一轮的searchquery:
如这里生成了新的searchquery如下:
京东在外卖市场的最新动态和市场份额
京东与美团外卖市场份额历史变化
京东外卖的创新与服务质量
回想要把deep最好的核心思想,这样做好像是自然而言的。
因为一个复杂的研究问题必然需要拆分成多个搜索子问题,全面收集相关信息,才能形成深度报告的基础,这里,searchquery改写的目的也是通过迭代搜索的策略,更细粒度地找到更详尽的信息。
当有Search结果后,模型可以选择Visit(阅读)动作,进一步深入分析搜索结果中的部分url链接,以便获取更准确的信息。在这个例子中,模型在第二步决定从第一步搜索到的URL中,精读四个最相关的url。
阅读阶段的关键在于如何从大量候选URL中选择最值得阅读的几个。这一步骤对最终报告的质量有着决定性的影响。Jina采用了多种启发式方法来优化这一选择过程,主要包括以下四个加权因子:
频率因子(freq_boost):根据URL出现频率加权,多次出现的URL获得更高权重。比如,某个URL在不同的searchquery中返回多次,它比只在一个查询中出现的URL得分更高。
域名因子(hostname_boost):根据URL的hostname出现频率加权,频繁出现的hostname会获得更高的加权。
路径因子(path_boost):根据URL的路径部分(域名后的部分)出现频率进行加权,路径越常见的URL会获得更高的加权。
通过这四个因子,模型为每个候选阅读的URL赋予了权重,然后用llm参考这些权重,根据当前的上下文选择最合适的url进行阅读。除了这些主要因素外,Jina还对许多细节进行了优化,例如:
设置最小和最大权重范围,防止某些URL的权重过高或过低,确保选择的URL具有合理的分布。
限制同一域名下的URL数量不超过两个,以保证来源的多样性,避免依赖单一来源。
通过白名单和黑名单机制,增强对权威来源的倾斜,并屏蔽不可靠的站点。
这些精细的设计让大模型能够高效地阅读和提取与当前问题最相关的内容,为深度报告的编写提供有力的依据支持。
当系统认为已经收集到足够的信息后,它会生成答案,并附上答案的引用(即通过“阅读”步骤(visit)得到的详细文章内容)。例如在这个例子中,第三步中,模型认为根据当前的搜索结果和阅读得到的资料,已经能够生成完整的回答,因此模型在这里对我们的原始问题进行了回答。
然而,生成答案并不意味着流程就此结束。系统会对答案进行进一步的检查:
当前回答的是否为原始问题,而非reflect得到的子问题。假如只是回答了reflect出来的子问题,那代表原始问题还没回答,继续进入loop中。
答案是否通过了所有必要的评估标准,例如这个问题中,我们要通过”明确性”和”完整性”两个评估标准。
这这个例子中,模型是回答了原始问题,但并没有通过评估标注。
如果评估未通过,系统会使用专门的Prompt来分析失败原因,这个prompt长这个样子:
llm的输出
evaluation失败原因的分析结果会作为补充到上下文,指导agent系统进一步改进答案,直到满足所有评估标准。这一过程确保了最终的回答不仅准确,还符合高质量标准。
Reflect阶段是实现”Deep”的关键环节。在这一阶段,系统会维护一个gaps问题列表,并不断识别出知识的缺口,从而生成子问题,假如到这个列表中。例如,这这个例子中,第四步,模型认为当前需要通过Reflect阶段,生成需要进一步研究的子问题。
需要特别注意的是,Reflect问题与Search查询(searchquery)是有本质区别的:
Reflect问题:是对原始问题的深入分析与分解,目的是产生可以独立研究的子问题。每一个子问题都与原问题相关,且待解决后将成为进一步回答原始问题的上下文知识。
Search查询:是为了解决当前子问题而查询搜索引擎使用的查询语句。Search查询本身不需要被解答,它的目的是获取有用的信息来帮助回答当前的问题。
例如,现在加上原question,目前的gaps列表就应该长这个样子
[“京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?”,”京东的外卖市场策略如何与其现有业务模式相结合?”,”京东的供应链与物流优势具体是如何在外卖业务中体现的?”,”在竞争中,京东有哪些独特的服务将帮助其在外卖市场中脱颖而出?”,”京东如何通过市场营销策略吸引并留住用户?”]
在每个step中,通过轮询的方式决定当前step解决gaps列表中的哪个问题,代码如下
current_question=gaps[total_step%len(gaps)],#原始问题也有可能会被选中
这个过程确保了系统在处理问题时,能够逐步深入探索每个子问题,最终为回答原始问题提供全面而深刻的知识支持。
在这个例子中,第一步模型使用search进行信息检索,第二步使用visit阅读网页内容,第三步生成answer作为回答,第四步进入reflect阶段进行深度分析,之后根据需要可能继续进行其他步骤。每个步骤中,模型会根据当前的上下文信息决定使用哪种动作。也就是说,模型可以选择在visit阅读后继续进行search搜索,或者在search搜索后进入reflect反思阶段。四种动作(search、visit、reflect、answer)的选择完全由模型根据上下文灵活决定,而不是按照固定顺序进行。
那如何进行上下文管理呢?Jina的实现方式很简单,在整个过程中,模型会通过systemmessage和message来进行上下文管理。通过这两种方式,模型能够有效地维护每个步骤和所获得的知识,从而确保在最新的step中,能根据最新的完整上下文信息做出action。
1.SystemMessage:将先前步骤的结果概括放入SystemMessage,如下:
2.KnowledgeMessage:每个动作(如read、search、reflect等)产生的详细中间结果,会作为独立的“知识消息”进行封装。这些知识消息会被存储,并在后续步骤中供模型参考和利用。如下
终止条件通常有两种:
答案通过所有评估标准:即模型认为当前的答案已经足够准确、完整,并且符合预设的质量标准。
消耗完预设的令牌预算:为了避免无限制地消耗资源,Jina通常会设置一个令牌预算,确保在有限的时间和资源内生成最佳质量的报告。
DeepResearch的核心价值在于”Deep”—当用户愿意等待5-30分钟,他们期待的是高质量的分析报告,而不是表面的回复。
通过Jina的项目,向大家诠释了如何实现”Deep”,例如:
多角度搜索与查询优化:通过多角度搜索和searchquery改写,获取全面信息
精选的启发式URL权重加权:通过加权不同来源的URL,进行深入且多样的阅读,确保信息的广度与深度。
持续反思与思考:不断地思考出新的子问题,从而从不同的角度补充对原始问题的分析。
严格的答案质量评估:对答案质量进行严格评估,并根据反馈不断改进。
可选的拒绝机制:在答案尚未达到高质量标准时,拒绝生成结果,直到消耗完预算token,确保最终输出的答案质量。
当你想着怎么实现”Deep”的话,那很多工程的细节实现其实是自然而言的。
Jina并非完全端到端的系统,原因在于它底层采用的是多轮对话的方式,通过systemmessage和knowledgemessages不断维护一个很长的上下文,而不是像端到端系统那样采用单轮对话的形式,只依赖一条很长的思维链。同时,Jina又不同于死板的工作流模式。在于,Jina将深度搜索抽象为四个核心动作,LLM可以在一个循环中根据上下文动态选择合适的动作。
可以说,Jina在当前技术条件下找到了一个很好的平衡:它既不完全依赖端到端推理(端到端很吃模型的性能),也不完全依赖繁琐的工作流设计(会限制模型的发挥上限)。
本文的核心目的是强调,成功的DeepResearch产品必须能够提供让用户惊喜的深度内容,这才是吸引和留住用户的关键。通过对Jina项目的拆解,期望为大家在设计“深度”搜索产品时提供一些启发和思路。
进技术交流群请添加AINLP小助手微信(id:ainlp2)
请备注具体方向+所用到的相关技术点
关于AINLP
AINLP是一个有趣有AI的自然语言处理社区,专注于AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。