检索结果过滤
让 Jev 先筛一遍,省 token 也防答偏
痛点
检索回来的段落常常一半都不相关,全塞给大模型既费 token,又容易让答案跑偏。在做 RAG 这类功能时,过滤这一步直接决定后续成本和质量。
Jev 判断什么
这次我用 Noul(是非题)题型,针对 query 和每个 passage 单独出一道题,让 Jev 判定这段内容对回答 query 是否有帮助。
p1_answers:问「Does passage passages.p1 help answer the query?」。返回「是」的概率(probability)为 0.97。p1 直接写了 Jev 的计费方式,是回答价格问题的关键段落,应当保留。
p2_answers:问「Does passage passages.p2 help answer the query?」。返回「是」的概率为 0.07。p2 只解释 Jev 是什么,跟价格无关,应当过滤掉。
p3_answers:问「Does passage passages.p3 help answer the query?」。返回「是」的概率为 0.09。p3 只给了一个模型名,跟价格无关,应当过滤掉。
代码侧拿到这三个结果,按阈值(比如 0.5)切一刀:高于阈值的保留,低于的丢弃。
和大模型怎么配合
流程是 Jev 先判断,代码再按结果分流。概率高的段落拼成上下文发给大模型,让它基于这些材料生成最终答案;概率低的直接丢掉,不进上下文。
还有两种情况可以完全跳过调用大模型:一是所有段落都被判否,直接返回「无法回答」之类的兜底;二是只剩一两条高置信段落、且用户问题很明确,可以把段落原文直接当作答案。
这批 3 段判断在 jev-1.14.0 上跑了 1113 毫秒,输入 444 个 token,花费 0.000019 美元,按这个折算每 1000 次约 0.0186 美元,比把全量段落塞给大模型便宜得多。
上线前注意
- 题目用英文写,state(上下文状态)里的 query 和 passages 保留中文原文,Jev 对中英混合 state 都能处理。
- 阈值要用自己 20–30 条真实数据校准,先看分布再定,不要拍脑袋用 0.5。
- 概率落在 0.5 附近、置信度低,或者 Noul 结果本身分歧大时,不要硬走规则,交给人或大模型复核。
- 题目里写明字段路径,比如
passages.p1,让 Jev 知道评的是哪一段,避免它自作主张去评整段。
真实调用
请求
curl https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-1.14.0",
"state": {
"query": "Jev 的价格是多少?",
"passages": {
"p1": "Jev 按输入 token 计费,每百万 token 0.042 美元,输出不收费。",
"p2": "Jev 是 TypeSafe 推出的判断模型,不生成文字。",
"p3": "OpenRouter 上的模型名是 typesafe/jev-1.14。"
}
},
"questions": {
"p1_answers": {
"type": "noul",
"instructions": "Does passage `passages.p1` help answer the query?"
},
"p2_answers": {
"type": "noul",
"instructions": "Does passage `passages.p2` help answer the query?"
},
"p3_answers": {
"type": "noul",
"instructions": "Does passage `passages.p3` help answer the query?"
}
}
}'import json, os, urllib.request
payload = json.loads("{\n \"model\": \"jev-1.14.0\",\n \"state\": {\n \"query\": \"Jev 的价格是多少?\",\n \"passages\": {\n \"p1\": \"Jev 按输入 token 计费,每百万 token 0.042 美元,输出不收费。\",\n \"p2\": \"Jev 是 TypeSafe 推出的判断模型,不生成文字。\",\n \"p3\": \"OpenRouter 上的模型名是 typesafe/jev-1.14。\"\n }\n },\n \"questions\": {\n \"p1_answers\": {\n \"type\": \"noul\",\n \"instructions\": \"Does passage `passages.p1` help answer the query?\"\n },\n \"p2_answers\": {\n \"type\": \"noul\",\n \"instructions\": \"Does passage `passages.p2` help answer the query?\"\n },\n \"p3_answers\": {\n \"type\": \"noul\",\n \"instructions\": \"Does passage `passages.p3` help answer the query?\"\n }\n }\n}")
headers = {
"Authorization": "Bearer " + os.environ["TYPESAFE_API_KEY"],
"Content-Type": "application/json",
}
req = urllib.request.Request(
"https://api.typesafe.ai/v1/systemone",
data=json.dumps(payload).encode("utf-8"),
headers=headers,
method="POST",
)
print(urllib.request.urlopen(req).read().decode("utf-8"))
返回
{
"model": "jev-1.14.0",
"answers": {
"p1_answers": {
"type": "noul",
"noul": 0.97
},
"p2_answers": {
"type": "noul",
"noul": 0.07
},
"p3_answers": {
"type": "noul",
"noul": 0.09
}
},
"usage": {
"input_tokens": 444,
"output_tokens": 58
}
}人话解读
- Noul:「是」的概率 0.97
- Noul:「是」的概率 0.07
- Noul:「是」的概率 0.09