🔥維護記錄

你是看到我之前puq了吗?!!

2 Likes

布豪,,可能有坏事发生

2 Likes

Discourse reactions desaturated reaction panel

Reduces visual noise of reactions by displaying them desaturated until hover.

我手殘把這個剛才勾選了,恢復了。

2 Likes

什么()

1 Like

@suen 我要论坛私信和群聊功能回来,我企微没时间了,我要聊天 :sob:

6 Likes

好似喵

1 Like

我也想要私信,,,,

1 Like

好像可以拉群

1 Like

明明看着像卫星

1 Like

高三不配:)

10 Likes

高2.5

2 Likes

接入 Suen_AI 為 gemini-3-pro-preview,但做了使用限制,暫時集中於審閱作文。

2 Likes

现象

  • 论坛 AI 不回覆。

根因 A:Sidekiq 在 runit 下秒退

  • sv status sidekiq 显示 down: 1s, normally up, want up
  • 但手工 bundle exec sidekiq -C config/sidekiq.yml 正常=> 说明 Sidekiq 本体没坏,是 runit 启动脚本脆弱导致“秒起秒死”。

脆弱点

  • 旧 /etc/service/sidekiq/run 使用 chpst -u discourse:www-data(主组 www-data)
  • 强制 -L log/sidekiq.log 写 shared log=> 遇到 shared/tmp/log 权限漂移就 boot 前退出。

修复

  • 备份旧 run
  • 全量覆盖为稳定前台常驻版:
    • 主组改为 discourse:discourse
    • 启动改为 bundle exec sidekiq -C config/sidekiq.yml
    • 确保 tmp/pids 可写
  • 重启后 sv status sidekiq = run,后台任务恢复。

根因 B:logrotate 每天失败(exit 1),触发 shared 日志树重建

  • 日志显示 logrotate 每天 ALERT exited abnormally with [1]
  • logrotate -d 明确提示:/var/log 父目录权限“不安全”(root:adm 且 0775)
  • 11/21 07:50 logrotate 失败轮转作用到 /shared/log/rails/*=> 与旧 sidekiq run 脆弱点叠加,间接触发秒退。

已修复

  • 在 /etc/logrotate.conf 顶部加入全局:su root adm
  • 手工 logrotate -v 退出码回到 0,daily 报错停止。

1 Like

能不能给论坛ai加个prompt,回复时用最多两句话简练回答,然后剩下的部分用“隐藏详细信息”包起来

像这样

这是ai产出史的地方

7 Likes

@Grok 來,展示

1 Like

grok的ai私信也有免费额度吗

1 Like

沒,但論壇固定的AI系統指令是寫死的加入不了內容。這個是可以自定義的。

1 Like

作文ai字数统计问题是因为啥:anguished_face:

2 Likes

核心原因可以一句話說完:

大多數 AI 腦子裡根本沒有「字數」這個概念,只有「token」這個概念,而 token 和「一個漢字」完全對不上。

下面慢慢拆給你看。


一、為什麼 AI 數漢字會老是錯?

1. 模型看的是「token」,不是字或字節

  • 主流大模型(GPT、Gemini、Claude、DeepSeek…)在輸入時,文本會先經過一個 分詞器(tokenizer)
  • 這個分詞器不是「一個漢字=一個 token」,而是:
    • 有時一個漢字是一個 token;
    • 有時一串字是一個 token(常見詞、常用短語);
    • 有時一個漢字會被拆成好幾個 token(尤其是生僻字、擴展區字符)。
  • 模型在內部是按 token 在「走字數」,它根本不知道你說的是「字數」還是「token 數」。

結果就是:

你問它「數一下下面這段有多少個漢字」,它其實是在腦中用「token感」去估,然後再嘗試轉換成「字數」,這個轉換天然就容易錯。


2. Unicode & CJK 擴展區的坑

中文尤其麻煩:

  1. 基本漢字區(CJK Unified Ideographs) :U+4E00 ~ U+9FFF
  2. 擴展 A/B/C/D/E/F/G…… :用在古文、少見姓氏、方言字等等。

很多 tokenizer 或語言庫對擴展區支持一開始都不完美,比如:

  • 把一個擴展漢字拆成多個 code unit(UTF-16 surrogate pair);
  • 某些庫按「字節數」或「UTF-16 長度」算,而不是按「code point」算;
  • 顯示上一個字,實際後面藏着組合字符、變體選擇符(VS17 之類)。

於是你肉眼看到「好像是 10 個字」,實際上字符串裡可能是:

  • 10 個 code points;
  • 但 12 個 UTF-16 單元;
  • tokenizer 卻給你 8 個 token 或 15 個 token。

模型如果沒有專門的工具幫忙,自己去「數」一定會翻車。


3. 模型沒有「嚴格計數」這種能力

LLM 本質上是 預測下一個 token 的機率機器,而不是嚴格的計數機器。

  • 它對「大概長度」很敏感(比如 100 字左右、幾段、十來行這種);
  • 對「精準 100 個漢字、不多不少」這種硬槓頭,非常不擅長;
  • 一旦你要求「精準+中文+有格式要求」,難度又翻倍。

更糟的是,模型有時候會「自信地胡說」——

它自己沒真的數,只是生成了一個看起來合理的數字,這也是為什麼你常覺得它「明明信誓旦旦但就是錯」。


4. 不同環境下「字數」定義也不一致

人類口中的「字數」也不是一個嚴格一致的概念:

  • 有人算標點,有人不算;
  • 有人把空格算進去(中英混排時尤其亂);
  • 有人說「100 字」,實際指的是「大致 100 個漢字左右」而非精準。

模糊的需求 + 模糊的模型 + 模糊的編碼 = 非常穩定地不準 :grinning_face_with_smiling_eyes:


二、現在是怎麼解決這個問題的?

其實「解法」不是讓模型突然學會數學,而是:別讓模型自己算。

1. 最可靠的方法:用外部程式嚴格計數

現在比較正規的方案基本是:

  1. 讓模型先寫完一段文字;
  2. 再由一個外部程式(你自己的 Python / JS / Go 之類)來做:
  • 用正確的 Unicode 函式把文本 normalize;
  • 按「你定義的字數規則」重新計算長度;
  • 不夠就補,多了就截。

例如 Python:

def count_chinese_chars(text: str) -> int:
    count = 0
    for ch in text:
        code = ord(ch)
        # 基本區 + 擴展區(可以按需加)
        if (
            0x4E00 <= code <= 0x9FFF or        # CJK Unified
            0x3400 <= code <= 0x4DBF or        # CJK Ext A
            0x20000 <= code <= 0x2A6DF or      # CJK Ext B
            0x2A700 <= code <= 0x2B73F or      # CJK Ext C
            0x2B740 <= code <= 0x2B81F or      # CJK Ext D
            0x2B820 <= code <= 0x2CEAF or      # CJK Ext E
            0x2CEB0 <= code <= 0x2EBEF         # CJK Ext F(夠用就行)
        ):
            count += 1
    return count

然後流程變成:

  • 「請寫一段約 120 字的中文」→ 模型寫完;
  • 外部程式一數:只有 97 個 → 再提示模型補一段;
  • 或者由程式直接截成精準 100 字。

關鍵點:

嚴格的數字,交給程式;

模型只負責「語言 / 內容」。


2. 有些產品直接在前端/後端做「字數守門員」

你可能會遇到這種情況:

  • 你在一個網站上輸入「字數上限 200」,AI 回覆怎麼看都超了;
  • 但系統其實是:AI 生成長文 → 後端按字數截斷再顯示 → 看上去剛好。

也有的是:

  • 要求 AI 生成「精準 N 字」作文;
  • 寫完後,系統用自家服務(不依賴模型)重新算;
  • 算完後,如果不符合標準,就再發一輪「請壓縮到 XXX 字」的指令給模型。

也就是說,字數合規是靠「管道」和「後處理」來保證,不是靠模型誠實。


3. 新一代模型 & tokenizer 有在改進,但不是本質解藥

有些更新方向:

  • 針對中文做更合理的 tokenizer(減少把單字拆裂);
  • 增加「字形級」的 embedding 或輔助特徵;
  • 對 CJK Ext-B 之類的冷門字做更好的支持。

這些會 減少 一些亂數錯誤(尤其是生僻字那種怪情況),但:

只要內部仍是「token 世界」,模型就還是不會變成精準字數計數器。


4. tool calling / function calling:讓模型「叫工具來數」

現在很多 LLM 支持 function calling / tool calling,大概就是:

  1. 你設計一個工具:
  • count_chars(text) → { “hanzi_count”: 123 }
  1. 模型在思考時發現「需要精確統計」,就調用你的工具;
  2. 工具返回結果,模型再根據這個結果回答你。

這種模式下:

  • 「怎麼算字數」完全由你掌控;
  • 模型只扮演一個「會主動說:我去查一下」的助手。

這是目前比較「高級實戰」的解決方案。


三、對你來說,實際可以怎麼做?

看你是以 「老師+開發者」 的雙重身份,我給兩條實用建議:

1. 教學場景:不要要求 AI 做「精確字數裁判」

  • 把 AI 當作文思路/潤色助手,用於「大致字數」沒問題;
  • 真正要評分:
    • 字數用你自己的腳本 / 教務系統算;
    • 結構、內容、語言用 AI 幫你做質性評估。

2. 開發場景(比如你在做作文批改/AI 寫作工具)

  • 所有「必須精確」的計數(字數、句子數、段落數),都在 模型之外 完成;
  • 需要非常嚴格的長度時:
    1. 模型先寫「略長一點」;
    2. 你用程式「按漢字長度裁剪」;
    3. 如有必要,再讓模型「重讀裁剪後版本」做潤色。

四、一句總結

AI 數漢字數不準的深層原因:

大腦是 token 世界,眼睛卻要它數「字」;中間隔了 Unicode、CJK 擴展區和人類模糊需求這幾道坎。

真正的解決方案不是「把 AI 訓到會準確數字」,而是:

  • 把計數從模型裡「剝離」出來交給程式和工具;
  • 模型負責「語言和內容」,工具負責「規則和精確度」。

如果你願意,我可以幫你寫一個「專門數漢字 + 檢查是否達標」的小 Python 或 shell 工具,直接融到你現有的工作流裡。

3 Likes

这么看大模型用tokens统计费用啥的…我好像明白了:thinking:

2 Likes