OpenAI Responses API深度解析:比Chat Completions更强的下一代接口

4 阅读1分钟

写在前面

2026年初,OpenAI悄悄推出了一个改变游戏规则的新接口:Responses API。如果你还在用chat.completions.create()写AI应用,这篇文章值得认真看完——Responses API不是小升级,它是OpenAI对"如何正确构建AI应用"的重新思考。


一、Responses API vs Chat Completions:核心区别

从"无状态"到"有状态"

Chat Completions API每次调用都是独立的,开发者必须自己维护对话历史,每次请求都把所有历史消息传过去。这会带来:

  • 上下文窗口消耗大
  • 对话历史管理复杂
  • 多轮对话成本线性增长

Responses API引入了服务端会话管理

from openai import OpenAI

client = OpenAI()

# 第一轮对话
response = client.responses.create(
    model="gpt-4.1",
    input="请介绍一下Transformer架构的核心原理"
)

print(response.output_text)
response_id = response.id  # 保存这个ID

# 第二轮对话,只需传入上一次的response_id
response2 = 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官方托管的工具:

response = 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(实时联网搜索)

response = 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系统:

# 第一步:创建向量存储并上传文件
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(沙箱代码执行)

response = 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)

# 流式输出,适合实时展示
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直接操控计算机:

import 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 APIResponses API
状态管理Thread/Run概念response_id链式引用
复杂度较高(需管理Thread)较低(单一response对象)
工具集成支持自定义工具内置工具+自定义工具
流式支持支持支持(更简洁)
定价按token按token
状态存储OpenAI服务端(30天)OpenAI服务端(可配置)

结论:Responses API是Assistants API的进化版,更简洁、更强大。新项目建议直接用Responses API,老项目逐步迁移。


六、Function Calling在Responses API中的新写法

Responses API完全支持自定义工具调用,写法更清晰:

import 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行核心代码搭建混合检索问答:

def 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 API

# 旧写法(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 = None

def 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年文档编写