基于LangChain的百度搜索插件开发与实践

基于LangChain的百度搜索插件开发与实践

一、插件设计目标

本文将开发一个集成百度搜索API的智能插件,实现以下核心功能:

  • 支持自然语言搜索查询
  • 自动解析用户意图(网页搜索/图片搜索/新闻搜索)
  • 结构化结果输出与摘要生成
  • 异步请求与批量处理能力

二、准备工作

1. 环境依赖

pip install langchain baidu-aip python-dotenv

2. 百度API配置

  1. 注册百度智能云创建应用
  2. 获取API KeySecret Key
  3. 创建.env文件:
BAIDU_API_KEY=your_api_key
BAIDU_SECRET_KEY=your_secret_key

三、核心代码实现

1. 搜索工具类设计

from baidu.aip import AipSearch
from langchain_core.tools import BaseTool

class BaiduSearchTool(BaseTool):
    name = "baidu_search"
    description = (
        "用于百度搜索的工具"
        "输入应为包含以下字段的JSON:"
        "query: 搜索关键词"
        "type: 搜索类型(web/news/image)"
        "page: 页码(1-10)"
    )
    
    def __init__(self):
        super().__init__()
        self.client = AipSearch(
            os.getenv("BAIDU_API_KEY"),
            os.getenv("BAIDU_SECRET_KEY")
        )

2. 核心功能模块

(1)搜索请求封装
def _run(self, query: str, search_type: str = "web", page: int = 1) -> str:
    """执行搜索请求"""
    options = {
        "page_num": page,
        "result_type": search_type.upper(),
        "format": "json"
    }
    
    try:
        result = self.client.webSearch(query, **options)
        return self._format_result(result, search_type)
    except Exception as e:
        return f"搜索失败:{str(e)}"
(2)结果格式化
@staticmethod
def _format_result(data: dict, search_type: str) -> str:
    """结构化结果输出"""
    if search_type == "web":
        return "\n".join([
            f"🔗 {item['title']}\n   {item['url']}\n   {item['abstract'][:100]}..."
            for item in data.get("data", [])
        ])
    
    if search_type == "image":
        return "\n".join([
            f"🖼 {item['thumbURL']}{item['title']}】"
            for item in data.get("image_results", [])
        ])

3. 智能解析模块

from langchain_core.prompts import ChatPromptTemplate

SEARCH_PROMPT = ChatPromptTemplate.from_messages([
    SystemMessage(content=(
        "请分析用户查询并生成搜索参数:"
        "1. 提取核心关键词"
        "2. 判断搜索类型(默认网页搜索)"
        "3. 确定是否需要翻页"
        "输出格式:{\"query\":\"...\",\"type\":\"...\",\"page\":1}"
    )),
    HumanMessage(content="{input}")
])

四、插件集成与测试

1. 完整调用链

from langchain_ollama import ChatOllama

async def handle_search(query: str) -> list:
    """搜索请求处理链"""
    search_tool = BaiduSearchTool()
    
    # 模型配置
    llm = ChatOllama(
        model="qwen-v1.5",
        temperature=0.7
    ).bind_tools([search_tool])
    
    # 执行对话链
    chain = SEARCH_PROMPT | llm
    response = await chain.ainvoke({"input": query})
    
    # 处理工具调用
    return [await _call_search_tool(call, search_tool) for call in response.tool_calls]

2. 测试用例与结果

测试输入解析参数输出示例
“2025年人工智能发展趋势”{“query”:“2025年人工智能发展趋势”,“type”:“web”}3条相关网页链接及摘要
“北京故宫图片”{“query”:“北京故宫”,“type”:“image”}5张故宫缩略图链接
“昨天的新闻联播内容”{“query”:“新闻联播 2025-03-25”,“type”:“news”}新闻标题及来源

五、扩展功能实现

1. 高级搜索参数

def _run(self, **kwargs):
    # 支持高级搜索参数
    advanced_params = {
        "site": kwargs.get("site"),  # 限定站点
        "time": kwargs.get("time"),  # 时间范围
        "fileType": kwargs.get("fileType")  # 文件类型
    }
    return self.client.webSearch(kwargs["query"], **advanced_params)

2. 结果摘要生成

from langchain.chains.summarize import load_summarize_chain

def _summarize_results(results: list) -> str:
    """生成内容摘要"""
    chain = load_summarize_chain(
        llm=ChatOllama(model="qwen-light"),
        chain_type="map_reduce"
    )
    return chain.run([doc.page_content for doc in results])

六、部署与优化建议

1. 性能优化方案

# 异步批量搜索示例
async def batch_search_queries(queries: list):
    tasks = [handle_search(q) for q in queries]
    return await asyncio.gather(*tasks)

2. 服务化部署

# FastAPI接口示例
from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.post("/baidu-search")
async def search_endpoint(query: str):
    try:
        return await handle_search(query)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

七、对比与总结

功能特性百度搜索插件高德天气插件
输入类型自然语言查询地理位置描述
核心API百度搜索API高德天气API
结果形式链接/摘要格式化数据
扩展方向垂直搜索/实时热点多日预报/生活指数

技术要点总结:

  1. 通过BaseTool实现标准化接口
  2. 使用ChatPromptTemplate解析自然语言
  3. 结合LLM实现意图理解与参数生成
  4. 异步编程提升并发处理能力
  5. 结构化输出增强用户体验

该插件可广泛应用于智能客服、内容聚合、数据分析等场景,通过组合不同百度AI接口(如OCR、翻译),可构建更复杂的智能应用系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值