openai agent第二弹:deepresearch原理介绍

文章目录

  • 技术原理
  • 类似开源项目
    • OpenDeepResearcher
    • open-deep-research
    • ollama-deep-researcher
    • smolagents的open_deep_research
  • 参考资料

2月2日openai上线了第二个agent: deep research,具体功能类似24年11月google gemini发布的deep research。

技术原理

deep research 使用端到端强化学习,训练模型在不同领域推理和复杂浏览任务的能力;这种方法的核心原则是,模型学会自主规划和执行多步骤过程以找到相关数据,包括基于实时信息进行回溯和适应的能力。此过程允许模型处理诸如浏览用户上传的文件、生成和细化图形以及引用网络来源等任务。

类似开源项目

OpenDeepResearcher

开源地址:https://github.com/mshumer/OpenDeepResearcher

该项目侧重于用asyncio和aiohttp进行异步编程和请求响应,以此项目为例,具体进行深度研究的流程如下:

  1. 根据用户输入的研究主题,生成多个相关的query:
async def generate_search_queries_async(session, user_query):"""Ask the LLM to produce up to four precise search queries (in Python list format)based on the user’s query."""prompt = ("You are an expert research assistant. Given the user's query, generate up to four distinct, ""precise search queries that would help gather comprehensive information on the topic. ""Return only a Python list of strings, for example: ['query1', 'query2', 'query3'].")messages = [{"role": "system", "content": "You are a helpful and precise research assistant."},{"role": "user", "content": f"User Query: {user_query}\n\n{prompt}"}]response = await call_openrouter_async(session, messages)if response:try:# Expect exactly a Python list (e.g., "['query1', 'query2']")search_queries = eval(response)if isinstance(search_queries, list):return search_querieselse:print("LLM did not return a list. Response:", response)return []except Exception as e:print("Error parsing search queries:", e, "\nResponse:", response)return []return []
  1. 根据多个query,异步式调用搜索引擎API,获取相关网页的url或文本text;

async def perform_search_async(session, query):"""Asynchronously perform a Google search using SERPAPI for the given query.Returns a list of result URLs."""params = {"q": query,"api_key": SERPAPI_API_KEY,"engine": "google"}try:async with session.get(SERPAPI_URL, params=params) as resp:if resp.status == 200:results = await resp.json()if "organic_results" in results:links = [item.get("link") for item in results["organic_results"] if "link" in item]return linkselse:print("No organic results in SERPAPI response.")return []else:text = await resp.text()print(f"SERPAPI error: {resp.status} - {text}")return []except Exception as e:print("Error performing SERPAPI search:", e)return []
  1. 处理网页链接link:
async def process_link(session, link, user_query, search_query):"""Process a single link: fetch its content, judge its usefulness, and if useful, extract the relevant context."""print(f"Fetching content from: {link}")page_text = await fetch_webpage_text_async(session, link)if not page_text:return Noneusefulness = await is_page_useful_async(session, user_query, page_text)print(f"Page usefulness for {link}: {usefulness}")if usefulness == "Yes":context = await extract_relevant_context_async(session, user_query, search_query, page_text)if context:print(f"Extracted context from {link} (first 200 chars): {context[:200]}")return contextreturn None
  1. 使用llm as a judge,根据之前获取的内容,判断是否还需要补充新的query来查询内容;

async def get_new_search_queries_async(session, user_query, previous_search_queries, all_contexts):"""Based on the original query, the previously used search queries, and all the extracted contexts,ask the LLM whether additional search queries are needed. If yes, return a Python list of up to four queries;if the LLM thinks research is complete, it should return ""."""context_combined = "\n".join(all_contexts)prompt = ("You are an analytical research assistant. Based on the original query, the search queries performed so far, ""and the extracted contexts from webpages, determine if further research is needed. ""If further research is needed, provide up to four new search queries as a Python list (for example, ""['new query1', 'new query2']). If you believe no further research is needed, respond with exactly .""\nOutput only a Python list or the token  without any additional text.")messages = [{"role": "system", "content": "You are a systematic research planner."},{"role": "user", "content": f"User Query: {user_query}\nPrevious Search Queries: {previous_search_queries}\n\nExtracted Relevant Contexts:\n{context_combined}\n\n{prompt}"}]response = await call_openrouter_async(session, messages)if response:cleaned = response.strip()if cleaned == "":return ""try:new_queries = eval(cleaned)if isinstance(new_queries, list):return new_querieselse:print("LLM did not return a list for new search queries. Response:", response)return []except Exception as e:print("Error parsing new search queries:", e, "\nResponse:", response)return []return []
  1. 让llm根据之前搜集的资料,编写report:
async def generate_final_report_async(session, user_query, all_contexts):"""Generate the final comprehensive report using all gathered contexts."""context_combined = "\n".join(all_contexts)prompt = ("You are an expert researcher and report writer. Based on the gathered contexts below and the original query, ""write a comprehensive, well-structured, and detailed report that addresses the query thoroughly. ""Include all relevant insights and conclusions without extraneous commentary.")messages = [{"role": "system", "content": "You are a skilled report writer."},{"role": "user", "content": f"User Query: {user_query}\n\nGathered Relevant Contexts:\n{context_combined}\n\n{prompt}"}]report = await call_openrouter_async(session, messages)return report

open-deep-research

开源地址: https://github.com/nickscamara/open-deep-research

使用ts开发的一款AI应用,采用firecrawl提取和搜索网页,用微调的o3模型进行深度推理;

ollama-deep-researcher

开源地址:https://github.com/langchain-ai/ollama-deep-researcher

基于langgraph开发,使用ollama本地部署deepseek-r1的8b版本作为深度推理模型,用TAVILY或PERPLEXITY的搜索服务API;

smolagents的open_deep_research

开源地址:https://github.com/huggingface/smolagents/tree/main/examples/open_deep_research

基于huggingface的smolagents开发的deep research agent;

参考资料

https://openai.com/index/introducing-deep-research/
https://jina.ai/
https://openrouter.ai/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql:数据库

Mysql 一、数据库概念?二、MySQL架构三、SQL语句分类四、数据库操作4.1 数据库创建4.2 数据库字符集和校验规则4.3 数据库修改4.4 数据库删除4.4 数据库备份和恢复其他 五、表操作5.1 创建表5.2 修改表5.3 删除表 六、表的增删改查6.1 Create(创建):数据新增1&#…

2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. …

开工了,搬砖了!

今天是正月初八,正式搬砖了。地铁还是空荡荡的,显然很多小伙伴春节假期还没有结束。往年上班时间也是正月初十左右,每次看到身边的人都返程了,心理总有些许不安,就好像人只有忙碌起来才显得生命和时间都是可贵的&#…

gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

gesp(C六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走 题目描述 小杨有一棵包含无穷节点的二叉树(即每个节点都有左儿子节点和右儿子节点;除根节点外,每个节点都有父节点)&#…

51单片机看门狗系统

在 STC89C52 单片机中,看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定,但是它在头文件中并未给出,因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

HTML排版标签、语义化标签、块级和行内元素详解

目录 前言 一、HTML中的排版标签 1. 文本相关标签 1.1 标题标签 ~ 1.2 段落标签 1.3 强调和加粗 1.4 换行标签 1.5 水平线标签 二、HTML中的语义化标签 2.1 语义化标签概述 2.2 常见的语义化标签 示例(核心代码部分): 三、HTM…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows,根据自己的系统下载安装包,如果是Windows系统,下载Windows版本。 1.1 Linux系统 (这个是因为运行遇到报错了,想自己记录一下解决方法&a…

DeepSeek R1 x ApiSmart

根据美国业界的说法:如果一个模型能够在生成良好代码方面表现更出色,那么通常它也能对非代码生成类型的其他用户查询产生更好的答案。 在AI编程领域,市面上已有多款大模型和工具供我们选择。常见的有OpenAI系列模型、Claude 3.5 Sonnet&#…

解决threeJS加载obj gltf和glb模型后颜色太暗的方法

网上找到的部分解决方法 网上找到的部分解决方法 咱们有时候去glb官方下载glb或gltf模型时候,模型显示太黑 其实通过查找后不难发现网上给出了很多解决方法,但是大部分都无法从根本上解决问题。我之前看到有一篇文章对gltf的解决方法是让gltf增加自发光…

GitHub Copilot 越狱漏洞

研究人员发现了两种操控 GitHub 的人工智能(AI)编码助手 Copilot 的新方法,这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中,利用 AI 的问答能力,使其产生恶意输…

动态规划练习八(01背包问题)

一、问题介绍与解题心得 01背包问题就是每个物品数量只有一个,每个物品可以取或不取,来达到收益最大,或者收益在某个值。 限制条件:背包容量有限,物品个数只有1个 解决问题:从价值入手(价值最…

Java实习生面试题汇总

Java实习生面试题汇总 简介 本人是二本大三学生,下半年大四。暑假在上海这边找实习工作,面了几家公司,所问到的问题记录在下面。 因为是在校生,没任何实习经历,一般找我面试的都是小公司,一般问的比较简…

开源安全一站式构建!开启企业开源治理新篇章

在如今信息技术日新月异、飞速发展的数字化时代,开源技术如同一股强劲的东风,为企业创新注入了源源不断的活力,然而,正如一枚硬币有正反两面,开源技术的广泛应用亦伴随着不容忽视的挑战。安全风险如影随形,…

xxl-job 自定义告警短信发送

官方介绍 代码实现 实现 JobAlarm 重写 doAlarm 方法 Component public class SmsJobAlarm implements JobAlarm {Overridepublic boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {boolean alarmResult true;// 简单内容,根据业务自行修改String template …

大数据学习之Spark分布式计算框架RDD、内核进阶

一.RDD 28.RDD_为什么需要RDD 29.RDD_定义 30.RDD_五大特性总述 31.RDD_五大特性1 32.RDD_五大特性2 33.RDD_五大特性3 34.RDD_五大特性4 35.RDD_五大特性5 36.RDD_五大特性总结 37.RDD_创建概述 38.RDD_并行化创建 演示代码: // 获取当前 RDD 的分区数 Since ( …

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面:简化调用复杂性2. 系统层面:屏蔽客户端调用差异3. 其他方面: 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1:同步阻塞处理2. Zuul2:异步非阻塞处理 三…

3.【BUUCTF】XSS-Lab1

进入题目页面如下 好好好&#xff0c;提示点击图片&#xff0c;点进去页面如下&#xff0c;且url中有传参&#xff0c;有注入点 发现题目给出了源码 查看得到本题的源码 分析一下代码 <!DOCTYPE html><!--STATUS OK--> <!-- 声明文档类型为 HTML5&#xff0c;告…

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码&#xff0c;一步一步来 第一步&#xff1a; 找到根目录下的 pages.json 文件&#xff0c;在 tabBar 中把 custom 设置为 true&#xff0c;默认值是 false。list 中设置自定义的相关信息&#xff0c; pagePath&#x…

105,【5】buuctf web [BJDCTF2020]Easy MD5

进入靶场 先输入试试回显 输入的值成了password的内容 查看源码&#xff0c;尝试得到信息 什么也没得到 抓包&#xff0c;看看请求与响应里有什么信息 响应里得到信息 hint: select * from admin where passwordmd5($pass,true) 此时需要绕过MD5&#xff08;&#xff09;函…

JVM监控和管理工具

基础故障处理工具 jps jps(JVM Process Status Tool)&#xff1a;Java虚拟机进程状态工具 功能 1&#xff1a;列出正在运行的虚拟机进程 2&#xff1a;显示虚拟机执行主类(main()方法所在的类) 3&#xff1a;显示进程ID(PID&#xff0c;Process Identifier) 命令格式 jps […