1 资源

  • openai 客户端源码:

    https://github.com/openai/openai-python/

  • openai 各种 API 示例:

    https://platform.openai.com/examples

  • assistant 示例:

    https://platform.openai.com/docs/assistants/overview

2 Assistant 功能

  • 代码解释器
  • 检索功能
  • 函数调用

3 操作步骤

(较之前的 api 略复杂)

  • 升级 openai api
1
pip install --upgrade openai
  • 创建 Assistant,定义其 instruction 并选择模型,如果需要,设置代码解释器、检索和函数调用功能。
1
2
3
4
5
6
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"
)
  • 开始对话时,创建一个线程。
1
thread = client.beta.threads.create()
  • 随着用户提出问题,向线程添加消息。
1
2
3
4
5
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?"
)
  • 在线程上运行助手以触发回应,此时自动调用相关的工具。
1
2
3
4
5
run = 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."
)
  • 查询状态
1
2
3
4
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
  • 显示消息(收/发)
1
2
3
messages = client.beta.threads.messages.list(
thread_id=thread.id
)
  • 注意
    • 如果对 Python 程序不熟悉,可以在 Playground 界面中操作

4 实测:文档解析

上传了一个 markdown 文件,希望提取出子标题下的内容,使用 GPT4 Turbo 模型。

4.1 测试一:一次提问多个问题

  • 数据:上传 XXX 合同文档(人名脱敏),约 7K 左右,2K 汉字。
  • 问题:请从上传的文档中提取核心项 'aaa','bbb','ccc','ddd',使用原文回答。
  • 运行结果:
    • 执行时间:该次提问约 30s 返回(不包含上传文档及解析时间)
    • 返回结果:返回结构基本是对的,返回的核心项内容无法直接使用:不是原文,是经过提炼的内容,50-60% 意思对,但内容对不上,有点像”复述课文“。

4.2 测试二:单独提问(测试两次不同项)

  • 数据:同上
  • 回答:请在文中找 "aaa" 对应的数据块,用原文回答,不要加其它内容。
  • 运行结果:
    • 回复内容:219 中文字符 0.09$,190 中文字符 0.14$
    • 单次返回时间约 10-15s 左右
    • 其中一个回答基本是对的;另一个文本是对的,但没包含数据表

(具体测试结果见 GPT_Assistant_测试附图,涉及私有数据,不便公开)

5 分析讨论

(以下均为个人看法,只测试了少量内容,不一定正确)

5.1 合并提问

  • 如果一次问一个问题,正确率比较高,可能由于每次都需要把检索到的内容也传给模型,所以总计 token 计费大于问题和答案之和。
  • 同时提问多个问题正确率低,一方面可能是模型生成问题,也可能由于不同答案位于不同数据块内,无法一次送入模型。

5.2 价格

  • 我的每次检索数据相关提问至少在 0.1$ 左右,可能由于先检索,然后把检索的内容和问题一起送入 GPT4-Turbo 计算,这样每次提问,至少包含问题、答案和一个检索块的大小(如 512token),而且单块可能还不止 512token,也可能不止一个备选块。
  • 目前在测试阶段,上传文档时解析好像没算钱(Embedding 也比较便宜)存储和检索也没算钱。
  • 实测费用感觉明显高于问题和答案的累计,可能是由于 Assistant 默认记忆历史对话,并将历史对话代入当前计算,也被计入了 token。因此,在使用 playground 或程序调用时,如果不需要考虑历史对话,注意点击右上角 Clear 清除历史对话。

5.3 其它发现

  • 不开通 GPT4 20$ 包月的情况下,也可以测试 GPT4-Turbo,可能是由于第一个月免费。具体按 GPT4-Turbo 调用计费(价格约为 GPT3.5 的 10 倍)。
  • assistant 不仅支持 GPT4 Turbo,还支持 GPT3.5 Turbo (gpt-3.5-turbo-1106, gpt-4-1106-preview)

5.4 个人感觉

  • 关键字最好与原文一致,对于某些专业领域,模型对近义词的理解能力略差。
  • ”用原文作答“或者”在原文中定位“对于解决幻觉问题比较重要,个人感觉效果一般,价格小贵。
  • 在不用原文作答时,如果是判断或者选择题,还能比较客观地评价;对于开放性问题,用户很难判断回答是否准确。
  • 用它解析局部的问题还行,整个方案都交给他可能还是不太行。
  • 这几个月像 langchain,llamaindex,GPT 学术已经把周边的内容做得很细化了,OPENAI 的 assistant 用起来比较省事,但效果未必更好。