Source code for langchain_community.utilities.bing_search

"""调用必应搜索的工具。"""
from typing import Dict, List

import requests
from langchain_core.pydantic_v1 import BaseModel, Extra, Field, root_validator
from langchain_core.utils import get_from_dict_or_env


[docs]class BingSearchAPIWrapper(BaseModel): """Bing搜索API的封装。""" bing_subscription_key: str bing_search_url: str k: int = 10 search_kwargs: dict = Field(default_factory=dict) """传递给搜索请求的其他关键字参数。""" class Config: """此pydantic对象的配置。""" extra = Extra.forbid def _bing_search_results(self, search_term: str, count: int) -> List[dict]: headers = {"Ocp-Apim-Subscription-Key": self.bing_subscription_key} params = { "q": search_term, "count": count, "textDecorations": True, "textFormat": "HTML", **self.search_kwargs, } response = requests.get( self.bing_search_url, headers=headers, params=params, # type: ignore ) response.raise_for_status() search_results = response.json() if "webPages" in search_results: return search_results["webPages"]["value"] return [] @root_validator(pre=True) def validate_environment(cls, values: Dict) -> Dict: """确保环境中存在API密钥和端点。""" bing_subscription_key = get_from_dict_or_env( values, "bing_subscription_key", "BING_SUBSCRIPTION_KEY" ) values["bing_subscription_key"] = bing_subscription_key bing_search_url = get_from_dict_or_env( values, "bing_search_url", "BING_SEARCH_URL", # default="https://api.bing.microsoft.com/v7.0/search", ) values["bing_search_url"] = bing_search_url return values
[docs] def run(self, query: str) -> str: """通过BingSearch运行查询并解析结果。""" snippets = [] results = self._bing_search_results(query, count=self.k) if len(results) == 0: return "No good Bing Search Result was found" for result in results: snippets.append(result["snippet"]) return " ".join(snippets)
[docs] def results(self, query: str, num_results: int) -> List[Dict]: """通过BingSearch运行查询并返回元数据。 参数: query:要搜索的查询。 num_results:要返回的结果数量。 返回: 一个包含以下键的字典列表: snippet - 结果的描述。 title - 结果的标题。 link - 结果的链接。 """ metadata_results = [] results = self._bing_search_results(query, count=num_results) if len(results) == 0: return [{"Result": "No good Bing Search Result was found"}] for result in results: metadata_result = { "snippet": result["snippet"], "title": result["name"], "link": result["url"], } metadata_results.append(metadata_result) return metadata_results