OpenAI Responses API深度解析:比Chat Completions更强的下一代接口
写在前面
2026年初,OpenAI悄悄推出了一个改变游戏规则的新接口:Responses API。如果你还在用chat.completions.create()写AI应用,这篇文章值得认真看完——Responses API不是小升级,它是OpenAI对"如何正确构建AI应用"的重新思考。—## 一、Responses API vs Chat Completions:核心区别### 从"无状态"到"有状态"Chat Completions API每次调用都是独立的,开发者必须自己维护对话历史,每次请求都把所有历史消息传过去。这会带来:- 上下文窗口消耗大- 对话历史管理复杂- 多轮对话成本线性增长Responses API引入了服务端会话管理:pythonfrom openai import OpenAIclient = OpenAI()# 第一轮对话response = client.responses.create( model="gpt-4.1", input="请介绍一下Transformer架构的核心原理")print(response.output_text)response_id = response.id # 保存这个ID# 第二轮对话,只需传入上一次的response_idresponse2 = client.responses.create( model="gpt-4.1", previous_response_id=response_id, # 关键! input="它和RNN相比有什么优势?")print(response2.output_text)# 模型会记住上一轮关于Transformer的对话内容OpenAI服务端自动维护对话状态,你只需要保存response.id。### 内置工具调用(Built-in Tools)Chat Completions需要开发者自己实现工具的执行逻辑,Responses API提供了OpenAI官方托管的工具:pythonresponse = client.responses.create( model="gpt-4.1", tools=[ {"type": "web_search_preview"}, # 实时网络搜索 { "type": "file_search", # 文件/知识库搜索 "vector_store_ids": ["vs_abc123"] }, {"type": "code_interpreter"} # 代码执行环境 ], input="分析一下最近一周的AI领域重大新闻,并用Python生成一个词频统计图")这三个内置工具由OpenAI负责执行,结果自动回传给模型,开发者无需编写任何工具执行代码。—## 二、核心功能详解### 2.1 Web Search(实时联网搜索)pythonresponse = client.responses.create( model="gpt-4.1", tools=[{ "type": "web_search_preview", "search_context_size": "high" # low/medium/high,控制搜索深度 }], input="2026年4月最新的大模型发布了哪些?给我详细信息")# 响应中包含搜索结果引用for item in response.output: if item.type == "message": print(item.content[0].text) elif item.type == "web_search_call": print(f"搜索查询:{item.query}")# 获取引用来源for annotation in response.output[-1].content[0].annotations: if annotation.type == "url_citation": print(f"来源:{annotation.url} - {annotation.title}")### 2.2 File Search(向量知识库检索)这个功能相当于内置了一个RAG系统:python# 第一步:创建向量存储并上传文件vector_store = client.vector_stores.create(name="企业知识库")# 批量上传文档file_paths = ["product_manual.pdf", "faq.docx", "api_docs.md"]file_streams = [open(path, "rb") for path in file_paths]file_batch = client.vector_stores.file_batches.upload_and_poll( vector_store_id=vector_store.id, files=file_streams)print(f"上传状态:{file_batch.status}") # completed# 第二步:使用File Search查询response = client.responses.create( model="gpt-4.1", tools=[{ "type": "file_search", "vector_store_ids": [vector_store.id], "max_num_results": 10, # 最多返回10个相关片段 "ranking_options": { "ranker": "auto", "score_threshold": 0.3 # 相关性阈值 } }], input="我们的产品支持哪些支付方式?退款政策是什么?")### 2.3 Code Interpreter(沙箱代码执行)pythonresponse = client.responses.create( model="gpt-4.1", tools=[{"type": "code_interpreter"}], input=""" 我有以下销售数据,请帮我: 1. 计算各月环比增长率 2. 找出增长最快的3个月 3. 生成一个折线图并保存为PNG 数据:月份=[1,2,3,4,5,6], 销售额=[100,120,115,140,160,180] """,)# 下载生成的图片for item in response.output: if hasattr(item, "code"): print(f"执行的代码:\n{item.code}") if hasattr(item, "outputs"): for output in item.outputs: if output.type == "image": # 下载图片 image_data = client.files.content(output.file_id) with open("sales_chart.png", "wb") as f: f.write(image_data.read()) print("图表已保存:sales_chart.png")—## 三、流式输出(Streaming)python# 流式输出,适合实时展示with client.responses.stream( model="gpt-4.1", tools=[{"type": "web_search_preview"}], input="解释一下量子计算对密码学的影响") as stream: for event in stream: # 文字输出事件 if event.type == "response.output_text.delta": print(event.delta, end="", flush=True) # 工具调用开始事件 elif event.type == "response.output_item.added": if event.item.type == "web_search_call": print(f"\n[正在搜索: {event.item.query}]") # 流结束事件 elif event.type == "response.completed": print(f"\n\n总token消耗: {event.response.usage.total_tokens}")—## 四、Computer Use(计算机控制)这是Responses API最令人震惊的功能——让AI直接操控计算机:pythonimport anthropic # Computer Use目前Claude更成熟,但OpenAI也在跟进# 以OpenAI实现为例(beta阶段)response = client.responses.create( model="computer-use-preview", tools=[{ "type": "computer_use_preview", "display_width": 1920, "display_height": 1080, "environment": "browser" }], input="打开Gmail,找到最近3封关于'季度报告'的邮件,总结主要内容")for item in response.output: if item.type == "computer_call": action = item.action print(f"执行操作:{action.type}") if action.type == "screenshot": # 获取当前屏幕截图 pass elif action.type == "click": print(f"点击位置:({action.x}, {action.y})") elif action.type == "type": print(f"输入文字:{action.text}")—## 五、与Assistant API的区别很多人会问:Responses API和之前的Assistants API有什么区别?| 维度 | Assistants API | Responses API ||------|----------------|---------------|| 状态管理 | Thread/Run概念 | response_id链式引用 || 复杂度 | 较高(需管理Thread) | 较低(单一response对象) || 工具集成 | 支持自定义工具 | 内置工具+自定义工具 || 流式支持 | 支持 | 支持(更简洁) || 定价 | 按token | 按token || 状态存储 | OpenAI服务端(30天) | OpenAI服务端(可配置) |结论:Responses API是Assistants API的进化版,更简洁、更强大。新项目建议直接用Responses API,老项目逐步迁移。—## 六、Function Calling在Responses API中的新写法Responses API完全支持自定义工具调用,写法更清晰:pythonimport json# 定义工具tools = [ { "type": "function", "name": "get_stock_price", "description": "获取指定股票的实时价格", "parameters": { "type": "object", "properties": { "symbol": { "type": "string", "description": "股票代码,如 AAPL, GOOGL" }, "currency": { "type": "string", "enum": ["USD", "CNY"], "description": "货币单位" } }, "required": ["symbol"] } }]# 发起请求response = client.responses.create( model="gpt-4.1", tools=tools, input="苹果公司的股价现在是多少?")# 处理工具调用for item in response.output: if item.type == "function_call": function_name = item.name arguments = json.loads(item.arguments) print(f"调用函数: {function_name}") print(f"参数: {arguments}") # 执行实际的函数 if function_name == "get_stock_price": price = fetch_stock_price(arguments["symbol"]) # 将工具结果传回 response2 = client.responses.create( model="gpt-4.1", previous_response_id=response.id, input=[{ "type": "function_call_output", "call_id": item.call_id, "output": json.dumps({"price": price, "currency": "USD"}) }] ) print(response2.output_text)—## 七、实战:构建企业级RAG+搜索问答系统结合File Search和Web Search,10行核心代码搭建混合检索问答:pythondef create_hybrid_qa_system(vector_store_id: str): """创建混合知识库+实时搜索的问答系统""" def ask(question: str, session_id: str | None = None) -> dict: kwargs = { "model": "gpt-4.1", "tools": [ { "type": "file_search", "vector_store_ids": [vector_store_id] }, { "type": "web_search_preview", "search_context_size": "medium" } ], "instructions": """ 优先从知识库中查找答案。如果知识库中没有相关信息, 或者问题涉及最新动态,则使用网络搜索补充。 回答时标注信息来源(知识库 or 网络)。 """, "input": question } if session_id: kwargs["previous_response_id"] = session_id response = client.responses.create(**kwargs) return { "answer": response.output_text, "session_id": response.id, "usage": response.usage.total_tokens } return ask# 使用qa = create_hybrid_qa_system("vs_your_store_id")result1 = qa("我们产品的定价策略是什么?")print(result1["answer"])# 继续追问(保持上下文)result2 = qa("和竞品相比如何?", session_id=result1["session_id"])print(result2["answer"])—## 八、迁移指南:从Chat Completions迁移到Responses APIpython# 旧写法(Chat Completions)conversation_history = []def old_chat(user_message: str) -> str: conversation_history.append({"role": "user", "content": user_message}) response = client.chat.completions.create( model="gpt-4-turbo", messages=conversation_history ) assistant_message = response.choices[0].message.content conversation_history.append({"role": "assistant", "content": assistant_message}) return assistant_message# 新写法(Responses API)last_response_id = Nonedef new_chat(user_message: str) -> str: global last_response_id kwargs = {"model": "gpt-4.1", "input": user_message} if last_response_id: kwargs["previous_response_id"] = last_response_id response = client.responses.create(**kwargs) last_response_id = response.id return response.output_text代码量减少约40%,且不再需要自己管理对话历史。—## 总结Responses API代表了OpenAI对"正确的AI应用开发范式"的最新判断:1. 有状态对话取代无状态API调用2. 内置工具降低RAG、搜索、代码执行的集成门槛3. 更简洁的接口让开发者专注业务而非框架4. 向Computer Use延伸,打开AI自主执行任务的新空间如果你正在构建新的AI应用,从Responses API起步将让你少走很多弯路。—本文基于OpenAI Responses API 2026年文档编写
更多推荐
所有评论(0)