Assistant API之Code Interpreter(代码解释器)的应用(完整代码)

一、Code Interpreter工具概述

Code Interpreter(代码解释器)是OpenAI官方提供的内置工具,它能够把用户的需求转换到Python代码的沙盒环境中运行,在数学计算、文本分析以及数据分析等场景发挥重要作用,常被用于处理表格数据,如进行数学分析、绘制图表等任务。

二、使用Code Interpreter的费用及注意事项

使用该工具时,每次会话会收取0.03美元的费用,每个会话的有效时长为一小时。在同一线程中与代码解释器交互,一小时内仅需支付一次费用;若在不同线程中同时调用代码解释器,会创建多个会话,从而产生多次收费。所以在使用过程中,要避免频繁创建新线程,以防止费用增加。

三、Code Interpreter工具的实践应用

  1. 初始化OpenAI客户端
from openai import OpenAI
# 从openai库中导入OpenAI类,用于创建OpenAI客户端实例
client = OpenAI()
# 创建OpenAI客户端实例,后续通过该实例调用OpenAI的相关API
  1. 启用代码解释器
assistant = client.assistants.create(
    name="Data Engineer",  # 将助手命名为“数据分析师”,方便识别和管理
    instructions="You're a weather data analyst. When asked for data information, write and run code to answer the question",  # 设定助手的任务,明确其作为气象数据分析师,在被询问数据信息时,需编写并运行代码来回答问题
    tools=[
        {"type": "code_interpreter"}
    ],
    # 在tools参数中指定使用代码解释器工具,使助手具备执行代码的能力
    model="gpt-4o-mini-2024-07-18"
    # 选择使用的模型为gpt-4o-mini-2024-07-18,不同模型在性能和功能上可能存在差异
)

若希望增强代码解释器的使用概率,可以在instructions中明确提示,例如“编写代码来解决这个问题”,这样能引导GPT模型更倾向于使用代码解释器来执行任务。
3. 创建线程

thread = client.threads.create()
# 创建一个新的线程,每个线程开启新的Code Interpreter会产生新的计费,所以要谨慎创建
thread_id = thread.id
# 获取新创建线程的ID,后续在与线程相关的操作中会用到该ID
  1. 传递文件给代码解释器
file = client.files.create(
    file=open("./data/weather_data_complex.csv", "rb"),
    # 以二进制读取模式打开本地的天气数据文件weather_data_complex.csv,准备上传到OpenAI服务器
    purpose='assistants'
    # 指定文件用途为assistants,表明该文件用于辅助助手完成任务
)
file_id = file.id
# 获取上传文件的ID,这个ID在后续让代码解释器基于该文件进行分析时会用到

若要让代码解释器基于上传的文件进行分析,可使用assist.update方法更新Assistant对象,传递文件ID:

assistant = client.assistants.update(
    assistant_id=assistant.id,
    # 指定要更新的助手ID,确保更新的是正确的Assistant对象
    tool_resources={
        "code_interpreter": {
            "file_ids": [file_id]
        }
    }
    # 在tool_resources参数中,为code_interpreter指定要处理的文件ID列表,这里只包含刚上传的文件ID
)
  1. 创建消息并执行Run状态
    构建新消息并追加到现有线程中,提出数据分析需求,如分析城市实时天气数据并绘制折线图:
thread_message = client.threads.messages.create(
    thread_id=thread.id,
    # 指定消息所属的线程ID,确保消息被添加到正确的线程中
    role="user",
    # 设定消息的角色为“user”,表示这是用户发出的消息
    content="请帮我分析各个城市的实时天气数据,并绘制折线图"
    # 消息的内容,即用户的需求,要求助手分析城市实时天气数据并绘制折线图
)

接着创建Run状态,让Assistant对象处理用户请求:

run = client.threads.runs.create(
    thread_id=thread.id,
    # 指定线程ID,让助手在该线程中执行任务
    assistant_id=assistant.id
    # 指定执行任务的助手ID
)

Run开始运行后会进入queued排队状态,需要等待一段时间才能完成。可通过client.threads.messages.list方法获取最终结果:

messages = client.threads.messages.list(
    thread_id=thread.id
    # 指定要获取消息的线程ID,获取该线程中的所有消息
)
last_message = messages.data[0]
# 从获取到的消息列表中,取第一个消息(通常是助手的回复,因为这里只创建了一条用户消息,助手的回复是列表中的第一条)
  1. 处理代码解释器的输出:代码解释器除生成文本外,还可输出文件,包括图片类型和数据文件(如.csv文件)。
  • 下载图片文件:若生成的是图片文件,可从最终消息响应的file_id字段获取图片的文件ID,通过以下代码下载:
file_id = last_message.content[0].image_file.file_id
# 从消息内容的第一个元素(假设是包含图片文件信息的对象)中获取图片的文件ID
image_data = client.files.content(file_id=file_id)
# 使用client.files.content方法,根据文件ID获取图片文件的内容
image_data_bytes = image_data.read()
# 读取图片文件内容为字节流
with open("./my-image.png", "wb") as file:
    # 以二进制写入模式打开本地文件my-image.png
    file.write(image_data_bytes)
    # 将图片字节流写入该文件,实现图片下载到本地
  • 下载数据文件:当代码解释器生成数据文件(如.csv文件)并返回文件路径注释时,需提取注释中的文件ID进行下载。示例代码如下:
file_id = last_message.content[0].text.annotations[0].file_path.file_id
# 从消息文本的注释中,获取生成的.csv文件的文件ID
file_data = client.files.content(file_id)
# 使用client.files.content方法,根据文件ID获取数据文件的内容
file_data_bytes = file_data.read()
# 读取文件内容为字节流
with open("./sorted_cities_by_temperature.csv", "wb") as file:
    # 以二进制写入模式打开本地文件sorted_cities_by_temperature.csv
    file.write(file_data_bytes)
    # 将文件字节流写入该文件,实现.csv文件下载到本地

四、总结

Code Interpreter工具在数据分析等领域有着重要的应用价值。在使用过程中,务必注意其收费机制,避免因频繁创建新线程而增加费用。熟练掌握文件处理和结果下载的方法,能够帮助我们在实际应用中更高效地利用该工具进行数据处理和分析工作。

# 导入OpenAI库
from openai import OpenAI 
# 创建OpenAI客户端实例
client = OpenAI() 

# 创建一个Assistant对象
# name参数为助手名称,设定为Data Engineer(数据分析师)
# instructions描述助手的任务,这里设定为气象数据分析师,要求编写并运行代码回答数据相关问题
# tools列表中指定使用code_interpreter工具
# model选择gpt-4o-mini-2024-07-18模型
assistant = client.beta.assistants.create( 
    name="Data Engineer", 
    instructions="You're a weather data analyst. When asked for data information, write and run code to answer the question", 
    tools=[
        {"type": "code_interpreter"}
    ],
    model="gpt-4o-mini-2024-07-18"
)

# 创建一个线程
# 每个线程会开启新的Code interpreter,注意避免频繁创建导致费用增加
thread = client.beta.threads.create() 
# 获取线程的ID
thread_id = thread.id 

# 上传文件到OpenAI服务器
# open函数以二进制读取模式打开本地的天气数据文件weather_data_complex.csv
# purpose参数指定文件用途为assistants
file = client.files.create( 
    file=open("./data/weather_data_complex.csv", "rb"),
    purpose='assistants'
)
# 获取上传文件的ID
file_id = file.id 

# 更新Assistant对象
# assistant_id指定要更新的助手ID
# tool_resources参数中设置code_interpreter的file_ids为刚上传文件的ID,让助手基于该文件进行分析
assistant = client.beta.assistants.update( 
    assistant_id=assistant.id,
    tool_resources={
        "code_interpreter": {
            "file_ids": [file_id]
        }
    }
)

# 在当前线程中创建一条消息
# thread_id指定消息所属线程的ID
# role设定消息角色为user(用户)
# content为用户的问题,要求分析城市实时天气数据并绘制折线图
thread_message = client.beta.threads.messages.create( 
    thread_id=thread.id,
    role="user",
    content="请帮我分析各个城市的实时天气数据,并绘制折线图"
)

# 在当前线程中创建一个Run
# thread_id指定线程ID
# assistant_id指定助手ID,让助手在该线程中执行任务
run = client.beta.threads.runs.create( 
    thread_id=thread.id,
    assistant_id=assistant.id
)

# 获取线程中的消息列表
# thread_id指定要获取消息的线程ID
messages = client.beta.threads.messages.list( 
    thread_id=thread.id
)
# 获取最新的消息(通常是助手的回复)
last_message = messages.data[0] 

# 从消息内容中获取生成的图片文件的file_id
# 假设消息内容的第一个元素是包含图片文件信息的对象
file_id = last_message.content[0].image_file.file_id 
# 获取图片文件的内容
image_data = client.files.content(file_id=file_id) 
# 读取图片文件内容为字节流
image_data_bytes = image_data.read() 
# 以二进制写入模式打开本地文件my-image.png
# 将图片字节流写入该文件,实现图片下载
with open("./my-image.png", "wb") as file: 
    file.write(image_data_bytes) 

# 再次上传文件(可能是为了新的任务)
file = client.files.create( 
    file=open("./data/weather_data_complex.csv", "rb"),
    purpose='assistants'
)
file_id = file.id 

# 在当前线程中创建一条新消息
# thread_id指定线程ID
# role设定为user
# content要求根据平均温度对城市进行排序并生成新的.csv文件供下载
# attachments中指定文件ID和使用的工具为code_interpreter
thread_message = client.beta.threads.messages.create( 
    thread_id=thread.id,
    role="user",
    content="根据平均温度对城市进行排序,并生成一个新的.csv文件供我下载",
    attachments=[
        {
            "file_id": file_id,
            "tools": [
                {"type": "code_interpreter"}
            ]
        }
    ]
)

# 创建一个新的Run来处理新的任务
# thread_id指定线程ID
# assistant_id指定助手ID
run = client.beta.threads.runs.create( 
    thread_id=thread.id,
    assistant_id=assistant.id
)

# 获取线程中的消息列表(等待任务完成后获取结果)
messages = client.beta.threads.messages.list( 
    thread_id=thread.id
)
last_message = messages.data[0] 

# 从消息文本的注释中获取生成的.csv文件的file_id
file_id = last_message.content[0].text.annotations[0].file_path.file_id 
# 获取.csv文件的内容
file_data = client.files.content(file_id) 
# 读取文件内容为字节流
file_data_bytes = file_data.read() 
# 以二进制写入模式打开本地文件sorted_cities_by_temperature.csv
# 将文件字节流写入该文件,实现.csv文件下载
with open("./sorted_cities_by_temperature.csv", "wb") as file: 
    file.write(file_data_bytes) 
<think>嗯,用户想查询Qwen3 MCP本地部署的配置。首先,我需要回忆一下之前提供的引用内容,看看有没有相关的信息。引用[1]提到了如何使用Ollama在本地运行Qwen3并支持MCP和工具使用,里面有具体的代码示例,配置步骤,这可能对用户有帮助。引用[2]和[3]也提到了本地部署的方法,比如使用Ollama、vLLM等工具。所以应该结合这些信息来回答。 用户的问题是关于Qwen3 MCP的本地部署配置,需要明确MCP是什么。根据引用里的描述,MCP可能是指某种服务或协议,比如在工具配置里提到的'mcpServers',有time和fetch的命令,可能和获取时间或数据有关。但用户可能更关注如何配置环境来支持MCP功能。 首先,我需要整理部署的步骤。根据引用[1],步骤包括配置本地模型、定义工具(包括MCP)、初始化助手、发送消息等。所以回答的结构应该分步骤说明,比如环境准备、模型配置、工具集成、运行验证等。 然后,要确保LaTeX格式正确,比如行内公式用$...$,独立公式用$$...$$。不过这个问题可能涉及代码较多,数学公式可能较少,但如果有参数或变量,需要正确应用格式。 还需要生成相关问题,可能涉及优化部署、验证方法、与其他工具的比较等。要确保问题相关且有用。 另外,用户提到的引用需要正确标注。例如,引用[1]中的代码示例,引用[2]中的部署工具,引用[3]中的模型版本和特性。需要确认这些信息是否准确对应到回答中。 可能需要注意用户的环境,比如是否需要安装Ollama,如何下载模型,配置API地址等。在引用[2]中提到了使用Ollama安装Qwen3-8B模型,用户可能需要先完成这些前置步骤。此外,引用[3]提到使用vLLM进行Docker部署,可能可以作为另一种部署方式的参考,但用户当前的问题更关注MCP的配置,所以可能以Ollama为主。 还需要检查代码是否正确,比如Python代码中的缩进、参数设置是否正确。例如,在配置llm_cfg时,model_server的地址是否正确,api_key是否为'EMPTY'。工具列表中的结构是否正确,比如是否包含mcpServers和code_interpreter。 最后,确保回答使用中文,结构清晰,分步骤说明,并附上相关问题和引用标注。</think>### Qwen3 MCP本地部署配置详解 Qwen3 MCP本地部署的核心是通过Ollama框架实现模型服务调用,结合MCP服务扩展工具能力。以下是具体配置流程: #### 一、基础环境准备 1. 安装Ollama服务(需v0.1.34+) ```bash curl -fsSL https://ollama.com/install.sh | sh ``` 2. 下载Qwen3模型(以8B为例): ```bash ollama run qwen3:8b ``` #### 二、模型服务配置 ```python llm_cfg = { 'model': 'qwen3', # 模型标识符 'model_server': 'http://localhost:11434/v1', # Ollama默认API地址 'api_key': 'EMPTY', # 本地部署无需验证密钥 'temperature': 0.7 # 温度参数控制生成随机性 } ``` > 注:建议显存≥16GB,内存≥32GB以保证流畅运行[^2] #### 三、MCP工具集成 ```python tools = [ { # MCP服务定义 'mcpServers': { 'time': { 'command': 'uvx', 'args': ['mcp-server-time', '--local-timezone=Asia/Shanghai'] }, 'fetch': { 'command': 'uvx', 'args': ['mcp-server-fetch'] } } }, 'code_interpreter' # 代码解释器工具 ] ``` 该配置实现: - 时区时间服务:通过`mcp-server-time`获取本地时间 - 数据获取服务:通过`mcp-server-fetch`执行数据抓取 - 代码解释器:支持Python代码执行[^1] #### 四、助手初始化与调用 ```python bot = Assistant(llm=llm_cfg, function_list=tools) messages = [{ 'role': 'user', 'content': '查询当前上海时间并获取最新Qwen技术文档' }] for response in bot.run(messages): print(response[-1]['content']) ``` 典型输出结构: ``` 当前上海时间:2024-06-20 15:30:00 CST 已获取最新文档:https://qwenlm.github.io/blog/... ``` #### 五、验证部署 1. 检查Ollama服务状态: ```bash curl http://localhost:11434/api/tags ``` 2. 测试MCP服务响应: ```python import requests response = requests.post( 'http://localhost:11434/v1/chat/completions', headers={'Authorization': 'Bearer EMPTY'}, json={'model': 'qwen3', 'messages': [{'role':'user','content':'当前时间'}]} ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值