keywords.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """
  2. 关键词提取和处理工具
  3. """
  4. import re
  5. from typing import List, Dict, Any
  6. from .api_client import LLMClient
  7. async def extract_keywords(
  8. research_topic: str,
  9. llm_client: LLMClient
  10. ) -> List[str]:
  11. """从研究主题中提取核心关键词"""
  12. prompt = f"""
  13. 请从以下研究主题中提取4-6个核心关键词。这些关键词应当:
  14. 1. 直接来源于用户文本,不要发散生成
  15. 2. 准确反映研究主题的核心概念
  16. 3. 具有学术检索价值
  17. 4. 优先选择专业术语、技术名词和研究领域
  18. 研究主题: {research_topic}
  19. 仅返回逗号分隔的关键词列表:
  20. """
  21. response = await llm_client.generate_text(prompt, temperature=0.1)
  22. # 清理处理响应
  23. response = re.sub(r'[\n\r]+', ',', response)
  24. response = re.sub(r'\s*,\s*', ',', response)
  25. response = re.sub(r'^\s+|\s+$', '', response)
  26. keywords = [kw.strip() for kw in response.split(',') if kw.strip()]
  27. # 限制数量
  28. return keywords[:6]
  29. async def expand_search_queries(
  30. keywords: List[str],
  31. llm_client: LLMClient
  32. ) -> List[str]:
  33. """基于关键词生成研究方向"""
  34. kw_text = ", ".join(keywords)
  35. prompt = f"""
  36. 基于以下关键词,生成4-6个明确、具体且各不相同的研究方向。
  37. 关键词: {kw_text}
  38. 每个研究方向应当:
  39. 1. 具体且可研究,而非笼统的话题
  40. 2. 聚焦不同的研究角度或应用领域
  41. 3. 适合作为学术研究问题
  42. 4. 形式为研究问题或研究主题陈述
  43. 只需返回研究方向列表,每行一个,不要包含编号或其他解释。
  44. """
  45. response = await llm_client.generate_text(prompt, temperature=0.7)
  46. # 解析研究方向
  47. directions = [line.strip() for line in response.splitlines() if line.strip()]
  48. return directions