query_optimization.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
  2. def get_prompt_template(prompt_type:str) -> ChatPromptTemplate:
  3. """返回 RAG 问答链的提示模板。"""
  4. rewrite_prompt = PromptTemplate(
  5. input_variables=["query"],
  6. template="""你是⼀个查询优化助⼿。请将⽤户的⼝语化问题改写为更适合信息检索的
  7. 精确查询。
  8. 改写要求:
  9. 1. 补充隐含的上下⽂信息
  10. 2. 将⼝语化表达转为专业表述
  11. 在 RAG 链路中集成
  12. 将查询重写作为检索前的预处理步骤:
  13. 3. 消除歧义,明确查询意图
  14. 4. 保持原意不变,不要添加原问题未提及的内容
  15. 5. 直接输出改写后的查询,不要解释
  16. ⽤户问题: {query}
  17. 改写后的查询:"""
  18. )
  19. decompose_prompt = PromptTemplate(
  20. input_variables=["question"],
  21. template="""你是⼀个问题分解助⼿。请将⽤户的复杂问题分解为 2-4 个独⽴的⼦问
  22. 题,
  23. 每个⼦问题应该能独⽴检索和回答。
  24. 要求:
  25. 1. ⼦问题之间互不依赖,可以并⾏检索
  26. 2. ⼦问题覆盖原始问题的所有⽅⾯
  27. 3. 每个⼦问题简洁明确
  28. 4. 以 JSON 数组格式输出
  29. ⽤户问题: {question}
  30. 输出格式示例: ["⼦问题1", "⼦问题2", "⼦问题3"]
  31. ⼦问题列表:"""
  32. )
  33. clarify_prompt = PromptTemplate(
  34. input_variables=["query"],
  35. template="""你是⼀个智能客服助⼿。请判断⽤户的提问是否包含⾜够的信息来进⾏准
  36. 确检索和回答。
  37. 判断标准:
  38. 1. 问题是否有明确的主语(指代的对象是否清晰)
  39. 2. 问题是否包含必要的上下⽂(时间、地点、产品型号等)
  40. 3. 问题是否存在歧义(可能有多种理解⽅式)
  41. 请以 JSON 格式返回:
  42. - 如果问题清晰:{{"need_clarify": false, "reason": "问题清晰的原因"}}
  43. - 如果需要澄清:{{"need_clarify": true, "clarification": "向⽤户提出的澄清
  44. 问题", "assumption": "如果必须回答时的合理假设"}}
  45. ⽤户问题: {query}
  46. 结果:"""
  47. )
  48. if prompt_type == "rewrite":
  49. return rewrite_prompt
  50. elif prompt_type == "decompose":
  51. return decompose_prompt
  52. elif prompt_type == "clarify":
  53. return clarify_prompt
  54. else:
  55. return (ChatPromptTemplate.from_messages(
  56. [
  57. (
  58. "system",
  59. "你是专业的汽车知识库助手。只能依据给出的上下文回答;"
  60. "上下文没有答案时,请直接说明“抱歉,我无法从知识库中回答这个问题”。",
  61. ),
  62. ("user", "上下文:\n{context}\n\n用户问题:{question}"),
  63. ]
  64. ))