建筑案例网站有哪些,asp建的网站上传文章,wordpress 国人 响应式,常熟滨江开发区人才网欢迎阅读本系列文章#xff01;我将带你一起探索如何使用OpenAI API来开发GPT大模型应用。无论你是编程新手还是资深开发者#xff0c;都能在这里获得灵感和收获。
本文将继续展示AI助手的开发方式#xff0c;在OpenAPI中它的名字是Assistants。
什么是Assistants#xf…欢迎阅读本系列文章我将带你一起探索如何使用OpenAI API来开发GPT大模型应用。无论你是编程新手还是资深开发者都能在这里获得灵感和收获。
本文将继续展示AI助手的开发方式在OpenAPI中它的名字是Assistants。
什么是Assistants
在之前的文章中我演示了插件的使用方法比如查询实时天气、进行数学运算等这些都是大模型自身做不到的事情因此可以说插件的主要作用是扩展了大模型的处理能力。那么Assistants能干什么呢
Assistants的主要作用是强化大模型在某方面的应用能力比如目前已经大范围使用的AI客服和知识库助手它们可以准确的理解用户的问题并在限定的知识范围内进行精准回答。另外借助Assistants的能力我们还可以做更多有趣的事情比如让它按照指定的规范对代码进行Review按照某种指定的风格或者模式来进行文学创作等等。
本文我们将通过一个AI客服来演示Assistants的使用方法。先看效果 这里我开发了一个空气净化器的AI客服然后用户向AI客服提了四个问题前三个问题AI都理解准确并回答正确回答内容全部来源于产品手册最后一个问题脱离了产品手册的内容范围AI只能拒绝回答。
Assistants的运行原理
工欲善其事必先知其理。在编写Assistants的代码之前我们先要搞清楚它是怎么运行的然后写代码的时候才能有的放矢、逻辑清晰。
请看下边这张图 1、创建智能助手Assistant这一步我们要给智能助手下个定义包括起个名字、声明它的能力、使用的大模型版本、增强能力的方式执行代码、从知识库检索、调用外部函数等。
2、创建用户会话Thread会话就是用户和智能助手之间的一次聊天GPT可以通过会话方便的管理聊天上下文。
3、添加用户消息到会话Message就是用户向智能助手说的话必须添加到会话中。
4、在会话中运行智能助手Run将会话和智能助手进行绑定运行智能助手来处理用户的消息。这一步实际上会创建一个智能助手的执行对象然后把这个执行对象添加到一个处理队列中最终处理状态会更新到运行对象中。
5、获取GPT响应的消息Response通过不断检查运行对象的状态获取智能助手的响应结果。
实现AI客服
我们这里就按照Assistant的运行原理来实现一个AI客服。
产品手册
首先我们要准备一个产品手册随便写点什么都行为了方便大家可以直接下载我这个
https://github.com/bosima/openai-api-demo/blob/main/niubiclean-book.txt
然后我们需要将这个文件上传到OpenAI注意把文件放到程序能够访问到的地方。
niubiclean_book client.files.create(fileopen(niubiclean-book.txt, rb),purposeassistants
)
purpose 可选的值有两个fine-tune 和 assistants。
创建助手
这里使用的是 client.beta.assistants.create 来创建客服因为assistants还没有正式发布所以这里的包空间名称中包含了一个beta正式发布时会去掉。具体代码如下
waiter client.beta.assistants.create(name牛逼净化器智能客服,description24小时为您服务,instructions你是牛逼净化器公司的智能客服请引用文件中的内容回答问题表达要通俗易懂、尽量简短若问题超出文件内容请委婉拒绝。,modelgpt-3.5-turbo-1106,tools[{type: retrieval,}],# 知识文件通过File接口上传的file_ids[niubiclean_book.id]
)
简单说下这几个参数
name智能助手的名字随便起。
description智能助手的简介描述最长 512 字符。
instructions给智能助手的指令也就是提示词让智能助手按照这里的提示词提供服务。这里我用了一个常见的提示词套路让它扮演一个角色有什么样的能力如何回答用户的问题等。最长 32768 字符。
model使用的GPT大模型这里用便宜的3.5你也可以换成GPT-4。
toolsassistants开启的工具共有三种类型code_interpreter、retrieval、function。
code_interpreter是代码解释器能让GPT在一个沙盒环境中执行python代码能从文件读取数据也能生成文件需要通过instructions提示assistant可以执行代码。retrieval从文件检索内容这里我们的AI客服只能根据产品手册回答问题所以这里只开启了retrieval的能力。function和聊天插件的使用方法一样调用执行函数根据执行结果向用户返回内容。
file_ids指定GPT要检索的文件Id可以设置多个。这里设置为我们上一步上传的手册。
创建用户会话
使用 client.beta.threads.create 创建用户会话具体代码如下。
thread_userjia client.beta.threads.create(metadata{姓名: 用户甲,年龄: 36,性别: 男}
)
metadata是可选的可以设置一些附加信息无固定属性key-value格式即可。
添加用户消息到会话
我们其实可以在创建 thread 时初始化一些消息不过既然要对话演示下如何添加消息更有意义。
使用 client.beta.threads.messages.create 来创建一条用户消息并绑定到某个会话代码如下
message client.beta.threads.messages.create(thread_idthread_userjia.id, roleuser, content净化器有什么功能,)
这里有三个参数
thread_id消息绑定到的会话Id。role消息的角色目前只支持 user只能向其中添加用户消息。至于完整的聊天上下文GPT内部会自动维护。content消息内容这个很好理解。
在会话中运行智能助手
使用 client.beta.threads.runs.create 来运行智能助手代码如下
run client.beta.threads.runs.create(thread_idthread_userjia.id,assistant_idwaiter.id,)
这里有两个关键的参数
thread_id要在哪个会话中运行智能助手。assistant_id要运行哪个智能助手。
这里还有一些其它的参数比如model、instructions、tools等使用它们会覆盖我们在创建 assistant 设置的参数。
获取智能助手的回应
运行智能助手后得到的返回值 run 是一个对象代表运行在会话中的一个执行这个执行是通过队列异步处理的我们不能立即得到执行结果需要定期检查 run 的状态处理完毕了才能获取到GPT的回应消息。
先看检查状态的处理
while run.status queued or run.status in_progress:time.sleep(1)run client.beta.threads.runs.retrieve(thread_idthread_userjia.id,run_idrun.id,)
run 有多个状态 queued, in_progress, requires_action, cancelling, cancelled, failed, completed, expired这个例子中如果不是 queued 或者 in_progress 状态就代表已经有结果了。requires_action 是智能助手使用 function 工具时才会存在的状态这个例子不涉及。 状态 含义 queued 创建run之后 或者 使用function时确定了要调用的function及其参数 之后就会进入这个状态这个状态很短马上会进入 in_progress状态。 in_progress 使用模型或者tools处理消息。 completed 本次运行成功完成可以读取GPT响应的消息了。 requires_action 使用function时一旦模型确定要调用的function及其参数run将进入这个状态。 expired function执行的时间太长或者整个run运行的时间太长达到了过期阈值大约10分钟。 cancelling 可以在queued和in_progress状态时发起取消将进入这个状态。 cancelled 已成功取消。 failed 您运行失败了可以在 run.last_error 中获得失败原因。
使用 client.beta.threads.messages.list 获取GPT响应消息代码如下 if run.statusfailed:print(run.last_error.message)
else:messages client.beta.threads.messages.list(thread_idthread_userjia.id, orderasc, aftermessage.id)print(牛逼智能客服,extract_message_content(messages.data[0]),\n)
获取响应消息时用到了3个参数
thread_id会话Id。order消息排序asc代表正序也就是先产生的消息在前边。after指定消息的起始位置因为我们要获取GPT针对某条用户消息的响应所以这里通过after指定获取某条用户消息之后的消息也就是GPT的响应消息。
最后我们还使用了一个函数来提取消息内容extract_message_content代码如下
def extract_message_content(message):# Extract the message contentmessage_content message.content[0].textannotations message_content.annotations# Iterate over the annotations and add footnotesfor index, annotation in enumerate(annotations):# Replace the text with a footnote# print(annotation.text)message_content.value message_content.value.replace(annotation.text, )return message_content.value
注意这里有一个annotation的概念中文就是注解的意思。因为AI客服生成的内容可能来自多个产品文档有了注解用户就可以通过它跳转到相关的文档进行详细阅读。这个和论文中的引用注解是同一种方式。
不过我们这里的产品手册比较简单所以就把注解都替换成空字符串了。完整的处理方法可以参考下边这个
# Extract the message content
message_content message.content[0].text
annotations message_content.annotations
citations []# Iterate over the annotations and add footnotes
for index, annotation in enumerate(annotations):# Replace the text with a footnotemessage_content.value message_content.value.replace(annotation.text, f [{index}])# Gather citations based on annotation attributesif (file_citation : getattr(annotation, file_citation, None)):cited_file client.files.retrieve(file_citation.file_id)citations.append(f[{index}] {file_citation.quote} from {cited_file.filename})elif (file_path : getattr(annotation, file_path, None)):cited_file client.files.retrieve(file_path.file_id)citations.append(f[{index}] Click here to download {cited_file.filename})# Note: File download functionality not implemented above for brevity# Add footnotes to the end of the message before displaying to user
message_content.value \n \n.join(citations)
完整示例
我在完整的示例程序中向智能助手循环提出了四个问题每个问题都需要重新创建一个run然后再检查状态获取响应结果。 需要完整代码的同学请访问Github
https://github.com/bosima/openai-api-demo/blob/main/assistants_demo.ipynb 以上就是本文的主要内容有兴趣的同学快去试试吧效果绝对震惊你的小伙伴 如需GPT账号、学习陪伴群、AI编程训练营推荐关注小册大模型应用开发 | API 实操 关注萤火架构加速技术提升