ChatGPT的GPTs

ChatGPT的GPTs的Playground

updates: 直到2023年12月11日,Assistant API 还尚不支持stream传输: Stream Assistant Response - API - OpenAI Developer Forum — Stream Assistant 响应 - API - OpenAI 开发者论坛

How Assistants work - OpenAI API — 助手的工作原理 - OpenAI API

Playground

链接:Playground - OpenAI API

什么是GPTs,就是自定义的Chatgpt,具有你设置的特殊能力的ChatGPT,特殊能力包括检索给定的文献,调用一些工具,例如查询天气。运行代码,例如绘图,等等。

下面是根据自己的知识库进行回答问题的示例。

测试案例,支持检索的文件目前包括pdf,不支持xlsx文件,csv文件, 支持json文件,推荐json文件, 支持的文件包括:

[‘c’, ‘cpp’, ‘csv’, ‘docx’, ‘html’, ‘java’, ‘json’, ‘md’, ‘pdf’, ‘php’, ‘pptx’, ‘py’, ‘rb’, ‘tex’, ‘txt’, ‘css’, ‘jpeg’, ‘jpg’, ‘js’, ‘gif’, ‘png’, ‘tar’, ‘ts’, ‘xlsx’, ‘xml’, ‘zip’]

Price

https://openai.com/pricing
价格GPT-3.5 Turbo 的费用是$0.0010/1K tokens

Assistants API除了指定模型的token费用,还包含检索、代码解释器的费用,代码解释器费用每次对话$0.03, 检索Retrieval:$0.20/GB/assistant/day, 首次构建可能消耗嵌入模型费用$0.0001/1K tokens

所有模型列表

“gpt-4-1106-preview”,
“gpt-4-vision-preview”,
“gpt-4”,
“gpt-4-0314”,
“gpt-4-0613”,
“gpt-4-32k”,
“gpt-4-32k-0314”,
“gpt-4-32k-0613”,
“gpt-3.5-turbo-1106”,
“gpt-3.5-turbo”,
“gpt-3.5-turbo-16k”,
“gpt-3.5-turbo-0301”,
“gpt-3.5-turbo-0613”,
“gpt-3.5-turbo-16k-0613”,

Assistants 的工作原理

1)首先需要创建一个Assistant 助手,其中可以设置名称,指令,使用的模型等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from openai import OpenAI

client = OpenAI()

assistant = client.beta.assistants.create(
name="Math Tutor",
instructions="You are a personal math tutor. Answer questions briefly, in a sentence or less.",
model="gpt-4-1106-preview",
)
show_json(assistant)

{'id': 'asst_9HAjl9y41ufsViNcThW1EXUS',
'created_at': 1699828331,
'description': None,
'file_ids': [],
'instructions': 'You are a personal math tutor. Answer questions briefly, in a sentence or less.',
'metadata': {},
'model': 'gpt-4-1106-preview',
'name': 'Math Tutor',
'object': 'assistant',
'tools': []}

2)创建线程Thread,每一个使用的用户都需要一个专用线程和助手进行对话,因为线程存储了这个用户对话的上下文信息,即历史记录信息。线程还会确保对模型的请求适合最大上下文窗口,即对输入的文本进行截断操作。线程是用户和助手直接的桥梁。

1
thread = client.beta.threads.create()

3)给线程添加Message消息

消息首先是由用户提供,就是用户的问题,然后助手回复的也是消息,消息类型可以是文本、图像和其他文件,消息类型是以列表形式存储在线程上。下面是用户发送一条消息给线程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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?",
)
show_json(message)

#立刻返回的结果是用户的问题的消息,待会运行后,助手的消息也是在message中存在。
{'id': 'msg_IBiZDAWHhWPewxzN0EfTYNew',
'assistant_id': None,
'content': [{'text': {'annotations': [],
'value': 'I need to solve the equation `3x + 11 = 14`. Can you help me?'},
'type': 'text'}],
'created_at': 1699828332,
'file_ids': [],
'metadata': {},
'object': 'thread.message',
'role': 'user',
'run_id': None,
'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}

4)Run 运行

Run是关联Assistant和Thread的,它们是通过id被Run关联的,关联了,就代表正式开始运行了,下面是1个创建Run的示例, 创建的Run是一个异步行为,这代表模型正在进行推理,不会立刻返回结果,我们要不断的监控run的状态,直达它的状态由queue状态变成completed状态。表示模型推理完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
)
show_json(run)

# Run的输出
{'id': 'run_LA08RjouV3RemQ78UZXuyzv6',
'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS',
'cancelled_at': None,
'completed_at': None,
'created_at': 1699828332,
'expires_at': 1699828932,
'failed_at': None,
'file_ids': [],
'instructions': 'You are a personal math tutor. Answer questions briefly, in a sentence or less.',
'last_error': None,
'metadata': {},
'model': 'gpt-4-1106-preview',
'object': 'thread.run',
'required_action': None,
'started_at': None,
'status': 'queued',
'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG',
'tools': []}

查看Run的状态, queued –>in_progress –> completed

time
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

def wait_on_run(run, thread):
while run.status == "queued" or run.status == "in_progress":
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id,
)
time.sleep(0.5)
return run
run = wait_on_run(run, thread)
show_json(run)

{'id': 'run_LA08RjouV3RemQ78UZXuyzv6',
'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS',
'cancelled_at': None,
'completed_at': 1699828333,
'created_at': 1699828332,
'expires_at': None,
'failed_at': None,
'file_ids': [],
'instructions': 'You are a personal math tutor. Answer questions briefly, in a sentence or less.',
'last_error': None,
'metadata': {},
'model': 'gpt-4-1106-preview',
'object': 'thread.run',
'required_action': None,
'started_at': 1699828332,
'status': 'completed',
'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG',
'tools': []}

5)当Run是completed状态的时候,我们就可以查看Messages信息了,messages的最新信息里面是助手回复的信息,消息按时间倒序排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
messages = client.beta.threads.messages.list(thread_id=thread.id)
show_json(messages)

{'data': [{'id': 'msg_S0ZtKIWjyWtbIW9JNUocPdUS',
'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS',
'content': [{'text': {'annotations': [],
'value': 'Yes. Subtract 11 from both sides to get `3x = 3`, then divide by 3 to find `x = 1`.'},
'type': 'text'}],
'created_at': 1699828333,
'file_ids': [],
'metadata': {},
'object': 'thread.message',
'role': 'assistant',
'run_id': 'run_LA08RjouV3RemQ78UZXuyzv6',
'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'},
{'id': 'msg_IBiZDAWHhWPewxzN0EfTYNew',
'assistant_id': None,
'content': [{'text': {'annotations': [],
'value': 'I need to solve the equation `3x + 11 = 14`. Can you help me?'},
'type': 'text'}],
'created_at': 1699828332,
'file_ids': [],
'metadata': {},
'object': 'thread.message',
'role': 'user',
'run_id': None,
'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}],
'object': 'list',
'first_id': 'msg_S0ZtKIWjyWtbIW9JNUocPdUS',
'last_id': 'msg_IBiZDAWHhWPewxzN0EfTYNew',
'has_more': False}

6)用户问下一个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Create a message to append to our thread
message = client.beta.threads.messages.create(
thread_id=thread.id, role="user", content="Could you explain this to me?"
)

# Execute our run
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
)

# Wait for completion
wait_on_run(run, thread)

# Retrieve all the messages added after our last user message
messages = client.beta.threads.messages.list(
thread_id=thread.id, order="asc", after=message.id
)
show_json(messages)

测试一个api调用界面的结果

用时估计

Assistant API的返回结果随着文档随着文档变大,速度变慢,个人感觉文档大时,候选topk文档数量越多,导致输入文本过长,那么Openai的模型速度越慢,而且Assistant Beta版本还不支持流式stream输出,所以感觉特别漫长,平均回复在30秒上下。

异常问题

Assistant API 返回的内容经常携带【13†source】,【16†source】等特殊字符,如下

1
嗯哼,Johnson,你提到的木质玫瑰香,我找到了一个相似的香水可能会符合你的喜好——“观夏昆仑煮雪”。这款香水具有玫瑰和木质的香调,它的中调恰好包括了玫瑰,给人带来清新辛辣的感受,同时还带有木质芳香植物的气息,感觉上是深沉而又清凉的,非常独特【13†source】。这款中性香型的香水可能不完全像卡诗鱼子酱精油的味道,但它的木质感和温暖感可能会让你惊喜。感兴趣的话,你可以在这里查看更多详情和购买链接:[观夏昆仑煮雪](https://detail.tmall.com/item.htm?abbucket=11&id=676539654541&rn=760fb2aa967606ede8027516fab139b9&skuId=4859629692517&spm=a1z10.3-b-s.w4011-24426768373.74.5a6435d7t1Pawn)。别忘了,每个人的鼻子都是独一无二的,试试才知道是否合拍哦!

Openai的官方论坛上有相关说明,是Openai的一个bug。建议返回时通过正则匹配替换掉。
Assistant API always return empty annotations - API / Bugs - OpenAI Developer Forum — Assistant API 总是返回空注解 - API / Bugs - OpenAI 开发者论坛


ChatGPT的GPTs
https://johnson7788.github.io/2023/11/16/ChatGPT%E7%9A%84GPTs/
作者
Johnson
发布于
2023年11月16日
许可协议