langchain-ai / langchain

🦜🔗 Build context-aware reasoning applications
https://python.langchain.com
MIT License
94.44k stars 15.26k forks source link

[Bing Search Wrapper] KeyError Exception 'webPages' in LangChain Bing Search Tool: Recurring Bug Impacting Search Results #12575

Closed braher closed 8 months ago

braher commented 1 year ago

System Info

Langchain version: v0.0.326 Python: 3.10

Who can help?

@hw We have been encountering a recurring issue with the Bing Search tool (BingSearchAPIWrapper) in LangChain developed in Python. The tool occasionally fails to return results, and the backend function displays the message webPages. This issue is connected to the BingSearchAPIWrapper

image

Information

Related Components

Reproduction

Steps to Reproduce:

  1. Query the Bing Search tool with a specific text : {"keywords":["Everyday C%23", "advanced"]} site:https:learn.microsoft.com'.
  2. Observe that the tool fails to return results and instead displays the message webPages.

Actual Behavior:

The Bing API fails to return relevant results if there are no matches. In these situations, the API omits the webPages property from the response.

Expected behavior

Expected Behavior:

The Bing Search tool should return relevant results for any given keyword or a message that the results can not be found.

dosubot[bot] commented 1 year ago

🤖

Hello @braher,

I'm here to assist you with your issue. I'm an AI developed to help solve bugs, answer questions, and guide contributors while waiting for a human maintainer.

From your description, it seems like the Bing Search tool in LangChain is encountering a KeyError when it doesn't find any results for a given query. This is likely because the 'webPages' key doesn't exist in the response JSON when no results are found.

Here's a potential solution: you could add error handling to check if the 'webPages' key exists in the response JSON before attempting to access it. If it doesn't exist, you could return a more informative error message to the user. Here's an example of how you could implement this:

search_results = response.json()
if 'webPages' in search_results:
    return search_results["webPages"]["value"]
else:
    return "No results found for your query."

This code snippet should be added to the '_bing_search_results' method in the 'BingSearchAPIWrapper' class, which is located in the libs/langchain/langchain/utilities/bing_search.py file.

This will return a more informative error message to the user when no results are found for their query. Please let me know if this helps or if you need further assistance.

Best, Dosu

Sources


This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

braher commented 1 year ago

@dosu-bot Your solution sound good, but we can't modify the libs/langchain/langchain/utilities/bing_search.py file as it is in the LangChain repository. We just can handle the exception in an instance of BingSearchAPIWrapper like this:

 results = None
  try:
      search = BingSearchAPIWrapper()
      results = search.results(search_term + " site:https://learn.microsoft.com/", os.getenv("BING_RESULTS_NUMBER"))
  except KeyError:
      results = "No good Bing Search Result was found"
  return str(results)
dosubot[bot] commented 1 year ago

🤖

Your approach to handling the KeyError exception is correct. When the 'webPages' key is not present in the JSON response, a KeyError will be raised. By using a try/except block, you can catch this error and handle it appropriately.

However, based on the structure of the JSON response returned by the BingSearchAPIWrapper tool in LangChain, it seems that the 'webPages' key is not expected to be in the response. Instead, the response is a list of dictionaries, each representing a search result with keys "snippet", "title", and "link". If no results are found, the returned list contains a single dictionary with the key "Result" and the value "No good Bing Search Result was found".

Therefore, it might be more appropriate to check if the "Result" key exists in the first dictionary of the response list, and if its value is "No good Bing Search Result was found". Here's how you can do it:

search = BingSearchAPIWrapper()
results = search.results(search_term + " site:https://learn.microsoft.com/", os.getenv("BING_RESULTS_NUMBER"))

if len(results) > 0 and results[0].get("Result") == "No good Bing Search Result was found":
    results = "No good Bing Search Result was found"

return str(results)

This way, you are directly checking the response for the specific case when no results are found, instead of catching a KeyError which could be raised for other reasons.

Sources


This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

dosubot[bot] commented 9 months ago

Hi, @braher,

I'm helping the LangChain team manage their backlog and am marking this issue as stale. The issue "Bing Search tool occasionally fails to return results and displays KeyError exception 'webPages'" is connected to the BingSearchAPIWrapper and occurs when the Bing API omits the 'webPages' property from the response if there are no matches. The expected behavior is for the tool to return relevant results for any given keyword or a message indicating that the results cannot be found. There is a discussion between you and Dosu about handling the KeyError exception and modifying the code to handle the issue appropriately.

Could you please confirm if this issue is still relevant to the latest version of the LangChain repository? If it is, please let the LangChain team know by commenting on the issue. Otherwise, feel free to close the issue yourself, or the issue will be automatically closed in 7 days.

Thank you for your understanding and cooperation.