经过短暂的兴奋之后,你意识到只有 4000 个 token 的上下文似乎不能完成你想完成的工作。
然后又经过 GPT-4 发布后的短暂兴奋,你意识到有 32000 个 token 似乎够了。
但是你真的打算把你的整个代码仓库用 32000 个 token 扔进去,然后等他把你今天的工作成果给吐出来吗?似乎 32000 个 token 都不够用啊。

ChatGPT 利用的 5 重境界

按照从业余到专业,分为以下5重:

  1. 【输入文字少,输出文字多】:比如说,我想写一本民国穿越小说。然后等着 ChatGPT 给你把小说吐出来。
  2. 【输入文字多,输出文字少】:比如说我给 ChatGPT 5 条评论做为例子。然后让 ChatGPT 把接下来的 3 条评论仿照前 5 条的例子做同样的分类。也就是你不是来 ChatGPT 来找内容生成的灵感的,而是把它当作一个海量信息处理的工具。这个处理规则很复杂,没法手写,只能由AI来推断。
  3. 3.【你帮它做好任务拆解】:但是 token 不够了。为了解决这个问题,你帮它把一个大任务提前拆解好多个小任务。然后每个小任务调用一次。最后再拼接起来。比如要做一个超大文档的摘要任务。你可以搞一个切成小块的方法,然后每次让ChatGPT只做一个块的摘要。
  4. 【接入工具】:让 ChatGPT 使用工具。也就是 ChatGPT 输出的文本实际上是给你的指令。比如说ChatGPT 说这题我不会,我想Google一下这个关键字。然后你就按照ChatGPT的指令,去Google搜索完了,再把结果做为下一次的chat喂回去。
  5. 【让ChatGPT来分解任务】:你帮它做好分解任务毕竟是一个基于规则的算法,对问题的适应性有限。如果任务分解也由ChatGPT自己来呢?

    输入文字多,输出文字少

    基础的信息处理 Prompt 满大街都是了。

    I want to write a {{$chapterCount}} chapter novella about: {{$input}} There MUST BE {{$chapterCount}} CHAPTERS. INVENT CHARACTERS AS YOU SEE FIT. BE HIGHLY CREATIVE AND/OR FUNNY. WRITE SYNOPSIS FOR EACH CHAPTER. INCLUDE INFORMATION ABOUT CHARACTERS ETC. SINCE EACH CHAPTER WILL BE WRITTEN BY A DIFFERENT WRITER, YOU MUST INCLUDE ALL PERTINENT INFORMATION IN EACH SYNOPSIS YOU MUST END EACH SYNOPSIS WITH {{$endMarker}}

你帮它做好任务拆解

这方面的资料有
Launch HN: Bloop (YC S21) - Code Search with GPT-4 We get around these limitations with a two-step process. First, we use GPT-4 to generate a keyword query which is passed to a semantic search engine. This embeds the query and compares it to chunks of code in vector space (we use Qdrant as our vector DB). We’ve found that using a semantic search engine for retrieval improves recall, allowing the LLM to retrieve code that doesn’t have any textual overlap with the query but is still relevant. Second, the retrieved code snippets are ranked and inserted into a final LLM prompt. We pass this to GPT-4 and its phenomenal understanding of code does the rest.
基于 GPT-4 / vscode 的重构工具方案 - 知乎 (zhihu.com) 这个任务可以分成两个子任务。找出需要改的代码,根据例子,把修改应用到需要改的代码上。
State of the Art GPT-3 Summarizer For Any Size Document or Format | Width.ai
How to Summarize a Large Text with GPT-3 (allabtai.com)
从文本到图片:ChatGPT + Middle Journey https://twitter.com/nickfloats/status/1635116672054079488
从图片到文本:VQA + ChatGPT https://arxiv.org/pdf/2303.01903.pdf
这种程度的拆解是很难scale的。比如说你想让 Bloop 在你的 codebase 上理解好已有的函数库,写一个新的 UI 来调用这些函数。这是做不到的。

接入工具

关键的难点是用什么样的 Prompt 让 ChatGPT 知道有哪些 tool 可以选择,以及怎么做选择。这方面的 Prompt 范例有
visual-chatgpt/visual_chatgpt.py at main · microsoft/visual-chatgpt · GitHub
langchain/prompt.py at master · hwchase17/langchain · GitHub
semantic-kernel/SemanticFunctionConstants.cs at main · microsoft/semantic-kernel · GitHub
Langchain experiment (github.com)
(1) Riley Goodside 在 Twitter: “From this, we learn: 1) ChatGPT is not a pure language model; prompts are prefixed with external information: “You were made by OpenAI”, plus the date. Followers of mine might find this familiar:” / Twitter

这些使用工具的 Prompt 都“巨长”。但是根据 通往高级智慧之路:一步到位的 GPT4 分苹果游戏 在 GPT4 里,Prompt 可以这部分完全去掉,整个长度从 40 行变成十来行。这将极大提高实用性。
能够使用的工具里有两种是最强大的,也是Prompt最难写的:
主动调取召回记忆的工具:比如要求从 Vector Database 里进行某个自然语言的查询
求助于人:就是说这个题,条件不全啊。老师你给补充一个呗

当我们手工分解任务的时候,需要把之前的任务的历史信息,发给后续的任务里做为输入。这样就很容易超过 4000 token 的长度限制。如果能把对 memory 的召回,也做为一种可选择的 tool。让 ChatGPT 对于需要召回哪些历史信息给一个自主的选择。这个选择以对 vector database 的搜索表达出来。那么似乎就可以节省大量的无意义的 context 传递。

让ChatGPT来分解任务

相关资料
https://github.com/nat/natbot/blob/main/natbot.py
The surprising ease and effectiveness of AI in a loop (Interconnected)
这个路线最离谱的是 GPT-4满分第一名通过大厂模拟面试,微软154页研究刷屏:与AGI的第一次接触-36氪 (36kr.com) GPT4在TaskRabbit平台(美国58同城)雇了个人类帮它点验证码。
Semantic Kernel 的 prompt (semantic-kernel/SemanticFunctionConstants.cs at main · microsoft/semantic-kernel · GitHub) 尤其有意思
先是念个咒语,生成一个 plan。plan 的步骤分成了两个类型,一个是机械的callFunction,就是函数调用
一个是所谓的step,也就是给chatgpt的指令。也就是由chatgpt执行的function
那么怎么执行这个plan呢。是用了一个改写的prompt,把这个plan做为输入,让chatgpt作一步改写,也就是消除调一个step,输出一个新的plan
反复改写plan,就是执行plan了
生成的 plan 长这个样子
ChatGPT 的 Plugin 也是这样工作的