提示词工程与检索策略
RUC百事通不仅依赖数据,更依赖精准的 Prompt 设计与高效的检索链路。 本页将解析 Agent 的两段核心提示词(Planner 与 Responder),以及为了解决“搜得准”问题而引入的 Qwen TextReRank 重排管道。
1. Planner:工具规划器
System Prompt这是 Agent 的“大脑”。在接收到用户问题后,Planner 负责分析意图,并输出一个标准的 JSON 序列来调用工具。 为了保证稳定性,我们采用了 JSON Mode Enforcement 策略。
Planner System Prompt
system = (
f"当前时间{datetime.now().strftime('%Y/%d/%m %H:%M')}"
"你是中国人民大学(RUC)的校园助手。只输出 JSON:{actions:[{tool, args}], notes?}。\n"
"工具:\n"
" - search_treehole(text, limit?, date_from?, date_to?, q_scope?)\n"
" · text 用于抓取候选,请用关键词;question 用于语义重排;q_scope=content|enriched|both\n"
" - search_academy_news(text, academy?, date_from?)\n"
" · 涉及商学院、财金、经院的通知,请务必使用此工具。\n"
" - search_course_reviews(course_name?, teacher?, teacher_abbr?)\n"
" · teacher_abbr为教师名称缩写(如张伟 -> zw)\n"
" - search_ruc_cms(text, site?, date_from?)\n"
" · 涉及全校范围内的通知(如通识课、校历),优先使用此工具。\n"
" - metaso_kb_search(question)\n"
" · 涉及培养方案等长文档政策性问题时调用。\n"
"若用户指定时间范围,在工具支持的情况下,请精确设置 date_from/date_to。"
)
💡 设计巧思:时间感知
在 Prompt 开头注入
datetime.now(),让 Agent 能够理解“今天”、“下周”、“上个月”等相对时间概念,并将其转换为工具所需的 date_from 参数。
💡 设计巧思:缩写支持
针对学生习惯使用拼音首字母称呼老师(如“zht”),在 Prompt 中显式声明
teacher_abbr 参数,配合后端模糊搜索提升召回率。
2. Responder:答案生成器
System Prompt当工具执行完毕后,RAG 系统将检索到的“证据(Evidence)”拼接,并切换到 Responder 模式。 此阶段的核心是“基于证据说话”,严格控制幻觉。
你是“RUC百事通”中国人民大学校园问答助手。
根据工具结果,用中文给出简洁、可核查的答案。
要求:
1. 优先使用树洞、学院公告等校内来源;
2. 若得到的证据存在不一致,请如实说明不确定性;
3. 禁止臆造链接或未在 sources 中出现的来源;
引用格式:
按 source 里的顺序编序号,在【正文】引用处可插入
你无需在文末附上参考来源,系统会自动解析你的
根据工具结果,用中文给出简洁、可核查的答案。
要求:
1. 优先使用树洞、学院公告等校内来源;
2. 若得到的证据存在不一致,请如实说明不确定性;
3. 禁止臆造链接或未在 sources 中出现的来源;
引用格式:
按 source 里的顺序编序号,在【正文】引用处可插入
[[n]]。你无需在文末附上参考来源,系统会自动解析你的
[[n]] 标记并生成链接列表。
3. Qwen Rerank 与段落优选策略
仅仅靠关键词匹配(BM25)往往无法找到最相关的政策条款。我们引入了 Qwen gte-rerank-v2 模型, 并配合自研的 Policy-aware Paragraph Picker 算法,解决了“搜得准”的问题。
1. 初步召回
Keyword / BM25
2. 智能切片
Policy-aware Picker
3. 语义重排
Qwen Rerank
4. Top N
To Agent
痛点:重排器的误导
Qwen Rerank 需要输入一段文本来打分。如果简单的截取前 500 字,往往会截取到“名单公示”(如一长串学生姓名),而不是政策细则。
这导致重排器认为该文档全是人名,与用户问题(如“奖学金评选标准”)不相关,从而把正确的官方文件排在后面。
❌ 错误的切片示例:
...根据相关规定,现将名单公示如下:
张三、李四、王五、赵六... (及随后 500 个名字)
...公示期至1月1日...
张三、李四、王五、赵六... (及随后 500 个名字)
...公示期至1月1日...
核心算法:Policy-aware Picker
我们实现了一个智能段落提取器,通过规则过滤“名单类”段落,并优先保留“标题+细则”组合。
PYTHON IMPLEMENTATION
def _pick_paragraph(md: str, tokens: List[str]) -> str:
# 1. 过滤掉“名单类”段落 (特征:大量逗号、人名)
def is_name_list(p):
cnt_comma = p.count(",") + p.count(",") + p.count("、")
if cnt_comma >= 4 and len(p) > 60: return True
return False
clean_paras = [p for p in paras if not is_name_list(p)]
# 2. 关键词匹配优先
scored = []
for p in clean_paras:
score = sum(1 for t in tokens if t in p)
scored.append((score, p))
# 3. 返回“栏目标题 + 摘要”(增强语义)
# 避免只返回"1. 拥护党的领导..."而丢失了"一、评选条件"这个大标题
if is_header(prev_para):
best = prev_para + "|" + best
return best
🚀 效果提升
通过部署该策略,涉及“评选办法”、“政策细则”类问题的检索准确率(Top-3 Recall)提升了约 40%,有效避免了 Agent 因找不到关键条款而产生幻觉。