跳至主要內容

加餐1|魔改 GPT,快速打造一个私人助手

AI悦创原创ChatGPTChatGPT大约 8 分钟...约 2305 字

你好,我是悦创。

相信最近你一定听到了不少 ChatGPT 的讨论,甚至自己也体验过了。

不知道你感觉如何?对于 ChatGPT,我印象最深刻的就是它仅仅通过多次对话,就可以按我们期望不断优化输出内容的能力。原本令人头大的文本整理工作,现在我们只需要给 ChatGPT 下达类似编程指令一样的 Promopt 就可以轻松搞定,这帮助我们节约了不少时间和精力。

不过,现在的 ChatGPT 还是有局限性的,它收集的资料截止到 2021 年,并没有最新的内容。另外,token 字数上的限制也不太方便,在梳理大量文本或者做总结的场景里使用起来很麻烦。

这节课,我就带你一起基于 GPT 做点“魔改”,做一个更方便我们使用的私人小助手,这是一个嵌入了 Faiss 私有数据库的小助手,它能帮你实现知识库、资料整理(突破默认 token 字数限制)、内容总结和文章润色等功能。

想实现这个小助手,我们需要用到 Python 3.10、LangChain 0.0.145 还有 OpenAI 0.27.0(由于这几个开发依赖包比较新还在持续迭代,未来可能会因为依赖包升级导致无法使用情况,届时我会再同步更新)。

1. 基础知识及对话接口

想要魔改,先得熟悉一下 GPT 的基础调用方法,所以我们先热热身,看看如何实现基础的对话。

对接 ChatGPT 的基础对话功能很简单,接口文档地址是 https://platform.openai.com/docs/api-reference/chat/createopen in new window

我们使用这个接口,就可以直接跟 OpenAI 通讯,官方提供的 API curl 示范是后面这样。

我的 token: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

跟我学的,可以跟我申请 API token,因为这个我也是要付费的,一天 10元来给你计算费用,不用就删除。

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

我们运行前面的代码,调用 OpenAI 以后,就得到了后面的返回内容。

{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

相信你也是迫不及待的想要测试上面的代码,但是会遇到下面👇的报错:

curl: (7) Failed to connect to api.openai.com port 443: Connection timed out

我想说:放弃吧,你想在国内运行成功是不可能的。全局代理都不行,Mac、云服务器,都不能正常运行。

你有可能想用谷歌的 colab,但是除非你有钱!

Photo
谷歌 Colab
谷歌 Colab

租服务器是不切实际的,直接用这个:https://replit.com/open in new window

前面的代码很好理解,这里要提示你一下, OPENAI_API_KEY 我们需要去 https://platform.openai.com/account/api-keysopen in new window 获取。另外要注意,目前 OPEN AI 对免费普通用户做了限速,20 秒只能请求一次。

可以看到,聊天接口需要的参数并不是很多,基本上就是用哪个模型以及输入的内容是什么。

目前 OpenAI 提供的模型主要是后面图里这些,还有更多其他选型你可以查看官方文档open in new window

可以看到,这个列表中还有其他模型可以选,那为什么我们还是选择了 GPT3.5 这个模型作为后续演示的基础呢?

这是因为成本问题、虽然 GPT-4 更智能,但是价格比 3.5 版本贵上 15~20 倍,并且只有很少一部分人拥有试用的权限。

选好模型之后,我们继续看看对话里面的结构。其实这个结构是一个数组,它可以放多条对话内容,如果我们和 ChatGPT 多次互动的话,那么最近的历史会话都要在这里传递,也就是说上下文都在这里传递。因此,这个部分很重要,如果我们想做本地私有知识问答、总结以及大量文本生成等服务,都需要在对话的数组这里做文章。

我们再看看官方示范代码。

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

代码里的 message 我要单独说明一下,其实它就是我们跟人工智能的对话历史和新提交的内容。其中每句对话都会有个 role 属性,这个属性代表了这句话的用途和来源。

我们再来看看 role 后面这几个具体属性都是什么意思。

  • system:拥有这个属性的 message 可以用于系统功能定义。它对返回结果的表达方式有一定影响,但影响有限。有的时候这里的定义不会立即生效,需要在后续 user 再次提及才会生效。
  • assistant:拥有这个属性的 message 代表是这句话是 ChatGPT 的回复内容,每次请求带上这个历史,可以帮助人工智能了解之前对话内容的上下文。
  • user:拥有这个属性的 message,都是用户提交的对话内容

对话功能我们分析得差不多了,你会发现整体看起来很简单。为了让你聚焦重点,我省略了不太重要的参数,你想了解的话,可以去看一下 API 文档open in new window的介绍。

2. 模型的长度限制

前面我们提到了 GPT 3.5 的 token 限制,具体就是模型里限制了 message 内容不能超过 4096 个 token,超过了请求就会被拒绝。这里的 token 是 OpenAI 里面的计量单位。你可以通过这个链接open in new window测试一个文本占用多少 token,不过需要注意,这个测试工具不支持中文,对于中文测试不准。

代码上我们可以使用 tiktokenopen in new window 包 来统计 token 。一般来说,常见的中文 utf8 一个汉字就是一个 token,使用 cl100k_base 编码 encode 后直接计算数组元素个数就能统计(官方推荐把一些无用回车和空格替换成单个空格,这样可以节省 token)。

point1

如何使用 tiktoken 计数令牌

但是如果内容超过了 4096 这个长度,我们应该如何做呢?

这就不得不提到 LangChain 这个开源库了,它能轻松将多个 LLM 和各种辅助功能拼装在一起,能帮我们方便地实现模型的各种组合。长文本处理方面,你可以参考后面的链接open in new window做更多了解。

基于 LangChain 的支持,有三种常用方式供我们选择,我们分别看看它们的思路和适用场景。

  1. FIFO 先进先出方式: 当长度超出规定长度时触发,会自动删除掉老对话内容,适合闲聊或者上下文关联不强的数据分析。
  2. 对话历史汇总: 也就是 ChatGPT 对旧的对话历史做一次文本汇总,借此减少文本长度。这个方式能让我们的长内容对话不会丢失太多上下文,可以用来做文本的内容总结。
  3. 本地向量近似度数据库: 这个方式适合大规模文本生成,比如长篇小说、大规模代码开发、自定义助理。实现思路等到后面“Embedding 与向量库”的部分,我再具体讲解。

其实这几个功能是可以相互组合的。不过组合的场景有些复杂,我们还是循序渐进地学习,这样效果更好。接下来,我们就结合一些细分场景来继续讨论怎么魔改。

title: point2
desc: 文本如何向量化?
logo: /aiyc.svg
link: /column/AI-Large-model/extra_meal/01-2.html
color: rgba(253, 230, 138, 0.15)

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度