我将Jev变成了一个(糟糕的)聊天机器人

Hacker News Top 工具

摘要

这个GitHub项目使用Jev模型创建了一个具有各种采样策略的糟糕聊天机器人,在Claude的帮助下开发,作为一个有趣的实验。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/20 18:35

kyle-pena-nlp/jevchat

来源:https://github.com/kyle-phea-nlp/jevchat

jevchat

我们了解 Jev (https://docs.typesafe.ai/api)。jevchat 将其转化为一个聊天模型。在每一步中,它向 Jev 提出一个问题:

给定用户的问题和已生成的回复,下一个符号应该是哪个?

选项包括一个字母表,以及一个停止生成的选项。Jev 为每个选项返回一个概率值,然后采样器从该归一化分布中抽取下一个符号。如此循环:追加、重复,直到抽中 STOP 为止。

该工具提供多种字母表和采样策略。它的设计初衷是趣味性,成本不太实用,但结果非常有趣。这是一个由 Claude 加速完成的实验:我描述了采样算法、策略等,然后由它实现。

设置

poetry install

将你的 Jev 密钥放在 pyproject.toml 旁边的 .env 文件中(该文件会被 git 忽略):

api_key="..."

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

使用

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 <value>/stop-bias <value>/reset/stats/exit

模式

有两件事情可以替换:

  1. 如何获得下一个符号的分布(-s/--strategy
  2. 分布是基于什么-a/--alphabet

以下每种组合都是一个可运行的命令。

策略

  • choice:对整个字母表提出一个问题。
  • bisect:将字母表排序,然后通过一系列“早/晚”的“是/否”问题缩小范围,直到组内只剩少量符号,再在其中进行选择。
# 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,然后对胜出者提问,最后进行一次重新评分的核。
# 正确符号的概率加倍,并且解析的词汇量大约是 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 时,temperaturetop_ptop_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 模式下,选项是生成后的文本

answer_so_far = "The capital of France is Par"
symbol options: 'a' 'i' 's' ... STOP
hypothesis options: '...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 准确率提升了三倍,并将落在正确符号上的概率质量增加了一倍,同时比符号选项(及其每个选项的描述)所需的输入 token 更少。

测试

poetry run pytest

158 个测试,全部离线运行——针对生成循环使用脚本化的假客户端,针对 HTTP 层使用 httpx.MockTransport。无需 API 密钥,也无需网络连接。

jevchat bench 是实际调用 API 的部分。

相似文章

体验Jev——一种有趣的AI代理方法

Reddit r/ArtificialInteligence

作者讨论了尝试使用Jev,这是一种专注于决策的AI代理工具,与使用大型语言模型处理所有任务相比,它声称在速度和成本上有显著优势。

Jev-like逆向工程模型

Hacker News Top

本文介绍了'jevlike',一个用于在一次传递中从文本选项中选择的逆向工程AI模型,有演示如Doom和国际象棋游戏,托管在GitHub上。