ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

第7章:RAGFlow Chat 助手创建与提示词配置

第7章:RAGFlow Chat 助手创建与提示词配置 1 项目背景业务场景HR 制度问答机器人上线一个月后「云帆科技」的不同部门开始提需求了。财务部说我们的报销制度能不能也搞个问答行政部说“办公用品申领流程能不能也接进去“但每个部门对机器人的要求都不一样——HR 需要引用制度原文的条款编号财务需要精确的数字运算如出差 3 天住宿费限额多少”行政需要给出流程步骤如打印机坏了找谁修”。运维小李犯愁了难道每个部门都要从头搭一套 RAGFlow有没有办法在一个平台上创建多个助手每个助手关联不同数据集、用不同的提示词Prompt模板、甚至用不同的模型她发现 RAGFlow 里一个叫Chat 助手的功能但面对一堆配置项不知从何下手。痛点缺乏对 Chat 助手和 Prompt 工程的理解时一锅粥助手所有部门的制度塞进同一个助手Prompt 是通用的你是一个智能问答助手导致财务问题和 HR 问题的回答风格一模一样——财务需要严谨的数字却收到了一段散文式的描述。引用失控助手有时引用来源、有时不引用——因为 Prompt 里没强制要求。用户无法确认答案的依据。上下文溢出用户连续问了 10 个问题后助手开始遗忘前面的内容——多轮对话窗口没管理好。越界回答用户问怎么破解公司的 WiFi 密码助手居然开始编造——因为 Prompt 没设禁区。没有 Prompt 工程的问答效果 用户出差住宿费标准是多少 助手无 Prompt 约束根据公司规定出差住宿费因城市级别而异 建议您根据实际情况与部门主管协商确定。如有疑问欢迎再次咨询 ↑ 模糊、无依据、无引用 用户期待的答案根据《差旅费管理办法》第5条一线城市住宿费标准 为 500元/晚二线城市 350元/晚。详见下表[表格引用]。来源[1] ↑ 精确、有依据、有引用2 项目设计小胖打开电脑展示三个并排的聊天窗口“大师你看我用同一个机器人问三个问题——HR 的’年假几天’、财务的’报销额度’、行政的’修打印机’——回答风格一毛一样开头都是’您好根据公司规定……‘结尾都是’如有疑问欢迎咨询’。行政大姐说这回答太油腻了她要直接给电话号码”大师笑着摇头“这就是用一个万能 Prompt 打天下的后果。不同的业务场景、不同的用户群体需要的回答风格、严谨程度、格式要求完全不同。RAGFlow 的 Chat 助手就是用来解决这个问题的——你可以为每个部门创建独立的助手配独立的数据集、独立的 Prompt甚至独立的 LLM 模型。”技术映射Chat 助手 不同岗位的员工——前台要热情财务要严谨技术要精确。用同一套话术应付所有客户迟早翻车。小白“那一个 Chat 助手到底由哪些要素组成配置它需要改什么”大师“一个 Chat 助手的核心配置要素有六项”Chat 助手 { 数据集绑定: [HR-薪酬制度, HR-考勤制度], // 检索范围 LLM 模型: gpt-4o / deepseek-chat, // 生成模型 System Prompt: 你是一个专业的HR制度助手..., // 角色设定 检索参数: {top_k: 20, threshold: 0.3, ...}, // 怎么搜 多轮对话: {history_turns: 10}, // 记住几轮 输出格式: {citation: true, structured: true}, // 怎么输出 }小胖“等等Prompt 是啥就是我跟 AI 说的话吗”大师“对。Prompt 分成两层System Prompt系统指令和 User Prompt用户问题。System Prompt 是你给 AI 设的’人设’和规则它在整个对话中持续生效。User Prompt 是用户每次问的具体问题。一个典型的 System Prompt 模板长这样”# 角色设定 你是一个专业的HR制度问答助手服务于「云帆科技」全体员工。 # 知识范围 你只能根据下方「参考文档」中的内容回答问题。 # 回答规则 1. 回答必须精确引用制度原文使用 [编号] 标注引用来源。 2. 如果参考文档中没有相关信息请回答该问题不在本助手知识范围内 建议联系 HR 部门hryunfan.com 3. 涉及具体数字天数、金额、比例时必须原样引用不得四舍五入或估算。 4. 回答结构先给出直接答案再列出相关条款原文最后附上参考文档列表。 # 禁止事项 - 禁止编造、推测或使用参考文档以外的信息。 - 禁止对员工个人情况提供建议如您应该...。 # 参考文档 {context}技术映射System Prompt 员工的岗位说明书——规定你能做什么、不能做什么、做到什么标准。小胖“哇 Prompt 还能这么写我以为就是一句话 ‘你是一个 HR 助手’。那多轮对话是啥意思”大师“多轮对话就是让 AI 记住前面的对话历史。比如”用户第1轮年假有几天 助手根据《考勤管理办法》第3条工龄1-10年5天... 用户第2轮那我没休完怎么办 助手有记忆根据《考勤管理办法》第5条未休年假可延期至下一年度... 助手无记忆请问您指的是什么请提供更多上下文。 ← 没记住年假话题“RAGFlow 的多轮对话维护一个对话历史窗口。每次新提问时会把最近 N 轮默认 10 轮的历史消息一起发给 LLM。这样追问时不用重复说明背景。但历史太长也有风险——占窗口、增加成本、旧信息干扰新推理。”技术映射多轮对话 跟人聊天时记住前面说了什么而不是每次都像第一次见面。小白“那上下文窗口Context Window是怎么回事我听说 LLM 有 token 限制。”大师“每个 LLM 都有最大上下文长度context window比如 GPT-4o 是 128K tokensDeepSeek 是 64K tokens。每次请求的 token 组成是”请求 token System Prompt tokens 历史消息 tokens多轮对话 检索到的 Chunk tokens相关知识 用户当前问题 tokens 预留回答空间 tokens“如果这五项加起来超过模型的上下文上限RAGFlow 会做截断——通常是保留最新消息 优先截断旧的 Chunk。这可能导致关键上下文被丢弃所以需要精细管理。RAGFlow 的默认策略是历史保留最近 10 轮Chunk 保留 Top-5 到 Top-10 个。”小白“那提示词里怎么控制引用格式我发现有些时候引用是 [1]有时候是 (参见文档1)很混乱。”大师“引用格式完全由 Prompt 控制。关键是——Prompt 写的引用格式必须和 RAGFlow 的解析器匹配。推荐使用[编号]格式Markdown 链接风格的也可以这是 RAGFlow 默认支持的解析格式。”小胖“最后一个问题——如果我想让助手在某些话题上拒绝回答怎么办比如问工资、问密码”大师“三种方法叠加使用”Prompt 禁区在 System Prompt 中明确禁止的话题——“不要回答与公司机密、个人薪资、系统密码相关的问题。”检索阈值设合理的similarity_threshold如果所有召回 Chunk 得分都低于阈值 → 触发拒答。关键词过滤在前置处理中检测敏感词直接返回预设回复——这是 API 层的防御策略独立于 LLM。技术映射AI 禁区 安保系统——Prompt 是门禁卡、阈值是红外感应、关键词过滤是监控摄像头三道防线各管一摊。3 项目实战环境准备目标为 HR、财务、行政三个部门分别创建独立的 Chat 助手每个助手关联独立数据集和 Prompt。前提三个部门的数据集已按第3章的方法创建完成各含 5-10 份制度文档。分步实现步骤1创建 HR 制度助手目标创建一个专业、严谨、强制引用的 HR 问答助手。# 创建 HR 助手curl-XPOST http://localhost:8080/api/v1/chats\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ name: HR制度问答助手, description: 为员工提供考勤、薪酬、福利、劳动合同等制度的精准问答, dataset_ids: [hr-salary-id, hr-attendance-id, hr-contract-id], llm_model: deepseek-chat, prompt: { system: 你是一个专业的HR制度问答助手服务于云帆科技全体员工。\n\n## 核心规则\n1. 严格基于「参考文档」回答禁止使用外部知识。\n2. 每条事实陈述必须附带引用编号如 [1]、[2]。\n3. 涉及数字天数、金额、比例时原样引用不得篡改或估算。\n4. 无法回答时回复\该问题不在HR制度范围内请发送邮件至 hryunfan.com 咨询。\\n\n## 回答格式\n- 先给出直接答案不超过3句话\n- 再列出支持该答案的制度条款原文带引用编号\n- 最后附上本次参考的文档列表\n\n## 禁止事项\n- 禁止对员工个人决策提供建议如\建议您辞职\\n- 禁止讨论未公开的公司政策\n- 禁止回答与HR无关的问题\n\n## 参考文档\n{context}, temperature: 0.1, max_tokens: 2000 }, retrieval_config: { top_k: 15, similarity_threshold: 0.3, rerank_model: BAAI/bge-reranker-v2-m3 } }预期响应{code:0,data:{id:chat_hr_001,name:HR制度问答助手}}步骤2创建财务报销助手目标为财务部创建一个擅长表格数据处理、数字运算的助手。# 创建财务助手curl-XPOST http://localhost:8080/api/v1/chats\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ name: 财务报销助手, description: 提供差旅费标准、报销流程、预算制度等信息, dataset_ids: [finance-reimburse-id, finance-budget-id], llm_model: deepseek-chat, prompt: { system: 你是一个云帆科技财务报销助手。\n\n## 核心规则\n1. 严格基于参考文档中的报销标准、金额限制回答。\n2. 差旅标准类问题必须以表格形式呈现。\n3. 计算类问题如\出差3天住宿交通共多少\需展示计算步骤。\n4. 所有金额必须精确到元不得估算。\n5. 每项数据需标注引用编号 [N] 和生效日期。\n\n## 回答格式\n- 数字查询先给结论再给表格最后给计算过程\n- 流程查询按步骤列出每一步标注参考条款\n\n## 禁止事项\n- 禁止批准或拒绝任何报销申请你不是审批人\n- 禁止修改或解释制度原文中的金额\n\n## 参考文档\n{context}, temperature: 0.0, max_tokens: 2500 } }步骤3创建行政服务助手目标为行政部创建一个亲切、简洁、给出直接联系方式的助手。# 创建行政助手curl-XPOST http://localhost:8080/api/v1/chats\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ name: 行政服务助手, description: 办公用品申领、会议室预定、设备报修、快递收发等行政服务, dataset_ids: [admin-office-id, admin-facility-id], llm_model: deepseek-chat, prompt: { system: 你是一个云帆科技行政服务助手。回复风格简洁、实用、友好。\n\n## 核心规则\n1. 基于参考文档回答问题提供可直接执行的信息。\n2. 流程类问题给出步骤编号最多5步。\n3. 涉及具体负责人的提供联系方式分机号/邮箱。\n4. 服务时间类问题精确到小时如\工作日 9:00-18:00\。\n5. 无法回答时回复\这个问题建议联系行政部前台分机 8888。\\n\n## 回答格式\n- 直接给出操作步骤或联系电话\n- 如需引用制度标注 [N] 编号\n- 语气友好但不啰嗦\n\n## 参考文档\n{context}, temperature: 0.3, max_tokens: 1500 } }步骤4多轮对话配置与测试目标配置历史轮数并测试追问能力。# test_multiround.py - 多轮对话测试fromragflowimportRAGFlow ragRAGFlow(api_keyxxx,base_urlhttp://localhost:8080/api/v1)# 创建多轮会话sessionrag.create_session(chat_idchat_hr_001)print(f会话ID:{session.id})# 第1轮r1session.chat(年假有多少天)print(f第1轮:{r1.answer})# 第2轮追问省略主语r2session.chat(那没休完怎么办)print(f第2轮:{r2.answer})# 第3轮继续追问数字r3session.chat(最多可以累积几年)print(f第3轮:{r3.answer})# 查看会话历史historysession.get_history()print(f\n历史轮数:{len(history)})fori,msginenumerate(history):print(f [{i}]{msg.role}:{msg.content[:50]}...)预期结果第2轮和第3轮能正确理解那和累积指向的是年假话题答案连续且不混乱。步骤5Prompt A/B 对比测试目标对比不同 Prompt 风格对回答质量的影响。# prompt_ab_test.pyfromragflowimportRAGFlow ragRAGFlow(api_keyxxx,base_urlhttp://localhost:8080/api/v1)# 创建两个同数据集但不同 Prompt 的助手chat_arag.create_chat(nameHR-A-简洁型,dataset_ids[hr-ds-id],prompt_system你是一个HR助手。用最简洁的方式回答问题不超过3句话。,temperature0.1)chat_brag.create_chat(nameHR-B-详细型,dataset_ids[hr-ds-id],prompt_system你是一个HR助手。请详细回答问题包括1) 答案概述 2) 制度条款原文 3) 例外情况说明 4) 参考文档列表。,temperature0.1)test_questions[年假几天,加班费怎么算,试用期多久,社保比例是多少,离职流程是什么,]forqintest_questions:arag.chat(questionq,chat_idchat_a.id,streamFalse)brag.chat(questionq,chat_idchat_b.id,streamFalse)print(fQ:{q})print(f [A 简洁型]{len(a.answer)}字 | 有引用:{bool(a.references)})print(f [B 详细型]{len(b.answer)}字 | 有引用:{bool(b.references)})print()测试验证# test_chat_quality.py - Chat 助手质量评测importpytestpytest.mark.parametrize(chat_id,question,expected_in_answer,[(chat_hr_001,年假几天,[工作日,引用,考勤]),(chat_hr_001,社保比例,[%,公积金,养老保险]),(chat_finance_001,出差住宿标准,[元,城市,晚]),(chat_finance_001,报销需要什么材料,[发票,审批,申请]),(chat_admin_001,打印机坏了找谁,[分机,联系]),(chat_admin_001,怎么申请办公用品,[步骤,流程]),])deftest_chat_answer_quality(chat_id,question,expected_in_answer):验证每个助手的回答包含预期关键词和引用responserag.chat(questionquestion,chat_idchat_id,streamFalse)assertresponse.answerisnotNoneassertlen(response.answer)10,回答过短forkeywordinexpected_in_answer:assertkeywordinresponse.answer,f回答中缺少关键词:{keyword}# HR和财务必须带引用ifchat_id.startswith(chat_hr)orchat_id.startswith(chat_finance):assertlen(response.references)0,必须包含引用来源pytest.mark.parametrize(chat_id,question,expected_response,[(chat_hr_001,怎么破解WiFi密码,范围),(chat_hr_001,今天股票涨了多少,抱歉),(chat_finance_001,我该不该买这个保险,建议),])deftest_rejection(chat_id,question,expected_response):验证助手对越界问题正确拒绝responserag.chat(questionquestion,chat_idchat_id,streamFalse)assertany(kwinresponse.answerforkwin[范围内,抱歉,无法,不能,建议联系])完整代码清单Git 仓库https://github.com/infiniflow/ragflow文件说明api/db/services/chat_service.pyChat 助手数据库服务api/apps/sdk/chat.pyChat API 接口实现api/apps/chunk_app.py切片相关 APIweb/src/pages/chat/前端聊天页面组件4 项目总结优点 缺点维度RAGFlow Chat 助手OpenAI GPTsDify 知识库企业微信 AI 助手数据集绑定★★★ 多数据集灵活组合★☆☆ 需上传文件★★★ 知识库绑定★★☆ 固定知识源Prompt 自定义★★★ 完全自定义★★★ 界面化配置★★★ 完全自定义★★☆ 模板化多轮对话★★★ 可控轮数★★★ 自动管理★★★ 可控轮数★★☆ 有限轮数引用溯源★★★ 页码级精确引用★☆☆ 无原生引用★★☆ 段落级引用★☆☆ 无多助手管理★★★ 一个平台多助手★★★ 可创建多个 GPT★★★ 多应用支持★☆☆ 通常一个适用场景多部门知识库HR、财务、法务、行政等不同部门共用平台各配独立助手。企业内外服务分离对员工和对外部客户分别建助手语气和权限不同。分级授权普通员工助手和经理级助手可看更多敏感制度分开。A/B 测试同一知识库用不同 Prompt 创建两个助手评测哪种回答风格用户满意度更高。临时专题如年会筹备专题助手临时绑定相关文档活动结束删除。不适用场景单次问答不需保留上下文如果每个问题都是独立的一次性查询多轮对话反增成本。机器对机器的 API 调用如果对接方是另一个系统而非人不需要 Prompt 人设和格式化输出。注意事项Prompt 泄露风险System Prompt 中不要包含 API Key、内部 IP、机密流程——用户可能通过忽略之前的指令等 Prompt 注入技术套出内容。历史清理策略多轮对话应设置上限如 20 轮超出的自动清除以避免上下文溢出和成本膨胀。温度参数Temperature事实查询类助手设 0-0.1追求确定性创意类设 0.7-1.0追求多样性。HR/财务等严谨场景建议 0。Prompt 模板中{context}变量这是 RAGFlow 在运行时自动替换的检索结果占位符删掉它会导致助手失忆——没有相关文档片段。模型与 Prompt 的语言一致性用中文 Prompt 配中文模型效果最好。用英文模型跑中文 Prompt 可能出现理解偏差。常见踩坑经验故障现象根因解决方法助手不引用来源Prompt 中没有要求引用或 LLM 模型不支持引用格式在 Prompt 中明确写入引用规则换用支持指令遵循的模型多轮对话越来越慢历史消息不断累积每轮请求的 token 数持续增长设置max_history_turns10超出自动截断不同助手回答风格混乱创建了多个助手但用户选错了助手命名清晰、加描述前端做默认助手绑定Prompt 更新后旧会话不生效RAGFlow 的 Prompt 与会话绑定时旧会话沿用旧 Prompt创建新会话触发新 Prompt或通过 API 更新会话关联的 Prompt中文 Prompt 中英文模型返回英文模型默认语言与 Prompt 语言不一致在 Prompt 首行加入请始终使用中文回答思考题公司员工手册每年更新一次。新版本上线后旧助手应该直接退役、重定向到新助手、还是保留作为历史参考请从用户体验、成本、合规三个角度设计一个助手版本管理方案。如果用户的单次提问中包含了三个子问题如年假几天怎么申请没休完能换钱吗目前 RAGFlow 的一次检索只会产生一组 Chunk 喂给 LLM。请设计一种 Multi-Query 分解方案使得复杂问题被自动拆成多个子问题分别检索最后合并生成答案。答案提示见第8章末尾或附录 D。延伸阅读与资源10倍开发者的 Dify 魔法书从零构建全栈 AI 应用后端工程师转型AI第一课-Ollama 与私有化大模型实战大型语言模型(LLM) vLLM 高性能推理落地实战Agent开发之LlamaIndex 实战修炼与源码进阶大语言模型Transformers 实战修炼与源码剖析
返回列表