Jev 教學:用 Jev API 做情緒分析的 7 個步驟(附題目原文與實測成本)
一句話: Jev 的用法是對 TypeSafe 的 API 送出一個 POST 請求,內容是「結構化資料加幾個題目」,回傳每題的選項、分數或機率。用在論壇情緒分析時,我們實測最有效的是 7 件事:問題拆窄、拆開引用、用 Score 而不是單選、用自己的樣本調門檻、把定義寫死、用信心分流、鎖定版本;另外批次處理時要限制併發。這篇把每一步和它的實測證據一起給你。
如果你還不確定 Jev 是什麼、準確度夠不夠用,請先看Jev 是什麼+粵語實測。本文是做法篇,實測的樣本、標準答案與限制都在那一篇。
Jev API 怎麼開始?申請與 API key
| 步驟 | 做法 |
|---|---|
| 1. 申請帳號 | 依 TypeSafe 官網與 docs.typesafe.ai 的說明註冊 |
| 2. 取得 API key | 依官網,key 只在你自己的環境裡使用 |
| 3. 存放 | 放進環境變數(本文用 TYPESAFE_API_KEY),不要寫進程式碼或版本控制 |
| 4. 呼叫 | Authorization: Bearer 標頭帶 key |
申請流程、免費額度等細節,我們沒有逐項驗證,一律依官網為準。
Jev API 的請求長什麼樣子?
端點是 POST https://api.typesafe.ai/v1/systemone。請求有三個部分:model(模型版本)、state(結構化資料)、questions(題目)。下面是最小可用的例子,用兩個題目示範結構(key 是假的佔位):
curl https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-1.13.0",
"state": {
"keyword": "港鐵",
"thread_title": "(討論串標題)",
"opening_post": "(主文,最多 600 字,只當上下文)",
"quoted_post": "(被回覆的上一則,只當上下文)",
"post": "(要判斷的那一則)"
},
"questions": {
"relevant": { "type": "noul", "instructions": "...", "criteria": { "true": "...", "false": "..." } },
"intent": { "type": "choice", "instructions": "...", "criteria": { "complaint": "...", "praise": "...", "question": "...", "other": "..." } }
}
}'
回應的重點欄位:
| 欄位 | 意思 |
|---|---|
answers.sentiment.score | 情緒分數(0 到 4,減 2 得 −2 到 +2),附 confidence |
answers.relevant.noul | 「是」的機率(0 到 1) |
answers.intent.choice | 選到的選項,附 confidence |
usage.input_tokens | 這次請求用了多少輸入 token |
model | 實際回答的模型版本 |
三種題型:Choice 是單選、Score 是分級打分、Noul 是是/否機率。同一份 state 上的多個題目是平行評估的。
用 Jev 做情緒分析的 7 個步驟
以下每一步的數字,來自我們在 405 則連登、Pantip、HardwareZone 貼文上的實測(測試日期 2026-10-12,模型 jev-1.13.0,標準答案由 AI 預先標註、母語者抽查 20/20,樣本與限制見實測篇)。
步驟 1:把問題拆成窄的、分開的題目
同一個請求裡問相關性、情緒、意圖三題,彼此獨立。我們三題合計平均每則 1,063 個輸入 token,輸出免費,所以多問幾題不會像生成式模型那樣多付輸出費用。
步驟 2:用結構化的 state,把引用拆開
論壇回覆常把上一則一起貼進來(例如 HardwareZone 的「X said: … Click to expand…」)。如果整串丟進去,Jev 會被引用的內容帶著走。
| HardwareZone 回覆 | 引用黏在文字裡 | 引用拆成 quoted_post |
|---|---|---|
| 情緒準確度 | 62.5% | 70.0%(+7.5 分) |
| 意圖準確度 | 70% | 75% |
| 相關性 | 97.5% | 92.5%(反而降了) |
把引用整個刪掉更糟,因為短回覆失去了意義。所以做法是:quoted_post 放上下文、post 放要判斷的文字,並在每個題目後面加這句(原文):
postis a forum message or a thread title.opening_post, when present, is the first message of the thread, andquoted_post, when present, is an earlier message thatpostreplies to. Use them only as context; judgepostonly.
加入討論串的開頭貼文當上下文,也修正了一則反諷的粵語回覆(v1 讀成正面,v2 讀對成負面)。相關性掉的 5 分是這個做法的代價,值得自己的資料上再確認一次。
步驟 3:情緒用 Score,不用四選一的 Choice
多數的分歧發生在語氣的輕重(「有點負面」還是「中立」)。Score 讓你自己決定中立帶有多寬。Jev 文件警告它可能偏向第一個 Choice 選項,所以我們把情緒選項順序反過來測:105 則裡有 98.1% 答案不變,順序偏誤在這個題目上很小。
步驟 4:用自己的標註樣本調門檻
這一步影響最大。用同樣的 300 則連登貼文與較早的 v2 題目:
| 換算方式 | 準確度 |
|---|---|
| 天真地用 ±0.5 切 | 64.0% |
| 調過門檻(留出資料) | 78.7% |
Jev 傾向把中立文字讀成「略為負面」,所以負面門檻要比正面嚴。做法:把資料分成兩半,用偶數列調門檻,只在奇數列報告準確度。我們最終的門檻(v3 題目):
| 項目 | 門檻 |
|---|---|
| 情緒(分數減 2) | ≤ −1.25 為負面、≥ +0.75 為正面,其餘中立 |
| 相關性 | 「是」機率 ≥ 0.55 |
這是我們資料的數字,你的資料請自己調。
步驟 5:把定義寫進題目,Jev 照字面讀
Jev 不會替你猜你的意思。例如早期意圖定義下,它把批評官員的貼文標成「抱怨」(產品抱怨)。補上「批評個人、政治人物或政府是 other,不算 complaint」之後:
| 補定義前 | 補定義後 | |
|---|---|---|
| 意圖準確度 | 82.7% | 85.3% |
| 標題的意圖準確度 | 87% | 91% |
定義也比模型更能左右排名:品牌只是事件現場時,嚴格定義下 Jev 的相關性是 88.0%(勝過 Haiku 的 80.7%);改成「現場也算相關」後換成 Haiku 領先。所以要把「什麼算相關、壞消息算不算負面、什麼算抱怨」先決定好,寫進題目。
步驟 6:把信心當第二個維度,用來分流
Jev 的信心有校準過,可以當作自動接受的門檻(連登 300 則、最終題目):
| 標註 | 條件 | 涵蓋 | 準確度 |
|---|---|---|---|
| 相關性 | 機率 ≤ 0.2 或 ≥ 0.8 | 82% | 96.7% |
| 情緒 | 信心 ≥ 0.7 | 60% | 92.2% |
| 情緒 | 信心 ≥ 0.5 | 82% | 86.1% |
沒把握的那部分,送人工複核或第二個模型。混合做法(Jev 有把握時用 Jev,否則 Haiku)在 150 則留出資料上的結果:
| 標註 | 混合準確度 | Jev 處理比例 |
|---|---|---|
| 情緒 | 82.7% | 51% |
| 相關性 | 95.3% | 83% |
| 意圖 | 91.3% | 77% |
步驟 7:鎖定模型版本
請求裡寫 "model": "jev-1.13.0",不要用 jev-latest。別名指向的模型一換,你調好的門檻就可能失準;回應裡的 model 欄位也會告訴你實際是哪個版本回答的。
題目原文(第三版):可以直接複製
下面是我們最終使用的 v3 題目,英文原文保留(Jev 以英文為主要語言,題目用英文寫較穩),中文說明在每段前後。
情緒(Score,五級): 說明是「這則貼文有多負面或正面?同時算它表達的感受與它報導的新聞:壞事的報導即使寫得中立也算負面,好消息算正面。」五個等級依序是:明確負面、略為負面、中立、略為正面、明確正面。
{
"type": "score",
"instructions": "How negative or positive is `post`? Count both the feeling it expresses and the news it reports: a report of a bad event is negative even when written neutrally, and good news is positive.",
"criteria": [
"Clearly negative: complains, criticises, mocks, is angry or disappointed, or reports serious bad news (deaths, injuries, crimes, scandals, big losses)",
"Slightly negative: mild criticism or doubt, or reports minor bad news (price rises, small problems, falling share prices)",
"Neutral: factual information with no good or bad side, a question, or no feeling",
"Slightly positive: mild approval, or reports minor good news (discounts, free rides, small gains)",
"Clearly positive: praises, recommends or is excited, or reports clearly good news"
]
}
相關性(Noul): 問這則貼文是否與追蹤的關鍵字有關,包含事件發生在該品牌或其現場的情況。
{
"type": "noul",
"instructions": "Does `post` concern `keyword`: an opinion, information, news or a question about it or its products, prices, stores, stations, vehicles or staff, including incidents that happen in or involve them?",
"criteria": {
"true": "The post concerns `keyword`, even if `keyword` is only the place, vehicle or company where an incident happened.",
"false": "`keyword` is not involved: the post is about another brand, a different topic, or other people in the conversation (for example a reply mocking a politician that says nothing about `keyword`)."
}
}
意圖(Choice): 抱怨、讚美、提問、其他;批評個人或政府歸入 other。
{
"type": "choice",
"criteria": {
"complaint": "Criticises or expresses dissatisfaction with a product, brand or company's service. Criticism of individual people, politicians or the government is `other`, not complaint.",
"praise": "Praises or recommends a product or brand, or expresses satisfaction with it.",
"question": "Mainly asks a question.",
"other": "Anything else: news, information, prices, advice, jokes, remarks or criticism about people or the government, or a neutral view."
}
}
把上面的 Context 句子加到每個題目的 instructions 後面。收到回應後,換算成標籤的程式碼大致是:
const sentiment = answers.sentiment.score - 2; // -2..+2
const label = sentiment <= -1.25 ? 'negative' : sentiment >= 0.75 ? 'positive' : 'neutral';
const relevant = answers.relevant.noul >= 0.55;
Jev 要花多少錢?跟 Claude Haiku 比
Jev(jev-1.13.0) | Claude Haiku 5.5 | |
|---|---|---|
| 每則 token | 1,063 輸入(三題,輸出免費) | 307 輸入加 151 輸出(15 則一批) |
| 每則成本 | 0.000045 美元 | 0.000106 美元 |
| 每十萬則成本 | 約 4.50 美元 | 約 10.60 美元 |
| 速度 | 每則中位數 0.36 秒(p90 0.41 秒) | 每批 15 則中位數約 15 秒 |
價格依牌價:Jev 輸入每百萬 0.042 美元、輸出免費;Haiku 輸入每百萬 0.10 美元、輸出每百萬 0.50 美元(Anthropic 牌價,提示詞 100K 以內)。
Jev 有流量限制嗎?怎麼限制併發
依文件,每個帳號每秒 80 個請求、10 萬 token。Jev 是一則一個請求,所以大量處理時要自己控制併發,否則會碰到上限。以我們的三題設定,每則約 1,063 token,每秒 80 個請求約 8.5 萬 token,兩個上限大致同時接近。建議:
- 用併發池(例如固定同時 10 個請求)而不是一次全送出。
- 遇到被限流的回應時指數退避重試,並設重試上限。
- 把請求做成可重跑:記下已標註的貼文 ID,失敗只補跑缺的。
常見的坑
| 坑 | 症狀 | 對策 |
|---|---|---|
| 照字面讀定義 | 批評官員被標成「產品抱怨」 | 把邊界案例寫進題目(步驟 5) |
| 反諷 | 「加價900不跌反升」其實是稱讚保值,卻被讀成抱怨漲價 | 補開頭貼文當上下文;信心低的送複核。兩個模型都會漏一部分 |
| 中文準確度不如英文 | 官方說英文是主要語言,CJK「可處理但表現不均」 | 用自己的中文樣本調門檻與驗證,不要直接套用本文數字 |
| 引用黏在文字裡 | 被引用的人的情緒污染這一則 | 拆成 quoted_post(步驟 2) |
| 中立被讀成略為負面 | 負面比例偏高 | 負面門檻比正面嚴(步驟 4) |
| 用別名 | 答案悄悄改變 | 鎖 jev-1.13.0(步驟 7) |
想直接標連登資料?
自己串 API 要抓資料、寫題目、調門檻。如果你的資料來源就是連登,我們的 LIHKG actor 新增了選用的「AI 輿情標籤」,引擎是 Jev,相關性、情緒、意圖三項每標一筆 0.002 美元;免費方案每次 run 前 20 筆免費,定價自 2026-10-27 起生效。抓取本身見香港論壇專題。本站與 TypeSafe、Anthropic 沒有合作或背書關係。
想比較自己做與購買輿情工具,可看DIY 輿情 vs OpView/KEYPO;想讓 AI 代理人直接問資料,看巴哈姆特 × Claude Code × Apify。
從最省事到最自由
FAQ
Jev ai 怎麼用? 向 https://api.typesafe.ai/v1/systemone 送出 POST 請求,帶上模型名稱、結構化的 state,以及一到數個題目(Choice、Score 或 Noul),回應就是每個題目的答案與信心。完整範例見本文。
Jev 怎麼申請 API key? 依 TypeSafe 官網與文件(docs.typesafe.ai)的說明註冊並取得 API key。本文不代替官方流程,也不會在文章中放任何真實 key。
Jev 價格多少? 依 TypeSafe 文件,輸入 token 每百萬 0.042 美元,輸出 token 免費。我們的三題標註每則約 1,063 個輸入 token,約 0.000045 美元,十萬則約 4.50 美元。
Jev 有流量限制嗎? 有。依文件每個帳號每秒 80 個請求、10 萬 token,所以批次處理時要限制併發。
Jev 情緒分析的準確度如何? 在連登 150 則留出資料上,調整過題目與門檻後,情緒 78.0%、相關性 92.0%、意圖 85.3%;Claude Haiku 5.5 為 82.7%、95.3%、90.0%。完整比較見另一篇實測。
為什麼要鎖定 jev-1.13.0? jev-latest 這類別名指向的版本會變,答案可能悄悄改變。鎖定 jev-1.13.0,才能讓你調好的門檻持續有效。
作者 Chad 實際經營 30 多隻上架 Apify actor(含本文用到的 LIHKG-scraper)。本文數字來自 2026-10-12 的實測:標準答案由 AI 預先標註並經母語者抽查,樣本小、版本為 jev-1.13.0 與 claude-haiku-5-5,新版本可能不同。