AI大模型应用开发实践:5.快速入门 Assistants API

快速入门 Assistants API

Assistants API 允许您在自己的应用程序中构建人工智能助手。一个助手有其指令,并可以利用模型、工具和知识来回应用户查询。

Assistants API 目前支持三种类型的工具:

  • 代码解释器 Code Interpreter
  • 检索 Retrieval
  • 函数调用 Function calling

使用 Playground 可以在线探索和测试 Assistants API 功能。

本入门指南将指导您完成创建和运行使用代码解释器的助手的关键步骤,以下是使用 Assistants API 标准流程:

  1. 通过定义其自定义指令并选择 LLM 来创建一个助手(Assistant)。如果有需求,可以添加文件并启用诸如代码解释器、检索和函数调用等工具。
  2. 当用户开始对话时,创建一个线程(Thread)。
  3. 当用户提问时,向线程添加消息(Messages)。
  4. 通过调用模型和工具在线程上运行助手以生成响应。

在这里插入图片描述

OBJECTWHAT IT REPRESENTS
Assistant专为特定目的构建的人工智能,使用 OpenAI 的模型并调用工具
Thread助手与用户之间的对话会话。线程存储消息,并自动处理截断,以将内容适应模型的上下文。
Message由助手或用户创建的消息。消息可以包括文本、图片和其他文件。消息以列表形式存储在线程上。
Run在线程上对一个助手的调用。助手利用其配置和线程的消息执行任务,通过调用模型和工具。作为运行的一部分,助手会将消息追加到线程中。
Run Step助手在运行中采取的详细步骤列表。助手可以在其运行期间调用工具或创建消息。检查运行步骤可以让您深入了解助手如何得出最终结果。

使用 Assistants 开发数学辅导老师

在这个示例中,我们正在创建一个数学辅导助手,并启用了代码解释器工具。

第一步:创建助手

import openai  # 导入 openai 库# 从环境变量 OPENAI_API_KEY 中获取 API 密钥
client = openai.OpenAI()# 创建一个名为 "Math Tutor" 的助手,它是一个个人数学辅导老师。这个助手能够编写并运行代码来解答数学问题。
assistant = client.beta.assistants.create(name="Math Tutor",instructions="You are a personal math tutor. Write and run code to answer math questions.",tools=[{"type": "code_interpreter"}],  # 使用工具:代码解释器model="gpt-4-1106-preview",  # 使用模型: GPT-4
)

第二步:创建线程

一个线程代表用户和一个或多个助手之间的对话。

# 创建一个交流线程
thread = client.beta.threads.create()

第三步:往线程添加消息

用户或APP创建的消息内容将作为消息对象(Message Object)添加到线程中。

消息可以包含文本和文件,向线程添加的消息数量没有限制 - OpenAI 会智能地截断任何不适合模型上下文窗口的内容。

# 在该线程中创建一条用户消息,并提交一个数学问题:“我需要解方程 `3x + 11 = 14`。你能帮忙吗?”
message = client.beta.threads.messages.create(thread_id=thread.id,role="user",content="I need to solve the equation `3x + 11 = 14`. Can you help me?",
)

第四步:调用助手

一旦所有用户消息都添加到了线程中,你可以使用任何助手运行该线程。

创建一个运行会使用与助手相关的模型和工具来生成响应。这些响应将作为助手消息添加到线程中。

# 创建并等待执行流完成,用于处理该线程中的交互和问题解答
run = client.beta.threads.runs.create_and_poll(thread_id=thread.id,assistant_id=assistant.id,instructions="Please address the user as Jane Doe. The user has a premium account.",  # 以 Jane Doe 称呼用户,并且用户拥有高级账户
)print("Run completed with status: " + run.status)  # 打印执行流的完成状态# 如果执行流状态为 "completed"(已完成),则获取并打印所有消息
if run.status == "completed":messages = client.beta.threads.messages.list(thread_id=thread.id)print("\nMessages:\n")for message in messages:assert message.content[0].type == "text"print(f"Role: {message.role.capitalize()}")  # 角色名称首字母大写print("Message:")print(message.content[0].text.value + "\n")  # 每条消息后添加空行以增加可读性
Run completed with status: completedMessages:Role: Assistant
Message:
The solution to the equation \(3x + 11 = 14\) is \(x = 1\). If you need additional help with this equation or another one, feel free to ask, Jane.Role: Assistant
Message:
Of course, Jane! To solve the equation \(3x + 11 = 14\), we need to isolate the variable \(x\) on one side of the equation. We can do this by following these steps:1. Subtract 11 from both sides of the equation to get the term with \(x\) by itself on one side.
2. Divide both sides of the resulting equation by 3 to solve for \(x\).Let's do these calculations to find the value of \(x\).Role: User
Message:
I need to solve the equation `3x + 11 = 14`. Can you help me?

通过 Assistant ID 删除指定助手

# 删除创建的助手
client.beta.assistants.delete(assistant.id)
AssistantDeleted(id='asst_CmikkRdSAUDlb5dBDqHX57dT', deleted=True, object='assistant.deleted')

使用流式输出实现数学辅导老师

import openai# 从环境变量 OPENAI_API_KEY 中获取 API 密钥
client = openai.OpenAI()# 创建一个名为 "Math Tutor" 的助手,它是一个个人数学辅导老师。这个助手能够编写并运行代码来解答数学问题。
assistant = client.beta.assistants.create(name="Math Tutor",instructions="You are a personal math tutor. Write and run code to answer math questions.",tools=[{"type": "code_interpreter"}],  # 工具包括代码解释器model="gpt-4-1106-preview",  # 使用的模型是 GPT-4
)# 创建一个交流线程
thread = client.beta.threads.create()# 在该线程中创建一条消息,表示用户角色,并提交一个数学问题:“我需要解方程 `3x + 11 = 14`。你能帮忙吗?”
message = client.beta.threads.messages.create(thread_id=thread.id,role="user",content="I need to solve the equation `3x + 11 = 14`. Can you help me?",
)print("starting run stream")  # 打印开始执行流的消息# 创建一个执行流,用于处理该线程中的交互和问题解答
stream = client.beta.threads.runs.create(thread_id=thread.id,assistant_id=assistant.id,instructions="Please address the user as Jane Doe. The user has a premium account.",  # 以 Jane Doe 称呼用户,并且用户拥有高级账户stream=True,  # 持续流式传输
)# 遍历执行流中的事件,并以 JSON 格式打印它们
for event in stream:print(event.model_dump_json(indent=2, exclude_unset=True))# 删除创建的助手
client.beta.assistants.delete(assistant.id)
starting run stream
{"data": {"id": "run_0PqlNbmtft5Nz6F8eaYsP1vU","assistant_id": "asst_9UdKwJ8S7iOMrlEX6lzXpLWD","cancelled_at": null,"completed_at": null,"created_at": 1713409009,"expires_at": 1713409609,"failed_at": null,"file_ids": [],"incomplete_details": null,"instructions": "Please address the user as Jane Doe. The user has a premium account.","last_error": null,"max_completion_tokens": null,"max_prompt_tokens": null,"metadata": {},"model": "gpt-4-1106-preview","object": "thread.run","required_action": null,"response_format": "auto","started_at": null,"status": "queued","thread_id": "thread_rudF1jmbDRotBYIm3RVJIoX0","tool_choice": "auto","tools": [{"type": "code_interpreter"}],"truncation_strategy": {"type": "auto","last_messages": null},"usage": null,"temperature": 1.0,"top_p": 1.0},"event": "thread.run.created"
}
{"data": {"id": "run_0PqlNbmtft5Nz6F8eaYsP1vU","assistant_id": "asst_9UdKwJ8S7iOMrlEX6lzXpLWD","cancelled_at": null,"completed_at": null,"created_at": 1713409009,"exp

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

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

相关文章

Java同步与线程安全,同步方法、同步块和java.util.concurrent包的使用

Java的同步与线程安全是并发编程中至关重要的部分。在多线程环境下,确保数据的一致性和避免竞态条件(race condition)是程序设计的关键。 一、Java中的线程安全 线程安全(Thread Safety)是指多线程环境下&#xff0c…

一键开启:盲盒小程序里的梦幻奇遇

在繁忙的都市生活中,每个人心中都藏着一个关于奇遇的梦想。如今,我们为您精心打造了一款盲盒小程序——“梦幻奇遇”,只需一键开启,就能带您走进一个充满无限惊喜和梦幻色彩的奇幻世界。 一、神秘盲盒,惊喜连连 “梦幻…

gitlab之cicd的gitlab-runner集成-dockerfile构建环境

目录 概述离线资源docker-compose问题 docker-compose问题1问题2 gitlab-runner集成gitlab 概述 cicd引文目录是想通过dockerfile构建 maven、jdk、docker环境的 gitlab-runner 运行环境。但docker最后测试的时候有点问题,且最后使用 kubectl 时有麻烦,所…

python--面向对象-文件读写-异常

一、继承 定义一个类时,需要使用另外一个类的方法或属性,就可以通过继承实现 object是Python的顶级类,创建类是会自动继承,就拥有object中的方法 定义格式 # 类的定义 # 旧式类定义 一般在定义单个类时使用 class 类名:name N…

Spring Boot 使用自定义注解和自定义线程池实现异步日志记录

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

如何保持气膜场馆内部空气新鲜—轻空间

气膜建筑作为现代建筑的一种新兴形式,以其独特的优势和设计受到了广泛欢迎。然而,保持气膜内部空气新鲜是一个必须解决的问题。我们通过配备先进的新风系统,提供了高效的解决方案。 新风系统的工作原理 气膜建筑内部空气的新鲜度主要依靠其配…

【vscode-快捷键 一键JSON格式化】

网上有很多JSON格式化工具,也有很多好用的在线json格式化工具。但是其实Vscode里面的可以直接格式化JSON,这里分享一个我常用的小插件 Prettify JSON 未格式化的JSON数据 召唤出命令行,输入prettify JSON 即可! ✿✿ヽ(▽)ノ✿

算法题:Java求数组中最大的值

采用分而治之(二分法)的思想去求解 分而治之:分而治之的思想可以用于解决很多问题,大概的思路就是把一个比较大的复杂的问题切分成小的块,然后分头去解决他们,最后再把结果合并起来,就是“分而治…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…

C++高级 - 接口模板

目录 一. 接口 二. 模板 一. 接口 接口通常是通过抽象类或纯虚函数来实现的。 以下是一个使用抽象类来定义接口的示例代码&#xff1a; #include <iostream>class Interface { public:virtual void operation() 0; // 纯虚函数定义接口 };class ConcreteClass : pu…

【图书推荐】《Ubuntu Linux系统管理与运维实战》

本书重点 全面学习Ubuntu系统操作&#xff0c;快速掌握Linux日常管理和运维 安装和配置、桌面环境、文件系统、文件和目录管理、用户和权限管理系统的启动和关闭、服务和进程管理、软件包管理、磁盘和文件系统管理网络管理、网络服务管理、系统和网络安全 内容简介 Linux是…

计算机基础(5)——进制与进制转换

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

了解一下Ubuntu Linux

1.3.1 什么是Ubuntu Ubuntu这个名字非常神奇&#xff0c;它取自非洲南部祖鲁语的ubuntu&#xff0c;是一个哲学名称&#xff0c;其意思为“人性”或者“我的存在是因为大家的存在”。对于中国人来说&#xff0c;一般称呼它为乌班图。 Ubuntu是在Debian的基础上开发出来的&am…

opencv标定板图像位置

下载的C中使用的opencv库有圆点和方格的标定板图像 Opencv4.6.0\sources\doc

什么是泛洪攻击?DDos攻击也是泛洪攻击的一种?

在数字化时代的浪潮中&#xff0c;网络安全已成为一场没有硝烟的战争。其中&#xff0c;泛洪攻击作为一种常见的网络攻击手段&#xff0c;对个人用户、企业乃至国家网络安全构成了严重威胁。本文将对泛洪攻击进行深入剖析&#xff0c;包括其定义、原理、类型、影响以及应对策略…

嵌入式Linux系统编程 — 1.4 原子操作与竞争冒险

目录 1 竞争冒险 1.1 竞争冒险由来 1.2 竞争冒险理解 2 原子操作 2.1 O_APPEND 实现原子操作 2.2 pread()和 pwrite() 2.3 O_EXCL 标志创建文件 1 竞争冒险 1.1 竞争冒险由来 Linux 是一个支持多任务和多用户同时运行的操作系统&#xff0c;它允许多个进程同时执行。…

kube-promethesu新增k8s组件监控(etcd\kube-controller-manage\kube-scheduler)

我们的k8s集群是二进制部署 一、prometheus添加自定义监控与告警&#xff08;etcd&#xff09; 1、步骤及注意事项&#xff08;前提&#xff0c;部署参考部署篇&#xff09; 1.1 一般etcd集群会开启HTTPS认证&#xff0c;因此访问etcd需要对应的证书 1.2 使用证书创建etcd的…

Verilog实战学习到RiscV - 3 : ICEStick 评估板点灯

收到 ICESTICK 评估板后还没好好玩。先来点个灯&#xff0c;正好把之前介绍过的工具链串起来用一下。 代码 Verilog代码只有一个顶层模块top.v&#xff0c;定义如下&#xff1a; module top(output wire D1,output wire D2,output wire D3,output wire D4,output wire D5);a…

云手机定位切换,带来的不只是便利

当我们利用云手机的定位切换时&#xff0c;首先感受到的确实是极大的便利。 我们就像是拥有了瞬间移动的超能力&#xff0c;可以自由地在不同城市、甚至不同国家的虚拟场景中穿梭。无论是为了更精准地获取当地的信息&#xff0c;比如实时的交通状况、特色店铺等&#xff0c;还…

【CT】LeetCode手撕—3. 无重复字符的最长子串

目录 题目1- 思路1-1 模式1&#xff1a;涉及去重判断1-2 模式2&#xff1a;遍历字符串区间 2- 题解⭐无重复字符的最长子串——题解思路 3- ACM实现 原题链接&#xff1a;3. 无重复字符的最长子串 题目 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有…