上篇文章介绍了国内可用的博查 Web Search API,详见:使用博查Web Search API获取搜索引擎的网页链接和文本摘要,给AI/RAG应用增加联网搜索功能
本篇讲述一下如何通过 LangChain 的 Function Call 方式使用它。
1. 安装 LangChain
pip install langchain openai
2. 获取博查 Web Search 的 API KEY
前往 https://open.bochaai.com,微信扫码登陆后,在首页点击右上角的 “AP KEY管理”,创建API KEY,复制出来即可。
3.示例代码
import requests
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_openai import ChatOpenAI
from langchain.tools import tool
OPENAI_API_KEY = "YOUR OPENAI API KEY"
BOCHA_API_KEY = "YOUR BOCHA API KEY"
# 定义Bocha Web Search工具
@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
"""
使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。
参数:
- query: 搜索关键词
- count: 返回的搜索结果数量
返回:
- 搜索结果的字符串形式
"""
url = 'https://api.bochaai.com/v1/web-search'
headers = {
'Authorization': f'Bearer {BOCHA_API_KEY}', # 请替换为你的API密钥
'Content-Type': 'application/json'
}
data = {
"query": query,
"freshness": "noLimit", # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
"summary": True, # 是否返回长文本摘要总结
"count": count
}
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}")
# 创建LangChain工具
bocha_tool = Tool(
name="BochaWebSearch",
func=bocha_web_search_tool,
description="使用Bocha Web Search API进行网络搜索"
)
# 初始化OpenAI语言模型
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
openai_api_key=OPENAI_API_KEY
)
# 初始化代理,设置Agent自动决定何时调用工具
tools = [bocha_tool] # 包含你定义的Bocha Web Search工具
agent = initialize_agent(
tools=tools,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
llm=llm,
verbose=False
)
# 测试用例
query = "阿里巴巴2024年的ESG报告主要讲了哪些内容?"
response = agent.run(f"请帮我搜索以下内容:{query}")
print(response)
回答结果
阿里巴巴2024年ESG报告主要讲述了以下内容:在环境保护方面,阿里巴巴实现了自身运营碳排放和价值链碳排放强度的“双降”目标,自身运营减排量达到232.0万吨,清洁电力使用比例达到39.0%。报告强调了科技创新在推动绿色低碳高质量发展中的作用,并提到阿里巴巴在社会责任方面的努力,包括支持中小微企业、促进包容性就业和推动乡村振兴。此外,阿里巴巴还深化了ESG治理架构,确保决策透明性和风险管理。整体而言,报告展示了阿里巴巴在ESG领域的领导地位及其为建设可持续未来所做的努力。
详细 Trace
将 Agent 调用时的 verbose 参数设置为 True,可以看到详细的思考过程:
agent = initialize_agent(
tools=tools,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
llm=llm,
verbose=True # 这里设置为 True
)