基于LangChain的百度搜索插件开发与实践
一、插件设计目标
本文将开发一个集成百度搜索API的智能插件,实现以下核心功能:
- 支持自然语言搜索查询
- 自动解析用户意图(网页搜索/图片搜索/新闻搜索)
- 结构化结果输出与摘要生成
- 异步请求与批量处理能力
二、准备工作
1. 环境依赖
pip install langchain baidu-aip python-dotenv
2. 百度API配置
- 注册百度智能云创建应用
- 获取
API Key
和Secret Key
- 创建
.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 |
结果形式 | 链接/摘要 | 格式化数据 |
扩展方向 | 垂直搜索/实时热点 | 多日预报/生活指数 |
技术要点总结:
- 通过
BaseTool
实现标准化接口 - 使用
ChatPromptTemplate
解析自然语言 - 结合LLM实现意图理解与参数生成
- 异步编程提升并发处理能力
- 结构化输出增强用户体验
该插件可广泛应用于智能客服、内容聚合、数据分析等场景,通过组合不同百度AI接口(如OCR、翻译),可构建更复杂的智能应用系统。