【强烈推荐】深度研究智能体实战教程:从理论到代码实现,助你成为AI专家 什么是深度研究智能体简单来说深度研究智能体Deep Research Agents是能够对预设主题进行深入研究的系统。通常这至少包括以下几个步骤规划研究这可能涉及创建研究报告的提纲该提纲最终将成为系统的输出。拆解任务将上述提纲拆分为可管理的步骤。深入研究对报告的各个部分进行深入研究这意味着需要推理出提供全面分析所需的数据并利用网络搜索工具来支持分析。数据反思反思研究过程中不同步骤生成的数据并改进结果。总结报告总结检索到的数据并撰写最终的研究报告。系统架构下图展示了我们将要构建的系统该系统将执行以下步骤用户提供一个需要研究的查询或主题。大模型LLM将创建一个最终报告的提纲并被指示生成的段落数量不超过某个限制。每个段落的描述将单独输入到一个研究流程中以生成一套全面的信息用于报告构建。研究流程的详细描述将在下一节中阐述。所有信息将进入总结步骤构建最终报告包括结论。报告将以 Markdown 形式交付给用户。深度研究智能体结构示意图研究步骤让我们深入探讨上一段中定义的研究步骤一旦我们有了每个段落的提纲它将被传递给一个大模型LLM以构建网络搜索查询从而尽可能丰富所需信息。LLM 将输出搜索查询及其背后的推理。我们将根据查询执行网络搜索并检索最相关的结果。结果将被传递到反思步骤LLM 将在此处对任何遗漏的细微之处进行推理并尝试提出能够丰富初始结果的搜索查询。这个过程将重复 n次以期获得最佳信息集。研究步骤示意图实现智能体在进入实现阶段之前我们先做一些技术准备。比如准备一些API KEY我这里是直接使用的Deepseek,大家可以替换下下面的api_key和base_urlpip install openai本项目我们将使用未蒸馏的 DeepSeek-R1 版本其参数量为 671B。import osimport openaiclient openai.OpenAI( api_keyos.environ.get(SAMBANOVA_API_KEY), base_urlhttps://preview.snova.ai/v1,)response client.chat.completions.create(modelDeepSeek-R1, messages[{role:system,content:You are a helpful assistant},\ {role:user,content:Tell me something interesting about human species}], temperature1)print(response.choices[0].message.content)您应该会看到类似以下内容thinkOkay, so Im trying to ... REDACTED/thinkThe human species is distinguished by the remarkable cognitive abilities of the brain, which underpin a array of unique traits. Our brains advanced structure and function enable complex thought, language, and social organization. These capabilities have driven innovation, art, and the creation of intricate societies, setting humans apart in their ability to adapt, innovate, and create beyond any other species. This cognitive prowess is the cornerstone of human achievement and our profound impact on the world.答案中将始终包含推理标记。虽然看到思考过程很有趣但我们的系统只需要答案。这时我们可以创建一个清理函数来删除 think 标签之间的所有内容。pythondef remove_reasoning_from_output(output): return output.split(/think)[-1].strip()这个函数简单但实用。这里可以替换为DeepSeek的api情求方式第一部分定义状态首先我们需要定义整个系统的状态该状态将在智能体Agent在环境中运行时不断演进并被系统的不同部分选择性地使用。我们将状态与智能体系统的阶段关联起来中间状态阶段 1将是创建大纲在此阶段报告结构将被规划其状态也会随之演进。我们将从一个空状态开始然后将其演变为类似以下结构推理在阶段 2 中描述{ report_title: 报告标题, paragraphs: [ { title: 段落标题, content: 段落内容, research: ... }, { title: 段落标题, content: 段落内容, research: ... } ]}上述状态可以使用 Python 的dataclasses库优雅地实现如下所示dataclassclass Paragraph: title: str content: str research: Research field(default_factoryResearch)dataclassclass State: report_title:str paragraphs: List[Paragraph] field(default_factorylist)阶段 2是我们将迭代每个段落状态的阶段。我们将更改每个段落的 research字段。我们将使用以下结构来表示每个段落的研究状态{search_history: [{url: 某个 URL, content: 某个内容}],latest_summary: 组合搜索历史的摘要,reflection_iteration: 1} ![](http://cdn.zhipoai.cn/76d96c12.jpg) 研究步骤示意图 search_history我们将所有执行的搜索存储在一个列表中我们将同时需要 URL 和内容以便我们可以对搜索结果进行去重并在稍后形成最终报告时引用这些链接。 latest_summary根据所有搜索结果给出的段落的总结版本。它将用于反思步骤以确定是否需要更多搜索并传递给摘要和报告创建的下一步。 reflection_iteration这用于跟踪当前反思迭代的次数并在达到限制时强制停止。 同样我们可以通过 dataclasses 实现研究状态 plaintext dataclassclass Search: url: str content: str dataclassclass Research: search_history: List[Search] field(default_factorylist) latest_summary: str reflection_iteration: int 0第二部分创建报告大纲不同模型版本在生成答案时的一致性会有所不同。我在 DeepSeek-R1 上进行了大量实验以下提示词似乎能持续生成格式良好的输出output_schema_report_structure { type: array, items: { type: object, properties: { title: {type: string},content: {type: string} } } }SYSTEM_PROMPT_REPORT_STRUCTURE f你是一个深度研究助手。给定一个查询你需要为报告计划一个结构包括要包含的段落。确保段落的顺序合乎逻辑。一旦创建了大纲你将获得工具来分别搜索网络并对每个部分进行反思。使用以下 JSON 模式定义来格式化输出OUTPUT JSON SCHEMA{json.dumps(output_schema_report_structure, indent2)}/OUTPUT JSON SCHEMA“title”和“content”属性将用于更深层次的研究。确保输出是一个 JSON对象并符合上面定义的输出 JSON 模式。只返回 JSON 对象不需要任何解释或额外文本。注意这个提示语可以根据不同的模型效果进行调整段落结构的状态让我们使用上述系统提示词运行一些示例查询response client.chat.completions.create( modelDeepSeek-R1, messages[{role:system,content:SYSTEM_PROMPT_REPORT_STRUCTURE},\ {role:user,content:告诉我一些关于人类物种的有趣事情}], temperature1)print(response.choices[0].message.content)您将得到类似以下内容json[{ title: 人类适应性简介, content: 人类拥有独特的适应能力这对于他们在各种环境中生存和占据主导地位至关重要。本简介将为探索人类适应性的各个方面奠定基础。},...REDACTED...{ title: 结论适应性在人类生存中的作用, content: 适应性一直是人类生存和进化的基石使我们能够面对挑战并探索新领域为未来的潜力提供了深刻见解。}]输出周围的这些 JSON 标签并无帮助因为我们需要将输出转换为 Python 字典。一个非常简单的函数可以删除输出的第一行和最后一行def clean_json_tags(text): return text.replace(json\n, ).replace(\n, )这是经过正确清理的输出json.loads(clean_json_tags(remove_reasoning_from_output(response.choices[0].message.content)))我们现在可以直接将上述内容作为输入到我们的全局状态中。STATE State()report_structure json.loads(clean_json_tags(remove_reasoning_from_output(response.choices[0].message.content)))for paragraph in report_structure: STATE.paragraphs.append(Paragraph(titleparagraph[title], contentparagraph[content]))第三部分Web 搜索工具我们将使用 Tavily 执行网络搜索。我们可以在此处获取您的 Token每个月可以免费1000次搜索对于实验demo足够了该工具非常简单def tavily_search(query, include_raw_contentTrue, max_results5): tavily_client TavilyClient(api_keyos.getenv(TAVILY_API_KEY)) return tavily_client.search(query, include_raw_contentinclude_raw_content, max_resultsmax_results)每次函数调用将返回最多max_results条网络搜索结果每条搜索结果将返回搜索结果的标题。搜索结果的 URL。内容的摘要。如果可能返回页面的完整内容。我们希望获得完整内容以获得最佳结果。一旦我们从 Web 搜索工具中获取结果我们可以直接将其添加到全局状态中无需调用任何 LLM但我们需要确保我们正在更新段落列表中的适当元素。基本上考虑到我们定义的结构{ report_title: 报告标题, paragraphs: [ { title: 段落标题, content: 段落内容, research: ... }, { title: 段落标题, content: 段落内容, research: ... } ]}并且考虑到我们正在研究第i个段落我们需要更新STATE.paragraphs[i].research字段。回顾研究字段的结构search_history: [{url: 某个 URL, content: 某个内容}],latest_summary: 组合搜索历史的摘要,reflection_iteration: 1}下面是一个方便的函数它将根据 Tavily 搜索结果、段落索引和状态对象正确更新状态。def update_state_with_search_results(search_results, idx_paragraph, state): for search_result in search_results[results]: search Search(urlsearch_result[url], contentsearch_result[raw_content]) state.paragraphs[idx_paragraph].research.search_history.append(search) return state我们将追加到搜索历史中。latest_summary和reflection_iteration字段需要 LLM 的一些处理将在第五部分反思中讨论。第四部分规划搜索为了规划第一次搜索我发现以下提示词能持续产生良好的结果input_schema_first_search { type:object, properties: { title: {type: string}, content: {type: string} } }output_schema_first_search {type: object, properties: { search_query: {type: string}, reasoning: {type: string} } }SYSTEM_PROMPT_FIRST_SEARCH f你是一个深度研究助手。你将获得一份报告中的一个段落其标题和预期的内容遵循以下 JSON 模式定义INPUT JSON SCHEMA{json.dumps(input_schema_first_search, indent2)}/INPUT JSON SCHEMA你可以使用一个网络搜索工具它接受“search_query”作为参数。你的任务是反思这个主题并提供最优的网络搜索查询来丰富你当前的知识。使用以下 JSON 模式定义来格式化输出OUTPUT JSON SCHEMA{json.dumps(output_schema_first_search, indent2)}/OUTPUT JSON SCHEMA确保输出是一个 JSON 对象并符合上面定义的输出 JSON 模式。只返回 JSON 对象不需要任何解释或额外文本。我们在输出模式中请求推理只是为了强制模型对查询进行更多思考。虽然这对于推理模型来说可能有些大材小用但对于普通 LLM 来说可能是一个好主意。尽管我们正在为此使用 DeepSeek R1但我们不一定需要。推理模型在深度研究智能体的第一步需要规划报告结构中特别有用。鉴于我们现在已经规划好了一系列包含内容和描述的段落我们可以将第三部分的输出直接输入到提示词中其形式如下response client.chat.completions.create( modelDeepSeek-R1, messages[{role:system,content:SYSTEM_PROMPT_FIRST_SEARCH},{role:user,content:json.dumps(STATE.paragraphs[0])}], temperature1)print(response.choices[0].message.content)STATE.paragraphs[0]指向第一个段落的状态其中research字段仍然为空。我为我的第一个搜索计划得到了以下内容{search_query: 智人特征 基本生物学特征 认知能力 行为特征}我可以直接将查询输入到我的搜索工具中tavily_search(智人特征 基本生物学特征 认知能力 行为特征)第五部分第一次总结第一次总结与即将到来的反思步骤不同因为还没有可供反思的内容而这一步将产生反思的起点。以下提示词效果相对较好input_schema_first_summary { type: object, properties: { title: {type: string}, content: {type: string}, search_query: {type: string}, search_results: { type: array, items: {type: string} } } }output_schema_first_summary { type: object, properties: { paragraph_latest_state: {type: string} } }SYSTEM_PROMPT_FIRST_SUMMARY f你是一个深度研究助手。你将获得一个搜索查询、搜索结果以及你正在研究的报告段落遵循以下 JSON 模式定义INPUT JSON SCHEMA{json.dumps(input_schema_first_summary, indent2)}/INPUT JSON SCHEMA你的任务是作为一名研究员撰写该段落使用搜索结果来与段落主题保持一致并将其适当地组织以包含在报告中。使用以下 JSON 模式定义来格式化输出OUTPUT JSON SCHEMA{json.dumps(output_schema_first_summary, indent2)}/OUTPUT JSON SCHEMA确保输出是一个 JSON 对象并符合上面定义的输出 JSON 模式。只返回 JSON 对象不需要任何解释或额外文本。我们现在需要以以下格式向 LLM 提供数据{ title: 标题,content: 内容, search_query: 搜索查询, search_results: []}我们可以从已有的数据构建 JSON。根据以下搜索结果search_results tavily_search(智人特征 基本生物学特征 认知能力 行为特征)JSON 将如下所示input { title: 人类适应性简介,content: 人类拥有独特的适应能力这对于他们在各种环境中生存和占据主导地位至关重要。本简介将为探索人类适应性的各个方面奠定基础。, search_query: 智人特征 基本生物学特征 认知能力 行为特征, search_results: [result[raw_content][0:20000] for result in search_results[results] if result[raw_content]]}然后我们可以运行response client.chat.completions.create( modelDeepSeek-R1, messages[{role:system,content: SYSTEM_PROMPT_FIRST_SUMMARY},\ {role:user,content:json.dumps(input)}], temperature1)print(remove_reasoning_from_output(response.choices[0].message.content))您将得到类似以下内容{ paragraph_latest_state: 智人即现代人类所属的物种代表了地球生命进化史中独特而迷人的一章。作为智人属中唯一现存的物种智人以其生物学、认知和行为特征的结合而区别于其他灵长类动物和已灭绝的人类近亲。我们的生物学特征包括一个庞大且结构先进的大脑其新皮层与我们的进化祖先相比显著扩张。这种解剖学发展使得卓越的认知能力成为可能例如复杂的解决问题、抽象思维以及语言和符号交流的能力。在行为方面智人展现出复杂的社会结构、文化习俗和技术创新这些在塑造我们适应各种环境和作为一个物种繁荣的能力方面至关重要。这些特征共同强调了定义人类状况的生物学和行为之间复杂的相互作用。}这正是我们将用于更新STATE.paragraphs[0].research.latest_summary字段的内容。在第六部分中我们也将反思段落摘要的不断更新的最新状态。第六部分反思我们现在拥有报告段落内容的最新状态并将利用它来改进内容通过提示我们的 LLM 反思文本并寻找它在起草该段落时可能遗漏的任何角度。以下提示词做得非常出色input_schema_reflection { type: object, properties: { title: {type: string}, content: {type: string}, paragraph_latest_state: {type: string} } }output_schema_reflection { type: object, properties: { search_query: {type: string}, reasoning: {type: string} } }SYSTEM_PROMPT_REFLECTION f你是一名深度研究助手。你负责为研究报告构建全面的段落。你将获得段落标题和计划内容摘要以及你已经创建的段落的最新状态所有这些都遵循以下 JSON 模式定义INPUT JSON SCHEMA{json.dumps(input_schema_reflection, indent2)}/INPUT JSON SCHEMA你可以使用一个网络搜索工具它接受“search_query”作为参数。你的任务是反思当前段落文本的状态思考你是否遗漏了主题的某些关键方面并提供最优的网络搜索查询来丰富最新状态。使用以下 JSON 模式定义来格式化输出OUTPUT JSON SCHEMA{json.dumps(output_schema_reflection, indent2)}/OUTPUT JSON SCHEMA确保输出是一个 JSON 对象并符合上面定义的输出 JSON 模式。只返回 JSON 对象不需要任何解释或额外文本。对于我们当前正在实现的运行输入将如下所示input {paragraph_latest_state: 智人即现代人类所属的物种代表了地球生命进化史中独特而迷人的一章。作为智人属中唯一现存的物种智人以其生物学、认知和行为特征的结合而区别于其他灵长类动物和已灭绝的人类近亲。我们的生物学特征包括一个庞大且结构先进的大脑其新皮层与我们的进化祖先相比显著扩张。这种解剖学发展使得卓越的认知能力成为可能例如复杂的解决问题、抽象思维以及语言和符号交流的能力。在行为方面智人展现出复杂的社会结构、文化习俗和技术创新这在塑造我们适应各种环境和作为一个物种繁荣的能力方面至关重要。这些特征共同强调了定义人类状况的生物学和行为之间复杂的相互作用。, title: 引言, content: 人类物种智人是地球上最独特和迷人的物种之一。本节将介绍人类的基本特征并为探索该物种的有趣方面奠定基础。}像之前一样我们运行以下代码response client.chat.completions.create( modelDeepSeek-R1, messages[{role:system,content: SYSTEM_PROMPT_REFLECTION},\ {role:user,content:json.dumps(input)}], temperature1)print(remove_reasoning_from_output(response.choices[0].message.content))输出如下{ search_query: 关于智人进化的最新研究、与其他人类物种的互动以及促成其成功的因素, reasoning: 当前段落很好地概述了智人的特征但缺乏进化史以及与其他物种互动方面的深度。纳入这些主题的最新研究将增强段落的全面性并提供最新信息。}现在我们运行查询将新结果附加到段落状态并将新结果与最新的段落状态结合起来。第七部分通过反思搜索结果丰富最新段落状态在运行反思步骤的搜索查询后search_results tavily_search(关于智人进化的最新研究、与其他人类物种的互动以及促成其成功的因素)我们可以通过以下方式更新段落的搜索状态update_state_with_search_results(search_results, idx_paragraph, state)现在我们将步骤 6. 和 7. 循环执行指定次数的反思步骤。第八部分总结并生成报告我们对在第二部分中规划的每个段落重复执行第四部分到第七部分的步骤。一旦所有段落的最终状态都准备好我们就可以将所有内容整合起来。我们将使用一个大模型LLM来完成这项工作并生成一个格式精美的 Markdown 文档。以下是提示词input_schema_report_formatting { type: array, items: { type: object, properties: {title: {type: string}, paragraph_latest_state: {type: string} } } }SYSTEM_PROMPT_REPORT_FORMATTING f你是一名深度研究助手。你已经完成了研究并构建了报告中所有段落的最终版本。你将以以下 JSON 格式获取数据INPUT JSON SCHEMA{json.dumps(input_schema_report_formatting, indent2)}/INPUT JSON SCHEMA你的任务是精美地格式化报告并以 Markdown 格式返回。如果报告中没有“结论”段落请根据其他段落的最新状态将其添加到报告末尾。运行report_data [{title: paragraph.title, paragraph_latest_state: paragraph.research.latest_summary} for paragraphin STATE.paragraphs]response client.chat.completions.create( modelDeepSeek-R1, messages[{role:system,content: SYSTEM_PROMPT_REPORT_FORMATTING},\ {role:user,content:json.dumps(report_data)}], temperature1)print(remove_reasoning_from_output(response.choices[0].message.content))就这样我们就获得了一份关于所提供主题的深度研究报告。结论此外还有许多细微之处需要考虑可以使系统更加稳定让系统持续生成格式良好的 JSON 输出并不容易因为推理模型在结构化输出方面并非总能表现最佳。考虑到上述情况在系统拓扑中为不同任务使用不同模型可能更有意义我们主要在第一步需要规划报告结构中真正需要推理模型。在如何搜索网络以及如何对检索到的结果进行排序方面还有许多可以改进的地方。反思步骤的次数可以配置为动态由 LLM 判断是否需要更多反思。我们可以返回在网络搜索中使用的链接并在报告中为每个段落提供参考文献。……运行DeepResearch为了更好看到Deepresearch执行的状态我用大模型帮我写了一个streamlit应用功能很简单就是输入研究主题然后生成研究报告因为之前开源的代码是英文的我加了一个语言检测的小逻辑用来判断是否使用中文提示语以及生成结果为中文。修改之后的代码在这https://github.com/yanqiangmiffy/Agent-Tutorials-ZH/blob/main/deep_research_agent/app.py下面给大家分享一个执行的案例生成报告结构第一步生成报告的大纲目录以及每个部分的研究计划搜索与反思第二步围绕每个章节搜索内容以及生成相关总结生成研究报告基于上面研究结果生成最后报告内容最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】