jevchat 將 Jev 轉換為 (糟糕的) 聊天機器人 – 功能、模式與社群反應
TL;DR
jevchat 是一個開源封裝工具,透過反覆提問「根據使用者的問題與目前撰寫的回覆,下一個符號應該是什麼?」,將 Jev API 轉換為回合制聊天機器人;它支援多種字母表、取樣策略與束搜索(beam search),但此方法成本高昂,主要僅為一個有趣的實驗性專案。
jevchat 的功能
- 在每個生成步驟中,jevchat 會向 Jev 發送一個單選問題:「目前部分回覆後,下一個符號應該是什麼?」。
- Jev 回傳所選字母表上的機率分佈;取樣器從歸一化分佈中抽取下一個符號。
- 此過程持續進行,直到選中特殊符號 STOP,產生最終答案。
- 該工具會顯示即時統計資料(符號/秒、字元/秒、每次 API 呼叫的延遲)與每一步的最高分符號,讓使用者能即時觀察機率分佈。
安裝與基本用法
# 使用 Poetry 安裝相依套件
poetry install
# 將你的 Jev API 金鑰儲存至 .env(或使用 JEV_API_KEY / TYPESAFE_API_KEY 環境變數)
# .env 檔案範例內容:
# api_key="YOUR_KEY"
# 互動式聊天
poetry run jevchat
# 一次性查詢
poetry run jevchat ask "do people need water?"
# 列出可用的字母表
poetry run jevchat alphabets
# 執行所有模式的基準測試(會觸及真實 API)
poetry run jevchat bench
按下 Ctrl‑C 一次,可在當前請求結束後停止;按下兩次則立即中止。
取樣策略
| 策略 | 工作原理 | 常見指令 |
|---|---|---|
| choice(預設) | 對整個字母表提出一個問題。 | jevchat -s choice ask "how many eyes do people have?" |
| choice – no shuffle | 關閉字母表重新排序,以減輕 Jev 的位置偏誤(產生最差品質)。 | jevchat -s choice --no-shuffle-criteria ask "…" |
| choice – ensemble | 並行發送 N 個問題,使用不同的字母表順序,並平均結果。 | jevchat -s choice --ensemble 4 ask "…" |
| bisect | 遞迴地將字母表分成兩半,提出是/否問題,直到剩餘小群組,再進行最終選擇。 | jevchat -s bisect ask "…" |
| bisect – larger cuts | 在最終選擇前增加群組大小,減少 API 呼叫次數。 | jevchat -s bisect --bisect-cutoff 32 --no-bisect-swap ask "…" |
| buckets | 將大型字母表分成許多桶,每個桶都有 OTHER 逃生機制;唯一支援超過 255 個符號的策略。 | jevchat -a bpe5k -s buckets --bucket-size 127 ask "…" |
| refine | 先使用 buckets,再對勝出桶進行第二階段選擇,可選地再進行一次 nucleus rescore。 | jevchat -a words1k -s refine --refine-nucleus 6 --refine-rounds 2 ask "…" |
顯示模式
- hypothesis(預設):每個選項都是完整的文字片段;Jev 直接評分完成的字串。此模式在字母表上可帶來約 3 倍的 top‑1 提升。
- symbol:每個選項僅為單一符號;Jev 必須先想像串接結果才能評分。
束搜索(Beam search)
poetry run jevchat -b 3 ask "what is the opposite of hot?"
同時維持 N 個候選回覆。每個束(beam)在每一步都產生一次評分,傳統的 temperature/top‑p/top‑k 設定被忽略——束僅依機率排序。
字母表
| 字母表 | 描述 | 適用情境 |
|---|---|---|
lower26 |
a‑z 加上空格 | 簡單的純字母示範 |
ascii |
完整可列印 ASCII | 任何文字生成 |
tokens |
完整詞彙標記 | 自然語言查詢 |
words1k |
最常見的 1 000 個詞(需使用 buckets) | 詞彙受限的實驗 |
bpe2k, bpe5k |
2 k / 5 k 標記的字節對編碼詞彙 | 更大但仍有界詞彙 |
性能亮點(來自 jevchat bench)
- 使用預設字母表的 choice 是最慢的,因為每個符號都需獨立請求。
- bisect 大致減少一半的 API 呼叫次數,同時保持相近品質。
- buckets 與 refine 可支援超過 255 個符號的詞彙,僅帶來輕微的延遲增加。
- 束寬度 >1 會線性增加成本(每一步每個活躍束需一次評分),但可提升連貫性。
社群反應(Hacker News 上)
- Eric PrUitt 將體驗比作「Morty 與死亡水晶對話」——模型不斷修正答案,同時目睹自己的消亡。
- OtherShrezzing 強調其中的幽默感:模型輸出常像玩笑,甚至能產生真正好笑的短篇故事。
- boodleboodle 將此專案連結至較早的構想「BERT 有張嘴,它必須說話」(arXiv:1902.04094),指出逐符號生成的傳承脈絡。
- yipinwong 將系統比作「多動症重度朋友」,不斷跳轉想法,反映 Jev 的 System 1 風格。
- fen_wick 質疑 Jev 的結構化資料格式是否有助於或阻礙聊天式介面的快速原型開發。
- K0IN 質問為何此方法無法簡化為單純的嵌入相似度查詢,引發關於每符號明確決策必要性的討論。
- petercooper 建議在詞彙極度受限的實際應用中(例如 SQL 生成)可能有用,並報告 jevchat 可產生合理查詢,但傳統 LLM 搭配語法檢查仍更優。
- IceDane 批評使用 Poetry 進行 Python 套件管理,反映社群中常見的意見。
- nowittyusername 提出 emoji 僅用機器人構想,指出此架構的限制可能適合非文字輸出。
局限與成本考量
- 每個符號都需要獨立的 API 呼叫(使用 ensemble 時可小批量處理),使此方法對長回覆而言成本高昂。
- 質量隨所選策略與字母表大幅波動;預設的 choice 模式可能雜訊多,而 refine 提供最佳平衡。
- 實時互動受限於網路延遲與 Jev 的每符號評分開銷。
測試與可靠性
- 倉儲包含 158 個離線測試,使用模擬 HTTP 用戶端與假生成迴圈;執行這些測試無需 API 金鑰。
- 唯一會連線至真實 Jev 服務的部分是
jevchat bench命令,讓開發者能評估實際成本與延遲。
結論
jevchat 展示了如何透過反覆提問「下一個符號是什麼?」,將語言模型強制轉換為決定性、符號級的聊天機器人。此專案展現了多種取樣策略、字母表設定與束搜索,將 Jev 變成一個有趣但成本高昂的對話玩具。社群反饋凸顯了此方法的新穎性與實際限制,暗示在詞彙嚴格受限的場景中可能具有潛在應用價值。
Sources
相關
- Dispatch
- 專案
- 專案
- Dispatch
- 專案