agent.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import sys
  2. import os
  3. from typing import Any, Dict, List
  4. import json
  5. # 添加项目根目录到 Python 路径
  6. sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
  7. from utils.logging_config import get_logger
  8. from utils.mysql_db import MysqlHelper
  9. logger = get_logger('ExpandAgent')
  10. try:
  11. from gemini import GeminiProcessor
  12. HAS_GEMINI = True
  13. except ImportError:
  14. HAS_GEMINI = False
  15. def _fetch_parsing_data_by_request(request_id: str) -> List[str]:
  16. """从 knowledge_parsing_content 表中根据 request_id 获取 parsing_data 字段"""
  17. sql = "SELECT parsing_data FROM knowledge_parsing_content WHERE request_id = %s ORDER BY id DESC LIMIT 10"
  18. rows = MysqlHelper.get_values(sql, (request_id,)) or []
  19. results = []
  20. for row in rows:
  21. parsing_data = row[0] # 获取 parsing_data 字段
  22. if parsing_data:
  23. results.append(parsing_data)
  24. print(f"Final results: {len(results)} items")
  25. return results
  26. def _build_prompt(data_samples: str, input_query: str) -> str:
  27. """构建用于扩展查询的 Prompt"""
  28. return f"""# 角色与目标
  29. 你是一个Query词扩展与优化专家,任务是从输入文本中提取适合用于搜索"创作/制作方法论"的关键词,并基于这些关键词生成多组可直接用于爬虫搜索的query词模板。
  30. 目标是:
  31. 1. 提取文本中与"创作方法论/制作方法论"相关的核心关键词。
  32. 2. 为每个关键词生成同义词、近义词、衍生表达。
  33. 3. 将关键词与固定的模板组合,输出可单独搜索的query词,以及多关键词组合的query词。
  34. 4. 输出格式要求结构化,支持工程化直接使用。
  35. # 任务
  36. 1. 提取文本中的核心关键词(与"创作/制作方法论"高度相关)。
  37. 2. 为每个关键词生成同义/扩展词。
  38. 3. 按以下模板格式输出结果。
  39. 4. 将任务中1和2的关键词(含扩展的关键词)需要填入到输出格式的 "query_templates"与"query_combinations":模板后输出结果。
  40. # 输出格式
  41. {{
  42. "core_keywords": [
  43. "关键词1",
  44. "关键词2",
  45. ...
  46. ],
  47. "expanded_keywords": {{
  48. "关键词1": ["同义词1", "同义词2", "变体1"],
  49. "关键词2": ["同义词1", "同义词2", "变体1"]
  50. }},
  51. "query_templates": [
  52. "如何 + {{关键词}}",
  53. "{{关键词}} + 方法论",
  54. "{{关键词}} + 技巧",
  55. "{{关键词}} + 步骤",
  56. "{{关键词}} + 流程",
  57. "{{关键词}} + 案例",
  58. "{{关键词}} + 总结",
  59. "{{关键词}} + 原理",
  60. "如何提升 + {{关键词}}",
  61. "从零开始 + {{关键词}}"
  62. ],
  63. "query_combinations": [
  64. "{{关键词1}} + {{关键词2}} + 方法论",
  65. "{{关键词1}} + {{关键词2}} + 案例",
  66. "如何结合 {{关键词1}} 与 {{关键词2}}"
  67. ]
  68. }}
  69. 输入文本: {data_samples}
  70. 请按照上述格式输出JSON结果。"""
  71. def _run_llm(prompt: str) -> List[str]:
  72. """调用LLM生成扩展查询"""
  73. if not HAS_GEMINI:
  74. return []
  75. try:
  76. processor = GeminiProcessor()
  77. result = processor.process(content=prompt, system_prompt="你是专业的查询扩展助手")
  78. print(f"result: {result}")
  79. # 尝试解析返回结果
  80. if isinstance(result, dict):
  81. text = result.get("result", "") or result.get("raw_response", "")
  82. else:
  83. text = str(result)
  84. try:
  85. queries = json.loads(text)
  86. return queries if isinstance(queries, list) else []
  87. except:
  88. return []
  89. except Exception as e:
  90. logger.error(f"LLM调用失败: {e}")
  91. return []
  92. def _heuristic_expand(input_query: str) -> List[str]:
  93. """启发式扩展(LLM不可用时的fallback)"""
  94. base = input_query.strip()
  95. if not base:
  96. return []
  97. return [
  98. base,
  99. f"{base} 教程",
  100. f"{base} 实战",
  101. f"{base} 入门指南",
  102. f"{base} 高级技巧"
  103. ]
  104. def execute_expand_agent_with_api(requestId: str, query: str = "") -> Dict[str, Any]:
  105. """对外暴露的API:根据requestId查询数据,生成扩展查询"""
  106. # 获取数据
  107. data_samples = _fetch_parsing_data_by_request(requestId)
  108. print(f"data_samples: {data_samples[0]}")
  109. # 构建prompt
  110. prompt = _build_prompt(data_samples[0], query)
  111. print(f"prompt: {prompt}")
  112. # 生成扩展查询
  113. expanded = _run_llm(prompt)
  114. if not expanded:
  115. expanded = _heuristic_expand(query)
  116. print(f"expanded: {expanded}")
  117. return {
  118. "requestId": requestId,
  119. "inputQuery": query,
  120. "prompt": prompt,
  121. "expandedQueries": expanded
  122. }
  123. if __name__ == "__main__":
  124. queries = execute_expand_agent_with_api("REQUEST_001")
  125. print(queries)