根据查询(query)从工具列表(tools)中筛选相关的工具。 使用 TF-IDF 和余弦相似度计算相关性。 返回的工具按相关性得分降序排列,并受 MAX_RETURNED_TOOLS 限制。 参数: query (Union[str, List[str]]): 查询词或查询词列表。 tools (List[Dict[str, Any]]): 工具定义的列表。 返回: List[Dict[str, Any]]: 与查询相关的工具列表(按相关性排序)。
(query: Union[str, List[str]],
tools: List[Dict[str, Any]])
| 45 | |
| 46 | # Similarity threshold for tool relevance |
| 47 | def get_related_tools(query: Union[str, List[str]], |
| 48 | tools: List[Dict[str, Any]]) -> List[Dict[str, Any]]: |
| 49 | """ |
| 50 | 根据查询(query)从工具列表(tools)中筛选相关的工具。 |
| 51 | |
| 52 | 使用 TF-IDF 和余弦相似度计算相关性。 |
| 53 | 返回的工具按相关性得分降序排列,并受 MAX_RETURNED_TOOLS 限制。 |
| 54 | |
| 55 | 参数: |
| 56 | query (Union[str, List[str]]): |
| 57 | 查询词或查询词列表。 |
| 58 | tools (List[Dict[str, Any]]): |
| 59 | 工具定义的列表。 |
| 60 | |
| 61 | 返回: |
| 62 | List[Dict[str, Any]]: |
| 63 | 与查询相关的工具列表(按相关性排序)。 |
| 64 | """ |
| 65 | MAX_RETURNED_TOOLS = 128 |
| 66 | SIMILARITY_THRESHOLD = 0.1 |
| 67 | if not tools: |
| 68 | return [] |
| 69 | |
| 70 | # 1. 标准化查询输入 |
| 71 | query_string: str |
| 72 | if isinstance(query, str): |
| 73 | query_string = query |
| 74 | elif isinstance(query, list): |
| 75 | query_string = " ".join(q for q in query if isinstance(q, str)) |
| 76 | else: |
| 77 | sys.stderr.write("错误:查询类型必须是 str 或 List[str]。\n") |
| 78 | return [] |
| 79 | |
| 80 | if not query_string.strip(): |
| 81 | return [] |
| 82 | |
| 83 | # 2. 构建“文档”语料库 (Corpus) |
| 84 | corpus = [] |
| 85 | valid_tools = [] |
| 86 | for tool in tools: |
| 87 | try: |
| 88 | func_data = tool['function'] |
| 89 | name = func_data.get('name', '') |
| 90 | description = func_data.get('description', '') |
| 91 | searchable_text = f"{name} {description}" |
| 92 | corpus.append(searchable_text) |
| 93 | valid_tools.append(tool) |
| 94 | except (AttributeError, TypeError, KeyError): |
| 95 | continue |
| 96 | |
| 97 | if not valid_tools: |
| 98 | return [] |
| 99 | |
| 100 | # 3. TF-IDF 向量化 |
| 101 | try: |
| 102 | vectorizer = TfidfVectorizer(stop_words='english') |
| 103 | tfidf_matrix = vectorizer.fit_transform(corpus) |
| 104 | query_vector = vectorizer.transform([query_string]) |