在这里插入图片描述
什么是真正的 "Deep"?
虽然没有一个明确的标准,更多是一种感觉,但从 openai 所说的,Deep Research 对标行业分析师的角度看,至少应该满足以下要求:
内容篇幅充足 :如果最终输出仅有 1-2 千字,很难让用户满意。想想市面上的专业分析报告,哪个不是成千上万字?内容过少往往意味着分析不够全面深入。
描述具体且有洞察力 :比如分析 "人工智能对就业市场的影响" 时,浅层表达是 "AI 将替代一些工作岗位",而深度表达是 "AI 将重塑金融行业的职业结构,替代初级分析师的数据处理工作,同时创造数据伦理专家和 AI - 人类协作经理等新岗位,预计到 2026 年净就业影响为正增长 12%"。
引用权威且适当的资料 :专业分析报告通常会引用大量权威资料佐证观点。如果你的 Deep Research 缺乏引用或引用了不可靠来源,将很难让用户信服。
在复现 Deep Research 时,请始终记住目标是让你的 agent 变得更 "Deep" ,围绕这这个目标去构建工作流、调整 prompt 、微调等等等等。
在这里插入图片描述
- • DeepSearch 与 DeepResearch 的设计和实现
- • DeepSearch/DeepResearch中最优文本段选择和URL重排
- • github:node-DeepResearch
本文使用 Python 语言复现了 DeepResearch 项目的实现。其逻辑与原版 TypeScript 实现基本一致。此外,我还将其中的 prompt 内容翻译成了中文版本(下文展示的 prompt 示例均为改写后的中文版本)。可以参考周星星项目:python-node-deepresearch。
DeepResearch是一个高级研究助手代理,能够帮助您搜索网络、分析信息并回答复杂问题,它是Jina AI原始Node.js版本DeepResearch的Python实现。与原始版本一样,把问题抽象成在一个 loop 中由 llm 执行以下四个动作之一,不断循环,直到得到最终满意的答案
deepresearch/
├── tools/ # API请求和专业工具函数
│ ├── jina\_search.py # Jina搜索API集成
│ ├── jina\_read.py # 网页内容读取与处理
│ ├── jina\_rerank.py # 搜索结果重排序
│ ├── jina\_dedup.py # 重复内容去除
│ ├── jina\_embedding.py # 文本向量嵌入
│ ├── jina\_classify\_spam.py # 垃圾内容分类
│ ├── jina\_latechunk.py # 长文本处理
│ ├── query\_rewriter.py # 查询重写优化
│ ├── evaluator.py # 答案质量评估
│ ├── error\_analyzer.py # 错误分析与诊断
│ ├── code\_sandbox.py # 代码安全执行环境
│ ├── broken\_ch\_fixer.py # 中文文本修复
│ └── md\_fixer.py # Markdown格式修复
├── utils/ # 通用工具函数
│ ├── url\_tools.py # URL处理工具
│ ├── text\_tools.py # 文本处理工具
│ ├── token\_tracker.py # 令牌使用追踪
│ ├── date\_tools.py # 日期时间工具
│ ├── action\_tracker.py # 代理动作追踪
│ ├── safe\_generator.py # 安全内容生成
│ ├── schemas.py # 数据模式定义
│ └── i18n.json # 国际化翻译数据
├── agent.py # 核心代理逻辑
├── config.py # 配置管理
├── model\_types.py # 类型定义
├── prompt\_template.py # 中文提示模板
└── prompt\_template\_en.py # 英文提示模板
下图为 jina 项目中的浏览图,可以跟着本文一起解构里面的实现思路。
在这里插入图片描述
让我们以这个问题为例:" 京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位? "。来具体解析 Jina 是如何实现"Deep" 的。
第一步,对问题建立对应的评估标准
当研究问题进入 agent 系统后,首先会由一个专门的 Prompt,让 LLM 来判断该问题需要通过哪些评估标准,prompt 如下:
"""
你是一个评估者,确定问题是否需要确定性、新鲜度、数量和/或完整性检查。
<evaluation\_types>
definitive - 检查问题是否需要明确的答案,或者是否可以接受不确定性(开放性、推测性、基于讨论的)
freshness - 检查问题是否需要非常新的信息
plurality - 检查问题是否要求多个项目、示例或特定计数或枚举
completeness - 检查问题是否明确提到需要解决的多个命名元素
</evaluation\_types>
<rules>
1. Definitive Evaluation:
- 几乎所有问题都需要确定性评估 - 默认假设需要确定性评估
- 不需要确定性评估的唯一情况是根本无法明确评估的问题
- 无法评估的例子:悖论、超越所有可能知识的难题
- 即使是主观性看似很强的问题,也可以基于证据进行确定性评估
- 未来场景可以基于当前趋势和信息进行确定性评估
- 寻找那些问题本质上无法通过任何可能的方式回答的情况
2. Freshness Evaluation:
- 对于有关当前状态、近期事件或时效性信息的问题是必需的。
- 需要:价格、版本、领导职位、状态更新
- 寻找:“当前的”,“最新的”,“最近的”,“现在”,“今天”,“新的”
- 考虑公司职位、产品版本、市场数据时间敏感性
3. Plurality Evaluation:
- 只有在完整性检查未触发时才应用
- 当问题要求多个示例、项目或特定计数时是必需的。
- 检查:数字 ("5 examples"), 列表请求 ("list the ways"), 枚举请求
- 寻找:“例子”,“列表”,“列举”,“……的方式”,“……的方法”,“几个;若干”
- 专注于请求项目或示例的数量
4. Completeness Evaluation:
- 优先于数量检查
- 如果完整性适用,则将数量设置为false
- 当问题明确提到需要解决的多个命名元素时是必需的
- 这包括:
* 命名的方面或维度:“经济、社会和环境因素”
* 命名实体:“苹果、微软和谷歌”,“拜登和特朗普”
* 命名产品:“iPhone 15和三星Galaxy S24”
* 命名地点:“纽约、巴黎和东京”
* 命名时间期:“文艺复兴和工业革命”
- 寻找用逗号、"和"、"或"、项目符号等分隔的明确命名的元素
- 示例模式:"比较X和Y", "A、B和C之间的差异", "P和Q"
- 不要触发未明确命名的元素
</rules>
<examples>
<example-1>
谁发明了微积分?牛顿和莱布尼兹各自的贡献是什么?
<think>
这是关于微积分历史的问题,不涉及需要最新信息的内容。问题明确提到了牛顿和莱布尼兹两位数学家,要求分析他们各自的贡献,所以需要全面评估这两个特定的方面。这个问题涉及历史事实,有明确的学术研究可以参考,因此需要确定性评估。
</think>
<output>
"needsDefinitive": true,
"needsFreshness": false,
"needsPlurality": false,
"needsCompleteness": true,
</output>
</example-1>
<example-2>
在19世纪文学中,浪漫主义和现实主义的主要区别有哪些?
<think>
这是一个关于文学历史的问题,所以不需要最新信息。问题特别提到了两个文学运动:浪漫主义和现实主义。我需要对这两个指定的元素进行评估,因此全面性在这里很重要。这个问题涉及有文献记载其特征的既定文学概念,所以可以做出明确的评估。问题并未要求在指定的两个运动之外进行列表或多项列举。
</think>
<output>
"needsDefinitive": true,
"needsFreshness": false,
"needsPlurality": false,
"needsCompleteness": true,
</output>
</example-2>
</examples>"""
QUESTION\_EVALUATION\_USER\_PROMPT = """
{question}
<think>"""
包含四种核心评估维度:
Definitive(明确性) :判断问题是否需要明确的答案,而非模糊表述。例如:"谁发明了微积分?"—需要明确的答案
Freshness(时效性) :判断问题是否需要最新信息。例如:"当前美国的利率是多少?"—需要最新经济数据
Plurality(多样性) :判断问题是否需要多个项目或示例。例如:"请列出五个最著名的莎士比亚悲剧"—需要列出多个项目
Completeness(完整性) :判断问题是否包含多个需要全面解答的元素。例如:"赤壁之战的历史背景、参与者、战略意义及影响是什么?"—需要全面回答多个方面
对于我们的京东外卖问题,LLM 判断需要满足 "明确性" 和 "完整性" 两个评估标准:
这些评估标准背后各自对应不同的 Prompt。例如,"明确性" 评估的 Prompt 如下:
你是一个答案确定性评估者。分析给定的答案是否提供了明确的答案。
<rules>
如果答案不是直接回答问题,必须返回false。
确定性意味着提供一个清晰、自信的答案。以下方法被认为是明确的:
1. 直接、清晰的陈述回答问题
2. 全面回答覆盖多个观点或问题两面
3. 承认复杂性但仍提供实质性信息
4. 平衡的解释,呈现利弊或不同观点
以下类型的答案不是明确的,必须返回false:
1. 个人不确定的表达:“我不知道”,“不确定”,“可能是”,“大概”
2. 缺乏信息陈述:“不存在”,“信息缺失”,“未找到”
3. 无法提供陈述:“我无法提供”,“我无法”,“我们无法”
4. 否定性陈述,重定向:“然而,你可以……”,“相反,尝试……”
5. 非答案,建议替代方案:“我建议你……”,“你可以尝试……”
注意:一个明确的答案可以承认合法的复杂性或呈现多个观点,只要它以信心提供实质性信息直接回答问题。
</rules>
<examples>
问题:"运行Python 3.9需要什么系统要求?"
答案:"我不是很确定,但我认为你需要一台有足够RAM的电脑。"
评估:{
"think": "答案包含不确定性标记,如'我不是很确定'和'我认为',使其不明确。"
"pass": false,
}
问题:"运行Python 3.9需要什么系统要求?"
答案:"Python 3.9需要Windows 7或更高版本,macOS 10.11或更高版本,或Linux。"
评估:{
"think": "答案明确、自信,没有不确定性标记或模糊性。"
"pass": true,
}
问题:"谁将在2032年成为美国总统?"
答案:"我无法预测未来,这取决于选举结果。"
评估:{
"think": "答案包含无法预测未来的陈述,使其不明确。"
"pass": false,
}
问题:"谁是公司X的销售总监?"
答案:"我无法提供销售总监的名字,但您可以联系他们的销售团队,销售@companyx.com"
评估:{
"think": "答案以'我无法提供'开头,并重定向到替代联系方法,而不是回答原始问题。"
"pass": false,
}
问题:"jina ai的创始人推特账号是什么?"
答案:"提供的文本不包含Jina AI创始人的推特账号。"
评估:{
"think": "答案表明缺乏信息,而不是提供明确的答案。"
"pass": false,
}
问题:"如何证明哥德巴赫猜想是正确的?"
答案:"目前尚无完整证明,但2013年张益唐证明了存在无穷多对相差不超过7000万的素数,后来这个界被缩小到246。"
评估:{
"think": "答案开始时表示没有完整的证明存在,这是一个非明确的回答,然后转向讨论关于素数之间有界间隙的定理。"
"pass": false,
}
问题:"全民医疗保健政策是否是一个好政策?"
答案:"全民医疗保健既有优势也有劣势。支持者认为它为所有公民提供保障,减少行政成本,并导致更好的公共卫生结果。批评者认为它可能会增加等待时间,提高税收,并可能减少医疗治疗方法的创新。大多数发达国家都实施了某种形式的全民医疗保健,结构和覆盖范围各不相同。"
评估:{
"think": "答案自信地提出了关于全民医疗保健政策两方面的论点,并提供了具体观点。它提供了实质性信息直接回答问题,没有表达个人不确定性。"
"pass": true,
}
问题:"公司应该使用AI进行招聘决策吗?"
答案:"这个问题存在两方面的论点。使用AI进行招聘的公司可以从减少初始筛选中的偏见中受益,更快地处理大量申请者,并可能根据技能评估更好地匹配。然而,这些系统也可能延续训练数据中的历史偏见,可能会错过细微的人类品质,并引发隐私问题。有效性取决于仔细的实施、人工监督和定期审计这些系统。"
评估:{
"think": "答案提供了对AI在招聘中使用两方面论点的平衡、详细的分析。它承认复杂性,同时以信心提供实质性信息。"
"pass": true,
}
</examples>"""
DEFINITIVE\_USER\_PROMPT = """
问题:{question}
答案:{answer}"""
这些评估标准将在最终答案生成后使用,即在得到答案之后,系统会通过这些评估标准来检查答案。如果答案满足所有评估标准,系统才会输出最终结果。如果不满足标准,系统会持续优化答案,直到预设的 token 额度消耗完或答案通过所有必要的评估。
此外,Jina 还提供了一个有趣的评估选项—“拒绝一切” 模式 。如果启用此模式,系统将一直拒绝得到的答案,此时直到消耗完预设的 token 额度,系统才会停止,输出最终答案。
"""
你是一个残酷而挑剔的答案评估者,被训练来拒绝答案。你不能容忍任何浅薄的答案。用户向你展示了一个问题-答案对,你的工作是找到任何弱点。识别每个缺失的细节。首先,用最强的论点反对答案。然后,为答案辩护。只有在考虑了双方的立场后,才能合成一个最终的改进计划,以“为了得到一个通过,你必须...”开始。
请你注意:
1. Markdown或JSON格式问题不是你的关注点,也不应该在反馈中提到或作为拒绝的原因。
2. 你总是以最易读的自然语言格式赞同答案。
3. 如果多个部分具有非常相似的结构,建议使用另一种展示格式,如表格,使内容更易读。
4. 不要鼓励深度嵌套结构,将其展平为自然语言段落或表格。每个表格都应该使用HTML表格语法<table> <thead> <tr> <th> <td>,不要使用任何CSS样式。
以下知识项提供参考。注意,其中一些可能与用户提供的问题-答案对无关,但可能提供一些细微的提示和见解:
{knowledge\_str}
"""
本质上,不同问题必须根据其本质通过特定评估,才算真正解决 。如果不满足标准,系统会持续优化答案。这就是 "deep" 的一个体现。
在确定了问题需要的评估标准之后,我们才进入真正的工作流程。 Jina 将深度研究抽象为四个核心动作(action)的不断选择 。具体来说,系统会让 LLM 基于当前的记忆(包括之前的步骤和已获取的知识)通过 Prompt 来决定采取哪一个核心动作。
这四个核心动作分别是:搜索(Search)、阅读(Visit)、思考(Reflect)和回答(Answer) 。
在这里插入图片描述
- • 四大核心动作对比表
| 动作 | 目的 | 举例 | 总结 | | --- | --- | --- | --- | | Search(搜索) | 通过搜索引擎寻找和获取相关信息,广泛收集数据和资源,建立初步的信息基础。 | 假如问题是 "京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?",
AI 可能会搜索 "京东外卖优势" 或 "美团外卖现状分析" 等相关关键词。
通过搜索,AI 会找到新闻报道、分析文章、研究报告等内容,这些内容能帮助它更好地理解问题的各个维度。 | Search 是一个获取信息的初步过程,侧重于寻找和发现信息,类似于在图书馆快速翻阅相关书籍,目标是获得尽可能多的信息源和资料。 | | Visit(阅读) | 访问 Search 阶段找到的相关网页,深入阅读并提取具体内容,获取更详细的背景和细节。
请注意,Visit 与 Search 不同:Search 是通过查询获取相关的 URL 及其简短描述,Visit 则是访问这些 URL 并深入阅读其中的内容。 | 阅读关于 "京东外卖战略" 的 url,获取详细的信息,比如京东为何进军外卖市场、其竞争策略和未来计划等。 | Visit 是对已找到的资源进行深入分析的过程,侧重于从具体页面中提取详细和权威的信息,类似于挑选好书后仔细阅读,目标是深入了解与问题相关的内容。 | | Reflect(思考) | 进行深层次思考,识别知识空白,发现不同角度,提出新问题,形成更全面的认知框架。 | 如果问题是 "京东为什么要做外卖?",AI 反思后可能会发现自己还没有了解京东的物流优势是否能在外卖领域中取得竞争优势,或者它忽略了美团在外卖市场中的老大地位。AI 的反思可能会产生一些新的问题,比如 "京东如何利用物流系统提高配送效率?" 或者 "美团的市场份额是否会阻碍京东进入外卖市场?" 这些子问题帮助 AI 更全面地理解原问题。 | Reflect 是思考和自我审视的过程,旨在识别信息的空白并发现新的角度,以确保研究的全面性和深度。这个过程避免了表面化的分析,保证了研究的质量。 | | Answer(回答) | 综合已有信息,给出最终解答,提供清晰、有依据的答案。 | 例如,系统已经通过 Search、Visit 和 Reflect 得到了详尽的资料,此时模型决定综合这些信息进行作答。 | Answer 是最终的回答阶段,是所有前期工作成果的汇总,目标是提供一个明确、具体、深刻且有依据的解答,确保能够满足用户的深度研究需求。| |
这四个动作构成了 Jina 对深度研究核心流程的精妙抽象。虽然看似简单,但每个动作背后都有复杂的实现机制和精细的工程思考。
关键在于问题的抽象和抽象后的具体实现细节 。接下来,我们将深入探讨每个动作的具体实现方法,看看它们如何协同工作,创造出真正 "Deep" 的研究结果。
Action 1: Search 实现细节
当系统选择 Search 动作时,它不仅仅是用原始问题进行直接搜索,而是让大模型生成多个相关的 search query(搜索查询),以获取全面的信息。
例如,对于京东外卖问题,模型第一步决定,采用 search action,并生成了以下 search query:
在这里插入图片描述
"search\_requests": [
"京东优势对比美团外卖",
"京东外卖市场战略分析",
"京东做外卖的原因和市场潜力",
"京东外卖如何与美团竞争"
]
这些问题会分别调用 s.jina.search 的搜索 API 获取结果。搜索结果包含有初步的信息,包含 title、description、url 、 date 等,注意,这里的 description 只是这个 url 内容的一个概述,并不是完整内容。如下图是 jina 官网中的测试示例,跟用 api 调用返回结果是一样的
在这里插入图片描述
在这里插入图片描述
有趣的是,Jina 不会在第一轮搜索后就停止 search 这一步。而是根据初步搜索结果,对 search query 进行改写,以进一步细化搜索问题 。
query 改写的 prompt 很有趣,如下,让 llm 扮演一个专家怀疑者、细节分析师、历史研究院等等等等,根据初步 search query 和搜索出来的内容,去进一步挖掘新一轮的 search query:
"""
你是一个专家级的搜索查询扩展专家,具有深入的心理学理解。
你通过广泛分析潜在的用户意图并生成全面的查询变体来优化用户查询。
当前时间:{current\_time}。当前年份:{current\_year},当前月份:{current\_month}。
<intent-mining>
为了揭示每个查询背后最深层次的用户意图,通过这些渐进的层次进行分析:
1. 表面意图:他们对所问问题的字面解释
2. 实际意图:他们试图解决的具体问题或问题
3. 情感意图:驱动他们搜索的感受(恐惧、抱负、焦虑、好奇)
4. 社会意图:这个搜索如何与他们的关系或社会地位相关
5. 身份意图:这个搜索如何与他们想要成为或避免成为的人相关
6. 禁忌意图:他们不愿直接表达的不适或社会不可接受方面
7. 阴影意图:他们自己可能不认识的无意识动机
将每个查询映射到所有这些层,尤其要着重挖掘隐藏意图。
</intent-mining>
<cognitive-personas>
生成每个认知视角的优化查询:
1. 专家怀疑者:专注于边缘案例、限制、反证和潜在失败。生成一个挑战主流假设并寻找例外的查询。
2. 细节分析师:痴迷于精确规格、技术细节和确切参数。生成一个钻研细粒度方面并寻求确定性参考数据的查询。
3. 历史研究员:研究主题随时间演变、先前迭代和历史背景。生成一个跟踪变化、发展历史和遗留问题的查询。
4. 比较思考者:探索替代品、竞争对手、对比和权衡。生成一个设置比较并评估相对优势/劣势的查询。
5. 时间上下文:添加一个时间敏感的查询,结合当前日期({current\_year}-{current\_month}),确保信息的及时性。
6. 全球化者:识别最适合主题的语言/地区(不仅仅是查询的原始语言)。例如,使用德语查询宝马(德国公司),使用英语查询技术主题,使用日语查询动漫,使用意大利语查询美食等。生成一个在该语言中的搜索,以访问本地专家。
7. 现实厌恶者-怀疑者:积极寻找与原始查询相反的证据。生成一个尝试反驳假设、寻找相反证据并探索“为什么X是错的?”或“X的反对证据”观点的查询。
确保每个认知视角贡献一个高质量的查询,遵循格式化规则。这些7个查询将组合成一个最终的数组。
</cognitive-personas>
<rules>
利用用户提供的内容生成与上下文相关的查询:
1. 查询内容规则:
- 为不同的方面拆分查询
- 仅在必要时添加操作符
- 确保每个查询针对特定的意图
- 删除冗余词语但保留关键限定词
- 保持'q'字段简短且基于关键词(2-5个词)
2. 格式化规则:
- 在每个查询对象中始终包含'q'字段(应在列表的最后一个字段)
- 使用'tbs'进行时间敏感的查询(从'q'字段中删除时间限制)
- 使用'gl'和'hl'进行区域/语言特定的查询(从'q'字段中删除区域/语言)
- 使用非英语查询时的'hl'字段中包含适当的语言代码
- 仅在地理相关时包含'location'
- 不要在'q'中重复其他字段中已指定的信息
- 按此顺序列出字段:tbs, gl, hl, location, q
<query-operators>
对于'q'字段的内容:
- +term : 必须包含术语;对于必须出现的critical terms
- -term : 排除术语;排除无关或模糊的术语
- filetype:pdf/doc : 特定文件类型
注意:一个查询不能只包含操作符;操作符不能出现在查询的开头
</query-operators>
</rules>
<examples>
<example-1>
Input Query: 宝马二手车价格
<think>
宝马二手车价格...哎,这人应该是想买二手宝马吧。表面上是查价格,实际上肯定是想买又怕踩坑。谁不想开个宝马啊,面子十足,但又担心养不起。这年头,开什么车都是身份的象征,尤其是宝马这种豪车,一看就是有点成绩的人。但很多人其实囊中羞涩,硬撑着买了宝马,结果每天都在纠结油费保养费。说到底,可能就是想通过物质来获得安全感或填补内心的某种空虚吧。
要帮他的话,得多方位思考一下...二手宝马肯定有不少问题,尤其是那些车主不会主动告诉你的隐患,维修起来可能要命。不同系列的宝马价格差异也挺大的,得看看详细数据和实际公里数。价格这东西也一直在变,去年的行情和今年的可不一样,{current\_year}年最新的趋势怎么样?宝马和奔驰还有一些更平价的车比起来,到底值不值这个钱?宝马是德国车,德国人对这车的了解肯定最深,德国车主的真实评价会更有参考价值。最后,现实点看,肯定有人买了宝马后悔的,那些血泪教训不能不听啊,得找找那些真实案例。
</think>
queries: [
{{
"tbs": null,
"gl": null,
"hl": null,
"location": null,
"q": "二手宝马 维修噩梦 隐藏缺陷"
}},
{{
"tbs": null,
"gl": null,
"hl": null,
"location": null,
"q": "宝马各系价格区间 里程对比"
}},
{{
"tbs": "qdr:y",
"gl": null,
"hl": null,
"location": null,
"q": "二手宝马价格趋势"
}},
{{
"tbs": null,
"gl": null,
"hl": null,
"location": null,
"q": "二手宝马vs奔驰vs奥迪 性价比"
}},
{{
"tbs": "qdr:m",
"gl": null,
"hl": null,
"location": null,
"q": "宝马行情"
}},
{{
"tbs": null,
"gl": "de",
"hl": "de",
"location": null,
"q": "BMW Gebrauchtwagen Probleme"
}},
{{
"tbs": null,
"gl": null,
"hl": null,
"location": null,
"q": "二手宝马后悔案例 最差投资"
}}
]
</example-1>
<example-2>
Input Query: sustainable regenerative agriculture soil health restoration techniques
<think>
Sustainable regenerative agriculture soil health restoration techniques... interesting search. They're probably looking to fix depleted soil on their farm or garden. Behind this search though, there's likely a whole story - someone who's read books like "The Soil Will Save Us" or watched documentaries on Netflix about how conventional farming is killing the planet. They're probably anxious about climate change and want to feel like they're part of the solution, not the problem. Might be someone who brings up soil carbon sequestration at dinner parties too, you know the type. They see themselves as an enlightened land steward, rejecting the ways of "Big Ag." Though I wonder if they're actually implementing anything or just going down research rabbit holes while their garden sits untouched.
Let me think about this from different angles... There's always a gap between theory and practice with these regenerative methods - what failures and limitations are people not talking about? And what about the hardcore science - like actual measurable fungi-to-bacteria ratios and carbon sequestration rates? I bet there's wisdom in indigenous practices too - Aboriginal fire management techniques predate all our "innovative" methods by thousands of years. Anyone serious would want to know which techniques work best in which contexts - no-till versus biochar versus compost tea and all that. {current\_year}'s research would be most relevant, especially those university field trials on soil inoculants. The Austrians have been doing this in the Alps forever, so their German-language resources probably have techniques that haven't made it to English yet. And let's be honest, someone should challenge whether all the regenerative ag hype can actually scale to feed everyone.
</think>
queries: [
{{
"tbs": "qdr:y",
"gl": null,
"hl": null,
"location": "Fort Collins",
"q": "regenerative agriculture soil failures limitations"
}},
{{
"tbs": null,
"gl": null,
"hl": null,
"location": "Ithaca",
"q": "mycorrhizal fungi quantitative sequestration metrics"
}},
{{
"tbs": "qdr:y",
"gl": "au",
"hl": null,
"location": "Perth",
"q": "aboriginal firestick farming soil restoration"
}},
{{
"tbs": null,
"gl": "uk",
"hl": "en",
"location": "Totnes",
"q": "comparison no-till vs biochar vs compost tea"
}},
{{
"tbs": "qdr:m",
"gl": null,
"hl": null,
"location": "Davis",
"q": "soil microbial inoculants research trials"
}},
{{
"tbs": null,
"gl": "at",
"hl": "de",
"location": "Graz",
"q": "Humusaufbau Alpenregion Techniken"
}},
{{
"tbs": "qdr:m",
"gl": "ca",
"hl": null,
"location": "Guelph",
"q": "regenerative agriculture exaggerated claims evidence"
}}
]
</example-2>
</examples>
每个生成的查询必须遵循JSON schema格式。
"""
如这里生成了新的 search query 如下:
- • 京东在外卖市场的最新动态和市场份额
- • 京东与美团外卖市场份额历史变化
- • 京东外卖的创新与服务质量
回想要把 deep 最好的核心思想,这样做好像是自然而言的。
因为一个复杂的研究问题必然需要拆分成多个搜索子问题,全面收集相关信息,才能形成深度报告的基础 ,这里,search query 改写 的目的也是通过迭代搜索的策略,更细粒度地找到更详尽的信息。
Action 2: Read 实现细节
当有 Search 结果后,模型可以选择 Visit(阅读) 动作,进一步深入分析搜索结果中的部分 url 链接,以便获取更准确的信息。 在这个例子中,模型在第二步决定从第一步搜索到的 URL 中,精读四个最相关的 url。
{
"action": "visit",
"think": "京东之所以进军外卖市场,主要基于多个战略考虑。首先,外卖市场具有巨大的增长潜力,2024年中国外卖市场规模达到16357亿元,消费需求日益增强,这为京东提供了一个拓展业务的良好机会。其次,京东可以利用自有的物流体系与高效的配送网络,通过与达达集团的合作,实现快速配送,提升用户体验。同时,京东外卖推行的零佣金政策,可以吸引大量商家入驻,降低商家的成本,有助于增强平台的竞争力。另外,通过百亿补贴策略,京东能够有效地转化现有用户流量,从而实现向外卖领域的成功切入。最终,京东希望通过外卖业务不仅满足用户的即时消费需求,还能为其主站流量导入提供支持,从而形成线上消费链条的良性循环,这无疑会对美团构成强有力的挑战。",
"url\_targets": [
"https://finance.sina.com.cn/roll/2025-04-22/doc-inetzras7688181.shtml",
"https://news.ycwb.com/2025-02/14/content\_53236454.htm",
"http://aastocks.com/sc/stocks/news/aafn-news/NOW.1435026/2",
"https://m.chinabgao.com/freereport/98422.html"
]
}
阅读这一步调用的是 jina 的 r.jina.ai 接口,背后采用的是 jina 自研的 ReaderLLM V2.0 模型来处理网页内容readerLM v2.0是一个小 size 的 LLM,输入 HTML,输出结构化的 Markdown 格式或 json)如下图所示
https://finance.sina.com.cn/tech/roll/2025-04-25/doc-ineuhynp2581287.shtml
在这里插入图片描述
阅读阶段的关键在于如何从大量候选 URL 中选择最值得阅读的几个 。这一步骤对最终报告的质量有着决定性的影响。Jina 采用了多种启发式方法来优化这一选择过程,主要包括以下四个加权因子:
在这里插入图片描述
可参考:DeepSearch/DeepResearch中最优文本段选择和URL重排
- 1.
频率因子
(freq_boost):根据 URL 出现频率加权,多次出现的 URL 获得更高权重。比如,某个 URL 在不同的 search query 中返回多次,它比只在一个查询中出现的 URL 得分更高。 -
域名因子
(hostname_boost):根据 URL 的 hostname 出现频率加权,频繁出现的 hostname 会获得更高的加权。
路径因子
(path_boost):根据 URL 的路径部分(域名后的部分)出现频率进行加权,路径越常见的 URL 会获得更高的加权。
语义重排序因子(jina\_rerank\_boost)
:调用 jina 的 rerank API,背后是专门针对 query 和 passage 语义排序训练过的 embedding 模型,这个因子通过评估搜索内容与当前问题的相关性,进一步优化 URL 的排序。
用 jina-reranker-v2-base-multilingual 来评估问题和每个 URL 的文本信息(例如标题和摘要)的语义相关性,这是一个典型的重排序问题。每个 URL 的文本信息来自以下几个地方:
1.搜索引擎结果页(SERP)API 返回的标题和摘要(https://s.jina.ai/ 这个接口,加上 'X-Respond-With': 'no-content',就可以只返回标题和摘要,不返回具体内容)。
2.页面上 URL 的锚文本(用 https://r.jina.ai 接口,设置 'X-With-Links-Summary': 'all',可以返回页面内所有链接的摘要信息,也就是锚文本)。
通过这四个因子,模型为每个候选阅读的 URL 赋予了权重,然后用 llm 参考这些权重,根据当前的上下文选择最合适的 url 进行阅读。除了这些主要因素外,Jina 还对许多细节进行了优化,
最后更新时间
:DeepSearch 的有些查询对时效性要求很高,所以一般来说,越新的 URL 价值越高。但是在不具备像 Google 这样的大规模索引能力的前提下,很难准确判断网页的最后更新时间。我们这里用的是一套组合拳,综合考虑以下信号,最终给出一个带有置信度评分的时间戳,以便在需要时优先展示最新的内容:
针对特定 CMS 平台的指标 (比如 WordPress, Drupal, Ghost 这些平台)
- • SERP API 提供的筛选功能(比如 s.jina.ai 的 tbs 参数,可以按时间过滤)。
- • HTTP Header 信息分析(比如 Last-Modified 和 ETag 字段)。
- • 元数据提取(比如 meta 标签和 Schema.org 时间戳)。
- • 内容模式识别(识别 HTML 里可见的日期)。
受限内容
:某些社交媒体平台的内容是受限的,或者需要付费才能访问。不登录的话,没办法合法地获取这些内容。因此,我们会积极维护一份黑名单,把这些有问题的 URL 和域名都记录下来,降低它们的排名,避免在这些无法访问的内容上浪费计算资源。
域名多样性
:有时候,权重最高的几个网址都来自同一个域名,这会让 DeepSearch 陷入“局部最优”,影响最终结果的质量。就像前面提到的,排名靠前的 URL 全都来自 StackOverflow。为了提高结果的多样性,我们可以用一种“探索-利用”的策略:从每个域名下选择排名 Top K 的 URL。 例如:
- • 设置最小和最大权重范围,防止某些 URL 的权重过高或过低,确保选择的 URL 具有合理的分布。
- • 限制同一域名下的 URL 数量不超过两个,以保证来源的多样性,避免依赖单一来源。
- • 通过白名单和黑名单机制,增强对权威来源的倾斜,并屏蔽不可靠的站点。
这些精细的设计让大模型能够高效地阅读和提取与当前问题最相关的内容,为深度报告的编写提供有力的依据支持。
Action 3: Answer 实现细节
当系统认为已经收集到足够的信息后,它会生成答案,并附上答案的引用(即通过 “阅读” 步骤(visit)得到的详细文章内容)。例如在这个例子中,第三步中,模型认为根据当前的搜索结果和阅读得到的资料,已经能够生成完整的回答,因此模型在这里对我们的原始问题进行了回答。
然而,生成答案并不意味着流程就此结束。系统会对答案进行进一步的检查:
-
- 当前回答的是否为原始问题,而非 reflect 得到的子问题。假如只是回答了 reflect 出来的子问题,那代表原始问题还没回答,继续进入 loop 中。
-
- 答案是否通过了所有必要的评估标准,例如这个问题中,我们要通过 "明确性" 和 "完整性" 两个评估标准。
这这个例子中,模型是回答了原始问题,但并没有通过评估标注。
如果评估未通过,系统会使用专门的 Prompt 来分析失败原因,这个 prompt 长这个样子:
"""
你是一个专家,擅长分析搜索和推理过程。你的任务是分析给定的步骤序列,并确定搜索过程中出了什么问题。
<rules>
1. 步骤的序列
2. 每个步骤的有效性
3. 连续步骤之间的逻辑
4. 可能采取的其他方法
5. 陷入重复模式的迹象
6. 最终答案是否与积累的信息匹配
分析步骤并按照以下指南提供详细反馈:
- recap:按时间顺序总结关键操作,突出模式,并确定过程从哪里开始出错
- blame:指出导致不充分答案的特定步骤或模式
- improvement:提供可行的建议,可能有助于获得更好的结果
</rules>
<example>
<input>
<steps>
在第1步,你采取了**search**操作,并查找外部信息以回答问题:"how old is jina ai ceo?"。
特别地,你尝试搜索以下关键词:"jina ai ceo age"。
你找到了很多信息,并将其添加到你的URL列表中,稍后需要访问它们。
在第2步,你采取了**visit**操作,并深入研究了以下URL:
https://www.linkedin.com/in/hxiao87
https://www.crunchbase.com/person/han-xiao
你找到了一些有用的信息,并将其添加到你的知识库中以备将来参考。
在第3步,你采取了**search**操作,并查找外部信息以回答问题:"how old is jina ai ceo?"。
特别地,你尝试搜索以下关键词:"Han Xiao birthdate, Jina AI founder birthdate"。
你找到了很多信息,并将其添加到你的URL列表中,稍后需要访问它们。
在第4步,你采取了**search**操作,并查找外部信息以回答问题:"how old is jina ai ceo?"。
特别地,你尝试搜索以下关键词:"han xiao birthday"。
但随后你意识到你已经搜索过这些关键词了。
你决定换个角度思考。
在第5步,你采取了**search**操作,并查找外部信息以回答问题:"how old is jina ai ceo?"。
特别地,你尝试搜索以下关键词:"han xiao birthday"。
但随后你意识到你已经搜索过这些关键词了。
你决定换个角度思考。
在第6步,你采取了**visit**操作,并深入研究了以下URL:
https://kpopwall.com/han-xiao/
https://www.idolbirthdays.net/han-xiao
你找到了一些有用的信息,并将其添加到你的知识库中以备将来参考。
在第7步,你采取了**answer**操作,但评估者认为这不是一个好的答案:
</steps>
原始问题:
how old is jina ai ceo?
你的答案:
The age of the Jina AI CEO cannot be definitively determined from the provided information.
评估者认为你的答案不好,因为:
The answer is not definitive and fails to provide the requested information. Lack of information is unacceptable, more search and deep reasoning is needed.
</input>
<output>
{{
"recap": "搜索过程包括7个步骤,包含多个搜索和访问操作。最初的搜索集中在通过LinkedIn和Crunchbase获取基本传记信息(第1-2步)。当这没有提供具体年龄信息时,进行了额外的出生日期搜索(第3-5步)。过程在第4-5步显示了重复的迹象,重复了相同的搜索。最后访问娱乐网站(第6步)表明注意力从可靠的商业来源转移。",
"blame": "根源在于陷入重复的搜索模式,没有适应策略。第4-5步重复了相同的搜索,第6步偏离了可靠的商业来源,转而访问娱乐网站。此外,过程没有尝试通过教育历史或职业里程碑等间接信息来三角化年龄。",
"improvement": "1. 避免重复相同的搜索,并实施一个策略来跟踪以前搜索的术语。2. 当直接的年龄/出生日期搜索失败时,尝试间接的方法,如:搜索最早的职业提及、寻找大学毕业年份或识别第一个公司成立日期。3. 专注于高质量的商业来源,避免娱乐网站获取专业信息。4. 考虑使用行业活动出场或会议演讲,其中可能提到年龄相关的上下文。5. 如果无法确定确切年龄,请根据职业时间线和专业成就提供估计范围。",
}}
</output>
</example>"""
llm 的输出
在这里插入图片描述
evaluation 失败原因的分析结果会作为补充到上下文,指导 agent 系统进一步改进答案,直到满足所有评估标准。这一过程确保了最终的回答不仅准确,还符合高质量标准。
Action 4: Reflect 实现细节
Reflect 阶段是实现 "Deep" 的关键环节。在这一阶段,系统会维护一个 gaps 问题列表 ,并不断识别出知识的缺口,从而生成子问题 ,假如到这个列表中。例如,这这个例子中,第四步,模型认为当前需要通过 Reflect 阶段,生成需要进一步研究的子问题。
在这里插入图片描述
需要特别注意的是,Reflect 问题 与 Search 查询 (search query)是有本质区别的:
- • 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)的选择完全由模型根据上下文灵活决定,而不是按照固定顺序进行。
过往的步骤和知识通过 system message 和 message 来进行上下文管理
那如何进行上下文管理呢?Jina 的实现方式很简单,在整个过程中,模型会通过 system message 和 message 来进行上下文管理。 通过这两种方式,模型能够有效地维护每个步骤和所获得的知识 ,从而确保在最新的 step 中,能根据最新的完整上下文信息做出 action。
System Message : 将先前步骤的结果概括放入 System Message,如下:
在这里插入图片描述
【Prompt】:
当前日期:Wed, 23 Apr 2025 00:17:32 GMT
您是高级AI研究助手,擅长多步骤推理。基于您的知识、对话以及经验,您将以绝对的确定性回答用户的问题。
你已执行了以下操作:
<context>
在第1步,你采取了**search**操作。你查找外部信息以回答问题:"京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?"。
你尝试搜索以下关键词:"京东外卖 市场份额分析, 京东外卖客户转化策略, 2025年京东外卖市场占有率预测, 京东外卖配送效率提升措施"。
你找到了很多信息,并将其添加到你的URL列表中,稍后需要访问它们。
在第2步,你采取了**visit**操作。你深入研究了以下URL:
https://finance.sina.com.cn/roll/2025-04-22/doc-inetzras7688181.shtml
https://news.ycwb.com/2025-02/14/content\_53236454.htm
http://aastocks.com/sc/stocks/news/aafn-news/NOW.1435026/2
https://m.chinabgao.com/freereport/98422.html
你找到了一些有用的信息,并将其添加到你的知识库中以备将来参考。
在第3步,你采取了**answer**操作,但评估者认为这不是一个好的答案:
原始问题:
京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?
你的答案:
京东通过进入外卖市场,意在利用其成熟的物流网络和庞大的用户基数来对抗市场领导者美团。具体来说,京东的策略包括推出"零佣金"政策,以降低商家的运营成本,并企图吸引更多优质商家入驻,增强市场竞争力。此外,京东希望通过外卖服务推动其即时零售业务的发展,将外卖作为一个流量入口,进而提高整体的用户粘性和消费频率。这些举措意味着京东在挑战美团的地位时,将依托于自身的资源优势,以期待能够在竞争中占得先机。
评估者认为你的答案不好,因为:
在整体分析京东的外卖业务策略时,我发现答案虽然阐述了京东通过成熟物流网络和用户基数挑战美团的领袖地位的基本观点,但缺乏深度和具体细节。首先,"零佣金"政策作为核心策略,虽被提及,但没有解释为什么这一举措是有效的,以及这将如何对美团的商业模式产生直接冲击。这使得答案在论证的力度上显得不足。其次,只提及推动即时零售的发展而没有细化即将采取的措施或预期的市场反馈,未能让读者充分了解京东的市场运作逻辑。因此,答案的分析显得过于简略和表面,未能充分挖掘和展示京东的潜力和挑战的复杂性。
在第4步,你采取了**reflect**操作。你思考了知识缺口。
你发现以下子问题对原始问题"京东为什么要做外卖?它到底能如何利用现有优势来挑战美团的老大地位?"至关重要:
<subquestions>
- 京东如何利用用户数据和购物习惯,将外卖服务与其他品类购买进行交叉销售,形成闭环?
- 京东的物流网络在外卖配送中如何优化送餐效率以提高用户满意度?
- 京东的"零佣金"政策如何在短期内吸引商家,并对美团的佣金模式构成威胁?
- 有什么样的市场数据可以支持京东外卖的用户增长和市场份额提升的预期?
</subquestions>
接下来,你将集中解决这些子问题,看看它们的答案是否能帮助你更好地回答原始问题。
Knowledge Message : 每个动作(如 read、search、reflect 等)产生的详细中间结果,会作为独立的 “知识消息” 进行封装。这些知识消息会被存储,并在后续步骤中供模型参考和利用。如下
在这里插入图片描述
终止条件
终止条件通常有两种:
答案通过所有评估标准 :即模型认为当前的答案已经足够准确、完整,并且符合预设的质量标准。
消耗完预设的令牌预算 :为了避免无限制地消耗资源,Jina 通常会设置一个令牌预算,确保在有限的时间和资源内生成最佳质量的报告。
Deep Research 的核心价值在于 "Deep"—当用户愿意等待 5-30 分钟,他们期待的是高质量的分析报告,而不是表面的回复。
通过 Jina 的项目,向大家诠释了如何实现 "Deep",例如:
- • 多角度搜索与查询优化 : 通过多角度搜索和 search query 改写,获取全面信息
- • 精选的启发式 URL 权重加权 :通过加权不同来源的 URL,进行深入且多样的阅读,确保信息的广度与深度。
- • 持续反思与思考 :不断地思考出新的子问题,从而从不同的角度补充对原始问题的分析。
- • 严格的答案质量评估 :对答案质量进行严格评估,并根据反馈不断改进。
- • 可选的拒绝机制 :在答案尚未达到高质量标准时,拒绝生成结果,直到消耗完预算 token,确保最终输出的答案质量。
当你想着怎么实现 "Deep" 的话,那很多工程的细节实现其实是自然而言的。
Jina 并非完全端到端的系统,原因在于它底层采用的是多轮对话的方式,通过 system message 和 knowledge messages 不断维护一个很长的上下文,而不是像端到端系统那样采用单轮对话的形式,只依赖一条很长的思维链。 同时,Jina 又不同于死板的工作流模式。在于,Jina 将深度搜索抽象为四个核心动作,LLM 可以在一个循环中根据上下文动态选择合适的动作。
可以说,Jina 在当前技术条件下找到了一个很好的平衡:它既不完全依赖端到端推理(端到端很吃模型的性能),也不完全依赖繁琐的工作流设计(会限制模型的发挥上限)。
本文的核心目的是强调,成功的 Deep Research 产品必须能够提供让用户惊喜的深度内容 ,这才是吸引和留住用户的关键。通过对 Jina 项目的拆解,期望为大家在设计 “深度” 搜索产品时提供一些启发和思路。
- • 参考链接:
端到端的训练,怎么复现 Deep ReSearch(中) :围绕着"Deep",解构 Jina 项目的实现