为什么使用百度AI搜索
学习langchain的过程中,遇到使用search api的时候,发现langchain官方文档中支持的搜索工具大多是国外的,例如google search或bing search,收费不说,很多还连接不上(工具 | LangChain中文网)。
经过一番寻找,发现国内也有两家提供search api,一个是博查(博查AI开放平台 | Search API, Reranker API),另一个就是最近刚出的百度AI搜索(百度AI搜索 - 千帆AppBuilder-产品文档)。
博查是收费的,而百度AI搜索每天有100次的免费额度,更加适合个人学习使用。
使用方式
百度AI搜索支持post请求,OpenAI SDK,Cursor MCP组件等多种方式调用,今天主要讲一下在langchain中如何使用。
第一步首先需要申请一个API KEY
通过langchain-openai直接调用
from langchain_openai import ChatOpenAIclient = ChatOpenAI(model="deepseek-r1", api_key=API_KEY, #申请的百度API KEYbase_url="https://qianfan.baidubce.com/v2/ai_search"
)response = client.invoke("今天成都天气怎么样")print(response)
直接调用有许多参数不支持,如果希望能够自由设置例如最大返回数量,检索条件等参数,可以使用工具,具体参数可以查看百度AI搜索 - 千帆AppBuilder-产品文档
自定义langchain工具
import requests
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain_qwq import ChatQwQ@tool
def baidu_search_tool(query: str) -> str:"""使用Baidu Search API进行联网搜索,返回搜索结果的字符串。参数:- query: 搜索关键词返回:- 搜索结果的字符串形式"""url = 'https://qianfan.baidubce.com/v2/ai_search'headers = {'Authorization': f'Bearer {API_KEY}', # 请替换为你的API密钥'Content-Type': 'application/json'}messages = [{"content": query,"role": "user"}]data = {"messages": messages,"search_source": "baidu_search_v2","search_recency_filter":"month" #可以自定义各种检索条件}response = requests.post(url, headers=headers, json=data)if response.status_code == 200:# 返回给大模型的格式化的搜索结果文本# 可以自己对博查的搜索结果进行自定义处理return str(response.json())else:raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")#打印工具名称,描述,参数等 名称正确、文档正确且类型提示正确的工具更易于模型使用
print(baidu_search_tool.name)
print(baidu_search_tool.description)
print(baidu_search_tool.args)#直接使用工具
print(baidu_search_tool.invoke("介绍下langchain"))tools = [baidu_search_tool]#通义千问大模型,可以替换为任何一个支持工具调用的大模型
tongyi_chat = ChatQwQ(model="qwen-plus",api_key=QWEN_KEY, #替换为对应大模型的KEYapi_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)#查看我们的输入是否会调用工具,注意,这里并不会真正调用工具
with_tool = tongyi_chat.bind_tools(tools)
result = with_tool.invoke("今天成都天气怎么样")
print(result.content)
print(result.tool_calls)#创建代理并调用工具
prompt = ChatPromptTemplate.from_template("今天{city}天气怎么样 {agent_scratchpad}")
agent = create_tool_calling_agent(tongyi_chat, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
print(agent_executor.invoke({"city":"成都", "agent_scratchpad":"intermediate_steps"}))