jihuaqiang 1 week ago
parent
commit
c18b41c7eb
4 changed files with 188 additions and 1 deletions
  1. 18 0
      agent.py
  2. 153 0
      agents/expand_agent/agent.py
  3. 0 0
      agents/expand_agent/tools.py
  4. 17 1
      database/models.py

+ 18 - 0
agent.py

@@ -21,6 +21,7 @@ from fastapi.responses import JSONResponse
 from pydantic import BaseModel, Field
 import uvicorn
 from agents.clean_agent.agent import execute_agent_with_api
+from agents.expand_agent.agent import execute_expand_agent_with_api
 
 # LangGraph 相关导入
 try:
@@ -587,6 +588,23 @@ async def extract(input: str):
     except Exception as e:
         raise HTTPException(status_code=500, detail=f"执行Agent时出错: {str(e)}")
 
+@app.post("/expand")
+async def expand(requestId: str):
+    """
+    执行Agent处理用户指令
+    
+    Args:
+        requestId: 请求ID
+        
+    Returns:
+        dict: 包含执行结果的字典
+    """
+    try:
+        result = execute_expand_agent_with_api(requestId)
+        return {"status": 1, "result": result}
+    except Exception as e:
+        raise HTTPException(status_code=500, detail=f"执行Agent时出错: {str(e)}")
+
 if __name__ == "__main__":
     # 启动服务
     uvicorn.run(

+ 153 - 0
agents/expand_agent/agent.py

@@ -0,0 +1,153 @@
+import sys
+import os
+from typing import Any, Dict, List
+import json
+
+# 添加项目根目录到 Python 路径
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+
+from utils.logging_config import get_logger
+from utils.mysql_db import MysqlHelper
+
+logger = get_logger('ExpandAgent')
+
+try:
+    from gemini import GeminiProcessor
+    HAS_GEMINI = True
+except ImportError:
+    HAS_GEMINI = False
+
+
+def _fetch_parsing_data_by_request(request_id: str) -> List[str]:
+    """从 knowledge_parsing_content 表中根据 request_id 获取 parsing_data 字段"""
+    sql = "SELECT parsing_data FROM knowledge_parsing_content WHERE request_id = %s ORDER BY id DESC LIMIT 10"
+    rows = MysqlHelper.get_values(sql, (request_id,)) or []
+    
+    results = []
+    for row in rows:
+        parsing_data = row[0]  # 获取 parsing_data 字段
+        if parsing_data:
+            results.append(parsing_data)
+    
+    print(f"Final results: {len(results)} items")
+    return results
+
+
+def _build_prompt(data_samples: str, input_query: str) -> str:
+    """构建用于扩展查询的 Prompt"""    
+    return f"""# 角色与目标
+你是一个Query词扩展与优化专家,任务是从输入文本中提取适合用于搜索"创作/制作方法论"的关键词,并基于这些关键词生成多组可直接用于爬虫搜索的query词模板。
+目标是:
+1. 提取文本中与"创作方法论/制作方法论"相关的核心关键词。
+2. 为每个关键词生成同义词、近义词、衍生表达。
+3. 将关键词与固定的模板组合,输出可单独搜索的query词,以及多关键词组合的query词。
+4. 输出格式要求结构化,支持工程化直接使用。
+
+
+# 任务
+1. 提取文本中的核心关键词(与"创作/制作方法论"高度相关)。
+2. 为每个关键词生成同义/扩展词。
+3. 按以下模板格式输出结果。
+4. 将任务中1和2的关键词(含扩展的关键词)需要填入到输出格式的 "query_templates"与"query_combinations":模板后输出结果。
+
+# 输出格式
+{{
+  "core_keywords": [
+    "关键词1",
+    "关键词2",
+    ...
+  ],
+  "expanded_keywords": {{
+    "关键词1": ["同义词1", "同义词2", "变体1"],
+    "关键词2": ["同义词1", "同义词2", "变体1"]
+  }},
+  "query_templates": [
+    "如何 + {{关键词}}",
+    "{{关键词}} + 方法论",
+    "{{关键词}} + 技巧",
+    "{{关键词}} + 步骤",
+    "{{关键词}} + 流程",
+    "{{关键词}} + 案例",
+    "{{关键词}} + 总结",
+    "{{关键词}} + 原理",
+    "如何提升 + {{关键词}}",
+    "从零开始 + {{关键词}}"
+  ],
+  "query_combinations": [
+    "{{关键词1}} + {{关键词2}} + 方法论",
+    "{{关键词1}} + {{关键词2}} + 案例",
+    "如何结合 {{关键词1}} 与 {{关键词2}}"
+  ]
+}}
+
+输入文本: {data_samples}
+
+请按照上述格式输出JSON结果。"""
+
+
+def _run_llm(prompt: str) -> List[str]:
+    """调用LLM生成扩展查询"""
+    if not HAS_GEMINI:
+        return []
+        
+    try:
+        processor = GeminiProcessor()
+        result = processor.process(content=prompt, system_prompt="你是专业的查询扩展助手")
+        print(f"result: {result}")
+        # 尝试解析返回结果
+        if isinstance(result, dict):
+            text = result.get("result", "") or result.get("raw_response", "")
+        else:
+            text = str(result)
+            
+        try:
+            queries = json.loads(text)
+            return queries if isinstance(queries, list) else []
+        except:
+            return []
+            
+    except Exception as e:
+        logger.error(f"LLM调用失败: {e}")
+        return []
+
+
+def _heuristic_expand(input_query: str) -> List[str]:
+    """启发式扩展(LLM不可用时的fallback)"""
+    base = input_query.strip()
+    if not base:
+        return []
+        
+    return [
+        base,
+        f"{base} 教程",
+        f"{base} 实战",
+        f"{base} 入门指南",
+        f"{base} 高级技巧"
+    ]
+
+
+def execute_expand_agent_with_api(requestId: str, query: str = "") -> Dict[str, Any]:
+    """对外暴露的API:根据requestId查询数据,生成扩展查询"""
+    # 获取数据
+    data_samples = _fetch_parsing_data_by_request(requestId)
+    print(f"data_samples: {data_samples[0]}")
+    
+    # 构建prompt
+    prompt = _build_prompt(data_samples[0], query)
+    print(f"prompt: {prompt}")
+
+    # 生成扩展查询
+    expanded = _run_llm(prompt)
+    if not expanded:
+        expanded = _heuristic_expand(query)
+    print(f"expanded: {expanded}")
+    return {
+        "requestId": requestId,
+        "inputQuery": query,
+        "prompt": prompt,
+        "expandedQueries": expanded
+    } 
+
+if __name__ == "__main__":
+    queries = execute_expand_agent_with_api("REQUEST_001")
+    print(queries)

+ 0 - 0
agents/expand_agent/tools.py


+ 17 - 1
database/models.py

@@ -1,4 +1,4 @@
-from sqlalchemy import Column, Integer, String, DateTime, Text, BigInteger
+from sqlalchemy import Column, Integer, String, DateTime, Text, BigInteger, Index, JSON
 from datetime import datetime
 from .db import Base
 
@@ -39,3 +39,19 @@ class KnowledgeExtractionContent(Base):
     
     def __repr__(self):
         return f"<KnowledgeExtractionContent(id={self.id}, request_id={self.request_id}, status={self.status})>"
+
+class KnowledgeExpandContent(Base):
+    __tablename__ = 'knowledge_expand_content'
+    __table_args__ = {
+        'comment': '拓展字段'
+    }
+    
+    id = Column(BigInteger, primary_key=True, autoincrement=True)
+    request_id = Column(String(128), nullable=False)
+    create_time = Column(DateTime, default=datetime.now)
+    expand_querys = Column(JSON, comment='拓展的query词列表')
+    keywords = Column(JSON, comment='提取的内容关键词列表')
+    query = Column(Text, comment='搜索词')
+    
+    def __repr__(self):
+        return f"<KnowledgeExpandContent(id={self.id}, request_id={self.request_id})>"