Hacker News 中文摘要

RSS订阅

我把 Jev 做成了一个(很烂的)聊天机器人 -- I turned Jev into a (lousy) chatbot

Jevchat(jevchat)把杰夫(Jev)变成一个聊天模型。每一步它只向杰夫提一个问题:根据用户的问题和已经写出的回复,下一个符号是什么?选项包括一个字母表以及停止输出的选项。杰夫为每个选项返回概率,采样器按归一化分布抽取下一个符号,追加、重复,抽到 STOP 就停下。项目提供多个字母表(含截断的 token 列表)和采样策略,为了好玩,成本不太现实,结果很搞笑。

正文

我们了解 Jev。

jevchat 将 Jev 变成了一个聊天模型。每一步它都会向 Jev 提一个问题:

根据用户的问题和目前已写出的回复,下一个符号应该是什么?

选项包括一套字母表以及一个停止输出的选项。Jev 会为每个选项返回概率,采样器从这个归一化分布中抽取下一个符号。追加、重复,抽到 STOP 时停止。

目前有多种字母表(含截断的词元列表)和采样策略可用。

这个点子是为了好玩,成本不太实用,但结果很搞笑。

示例效果

设置

执行 poetry install。

在 pyproject.toml 旁边的 .env 文件(已被 git 忽略)里放入 Jev key:api_key="..."。

同时也接受 JEV_API_KEY 和 TYPESAFE_API_KEY。.env 中的值优先于导出的环境变量,因此只需编辑该文件即可切换 key。

使用

常用命令:

  • poetry run jevchat(交互聊天)
  • poetry run jevchat ask "do people need water?"
  • poetry run jevchat alphabets(查看可采样对象)
  • poetry run jevchat bench(对比所有模式,见下方表格)

回复在采样时实时显示在一个面板里,附带生成速率(符号/秒、字符/秒、每次 API 调用毫秒数、已用时间)的实时读数,以及上一步 Jev 评分最高的几个符号,方便观察采样器抽取的分布。

Ctrl-C 取消。 第一次按会在进行中的请求返回后停止生成并保留部分回复;第二次按立即中止。聊天中部分回复会保留在对话历史里。ask 取消时退出码为 130。

聊天命令:/help、/alphabet [name]、/temp <v>、/stop-bias <v>、/reset、/stats、/exit。

模式

有两样东西可替换:如何获取下一个符号的分布(-s/--strategy),以及分布是关于什么的(-a/--alphabet)。下面每种组合都是可运行命令。

策略

choice 针对整个字母表提一个问题。bisect 将字母表排序后反复用较早/较晚的是非题收窄分组,直到组很小,再在组内提一个 choice 问题。

  • choice——针对整个字母表提一个问题(默认): poetry run jevchat -s choice ask "how many eyes do people have?"
  • 不带消除 Jev 位置偏见的重排序(最差模式): poetry run jevchat -s choice --no-shuffle-criteria ask "how many eyes do people have?"
  • 平均 4 次重排序,在一个请求里作为 4 个并行问题发出: poetry run jevchat -s choice --ensemble 4 ask "how many eyes do people have?"
  • bisect——按较早/较晚二分到 20 个一组,每次切分两边都问: poetry run jevchat -s bisect ask "how many eyes do people have?"
  • 更便宜:更大的组,每次切分只问一次: poetry run jevchat -s bisect --bisect-cutoff 32 --no-bisect-swap ask "how many eyes do people have?"
  • buckets——字母表分到多个问题,每个带 OTHER 逃逸。唯一能容纳超 255 符号的策略: poetry run jevchat -a words1k -s buckets ask "what colour is snow?" poetry run jevchat -a bpe5k -s buckets --bucket-size 127 ask "what is the capital of france?"
  • refine——buckets,然后对胜出者提一个问题,再做重评分的 nucleus。正确符号概率翻倍,解决的词表约为 19 倍: poetry run jevchat -a words1k -s refine ask "where do fish live?" poetry run jevchat -a words1k -s refine --refine-nucleus 6 --refine-rounds 2 ask "…"

呈现方式

  • hypothesis——选项为生成的文本(默认): poetry run jevchat -p hypothesis --window 40 ask "what colour is snow?"
  • symbol——选项为裸符号,即本项目的初版做法: poetry run jevchat -p symbol ask "what colour is snow?"

束搜索

  • 保留 3 条候选回复而非逐符号提交: poetry run jevchat -b 3 ask "what is the opposite of hot?"

每步每个存活束消耗一次评分。宽度大于 1 时,temperature、top_p、top_k 不再生效——束按概率排名而非从中抽样。

字母表

  • poetry run jevchat -a lower26 -t 0 ask "what is 2+2?"(仅 a-z 和空格)
  • poetry run jevchat -a ascii -t 0 ask "what is 2+2?"(可拼任何东西)
  • poetry run jevchat -a tokens -t 0 ask "do people need water?"(整词)

以下三个超过 255 选项,需用 --strategy buckets:

  • poetry run jevchat -a words1k -s buckets -t 0 ask "what colour is grass?"
  • poetry run jevchat -a bpe2k -s buckets -t 0 ask "where do fish live?"
  • poetry run jevchat -a bpe5k -s buckets -t 0 ask "what do bees make?"

组合使用

  • poetry run jevchat -a tokens -s bisect --bisect-cutoff 20 ask "do people need water?"
  • poetry run jevchat -a ascii -s choice --ensemble 12 -t 0.2 --repetition-penalty 1.0 ask "what colour is grass?"

假设选项

向 Jev 问同一个问题有两种方式。在 --presentation symbol 下,选项是符号本身(如 'a'、'i'、' the'),Jev 需在脑中将选项追加到回复后再判断。之前的指令就明确写了:“判断语法和拼写要看拼接结果,而非选项自身。”

在 --presentation hypothesis 下,选项是结果文本:

已写回复为 "The capital of France is Par"。

symbol 选项:'a'、'i'、's'、…、STOP

hypothesis 选项:'…he capital of France is Para'、'…he capital of France is Pari'、'…he capital of France is Pars'、'…he capital of France is Par'(不变,即 STOP)

追加已经做好,所以 Jev 只需对完整字符串排序——这正是决策模型擅长的。这是项目里最大的单点提升:在字符字母表上,top-1 概率约增至三倍,落在正确符号上的概率质量翻倍,且比带逐选项描述的 symbol 选项用的输入 token 更少。

测试

执行 poetry run pytest。

158 个测试全部离线——生成循环用脚本伪造客户端,HTTP 层用 httpx.MockTransport,无需 API key 和网络。jevchat bench 是唯一会调用 API 的部分。

评论

社区对 Jev 的讨论以轻松二次创作为主,多数人将其当作快速迭代的玩具并贡献幽默类比,少数人探究其底层是否只是嵌入匹配。

Jev 使从想法到实现的时间骤降

  • 有用户多次计划基于 Jev 做衍生项目,每次动手前都已有人发布类似成果,反映出社区原型迭代速度极快(较多人) > 从产生念头到做出东西所花的时间简直跌下了悬崖(@petesergeant)

Jev 类似直觉型或注意力缺失的个体

  • 多名用户用生活化比喻描述其单 token 预测特性,认为它只做系统1思考,像重度 ADHD 朋友,或如动画里借助死亡水晶迭代说话的角色(较多人) > 鉴于 Jev 只做系统1思考,它就像你那个 ADHD 严重的朋友(@yipinwong)

用 Jev 模拟宠物按钮或通灵板成为流行实验

  • 用户让模型生成理由再由 Jev 打分,或自制通灵板与之交互,这种降智对话被视为像训练狗按沟通按钮般有趣(较多人) > 感觉就像那些给狗准备按键让它按的人(@ralusek)

建议以候选词或表情符号优化交互

  • 有人提出返回补全候选短列表以节省轮次,另有人反向认为人类语言非其所长,改做表情符号机器人更契合架构限制(少数人)

怀疑 Jev 本质仅为嵌入检索

  • 有用户疑惑为何不能把输入和决策全部嵌入,直接返回余弦相似度,而非复杂生成(少数人)

Jev 的笨拙输出意外治愈社区

  • 模型对写故事请求只回简短词等反应让多名用户捧腹,有人称坏心情被例子缓解(较多人) > 我想这是我第一次明知是模型的笑话而笑出声(@OtherShrezzing)