rag_chat_agent.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from typing import List
  2. from applications.config import Chunk
  3. from applications.api import fetch_deepseek_completion
  4. class RAGChatAgent:
  5. @staticmethod
  6. def generate_summary_prompt(query, search_results):
  7. """
  8. 生成总结的prompt。交给AI根据搜索结果判断内容是否对回答问题有帮助,
  9. 并结合内容生成总结和判断是否能回答问题。
  10. :param query: 问题
  11. :param search_results: 搜索结果列表,每个元素包含 'content', 'contentSummary'
  12. :return: 生成的总结prompt
  13. """
  14. prompt = f"问题: {query}\n\n请结合以下搜索结果,生成一个总结:\n"
  15. weighted_summaries = []
  16. weighted_contents = []
  17. # 将所有搜索结果的摘要和内容按相似度排序
  18. for result in search_results:
  19. content = result["content"]
  20. content_summary = result["contentSummary"]
  21. weighted_summaries.append(content_summary)
  22. weighted_contents.append(content)
  23. # 拼接加权摘要和内容
  24. prompt += "\n-- 内容摘要 --\n"
  25. for summary in weighted_summaries:
  26. prompt += f"摘要: {summary}\n"
  27. prompt += "\n-- 内容 --\n"
  28. for content in weighted_contents:
  29. prompt += f"内容: {content}\n"
  30. # 约束 AI 输出 JSON
  31. prompt += """
  32. 请根据上述内容判断能否回答问题,并生成一个总结,返回 JSON 格式,结构如下:
  33. {
  34. "query": "<原始问题>",
  35. "summary": "<简洁总结>",
  36. "relevance_score": <0到1之间的小数,表示总结与问题的相关度>,
  37. "status": <判断能否回答这个问题,0代表不能回答,1代表可以回答>
  38. }
  39. 注意:
  40. - 只输出 JSON,不要额外解释。
  41. - relevance_score 数字越大,表示总结和问题越相关。
  42. - 请根据问题和给定的搜索结果内容,判断是否能回答该问题。返回一个 0 或 1 的 status,表示能否回答问题。
  43. """
  44. return prompt
  45. async def chat_with_deepseek(self, query, search_results):
  46. prompt = self.generate_summary_prompt(query, search_results)
  47. response = await fetch_deepseek_completion(
  48. model="DeepSeek-V3", prompt=prompt, output_type="json"
  49. )
  50. return response
  51. @staticmethod
  52. def create_query_prompt(question: str) -> str:
  53. """
  54. 封装生成查询的 prompt,用于发送给 AI 模型。
  55. 参数:
  56. - question: 需要查询的问题(字符串)
  57. 返回:
  58. - 返回一个格式化的 prompt 字符串,用于向 AI 提问
  59. """
  60. prompt = f"""
  61. 你是一个智能助手,能够帮助我查询任何问题并返回答案。你的任务是接收到我给定的问题后,通过网络查询相关的信息,并以 JSON 格式返回查询结果。
  62. 问题:{question}
  63. 请查询并返回该问题的答案。返回的 JSON 应该包含以下字段:
  64. - "question": 问题的原始文本。
  65. - "answer": 问题的答案内容。
  66. - "source": 如果有来源,提供信息来源链接或描述。
  67. - "status": 表示查询是否成功,"1代表成功,0代表失败"。
  68. 如果无法找到答案,返回 "status": "failure",并且 "answer" 字段应为 "No answer found"。
  69. 例子:
  70. {{
  71. "question": "什么是量子计算?",
  72. "answer": "量子计算是一种基于量子力学原理的计算模型。",
  73. "source": "https://example.com/quantum-computing",
  74. "status": 1
  75. }}
  76. """
  77. return prompt
  78. async def search_with_deepseek(self, query):
  79. prompt = self.create_query_prompt(query)
  80. response = await fetch_deepseek_completion(
  81. model="DeepSeek-V3", prompt=prompt, output_type="json"
  82. )
  83. return response
  84. @staticmethod
  85. def select_prompt(chat_res, search_res):
  86. # 创建一个 prompt 请求给大模型
  87. prompt = f"""
  88. 这是一个问题的回答任务,以下是两个来源的结果:
  89. 1. **RAG 搜索回答**:
  90. 问题: {chat_res["query"]}
  91. 总结: {chat_res["summary"]}
  92. 相关度评分: {chat_res["relevance_score"]}
  93. 状态: {"可以回答" if chat_res["status"] == 1 else "无法回答"}
  94. 2. **AI 搜索结果**:
  95. 问题: {search_res["question"]}
  96. 答案: {search_res["answer"]}
  97. 来源: {search_res["source"]}
  98. 状态: {"可以回答" if search_res["status"] == 1 else "无法回答"}
  99. 基于这两个结果,请你综合判断并生成一个更好的答案,如果可能的话。你可以选择结合 `chat_res` 和 `search_res`,或者选择其中更合适的一个进行回答。如果没有足够的信息可以回答,请用你自己已有的知识回答"。
  100. 请返回以下格式的 JSON 结果:
  101. {{
  102. "result": "<最终的答案>",
  103. "relevance_score": <0到1之间的小数,表示总结与问题的相关度>,
  104. "status": <1代表回答的好,0代表回答的不好>
  105. }}
  106. """
  107. return prompt
  108. async def select_with_deepseek(self, chat_res, search_res):
  109. prompt = self.select_prompt(chat_res, search_res)
  110. response = await fetch_deepseek_completion(
  111. model="DeepSeek-V3", prompt=prompt, output_type="json"
  112. )
  113. return response