3.2 阿里搜索引擎的使用(智能体工程)
智能体工程驱动AI Agent开发(人工智能技术丛书)【行情 报价 价格 评测】-京东
《智能体工程驱动AI Agent开发》1~6章试读-持续更新-CSDN博客
前面我们使用Qwen大模型完成了基础模型的构建构建,并在其基础上借助 Loop 循环,实现了流式交互与并发工具调用的落地实践。但在之前的演示中,我们采用的是虚拟工具模拟调用流程,仅用于验证工具调用的逻辑闭环,并未对接真实的网络服务,难以满足实际开发需求。
生态以阿里搜索为核心载体,涵盖 AI 服务、地图服务、数据服务、开发工具等多个领域,所有工具均支持普通用户免费试用,接口规范、稳定性强,完美适配我们之前搭建的大模型工具调用框架,无需大幅修改代码,即可替换虚拟工具实现真实功能调用。其核心优势在于 “免费易用、生态联动、无缝衔接”,既能满足初学者的学习实践需求,也能支撑简单商业场景的快速落地,无需担心接口费用和技术门槛。
3.2.1 阿里搜索引擎的开通
我们首先需要通过阿里云百炼的控制台,登录“AI搜索开发平台”的“服务广场”,之后点击“立即开通”开通服务(详情参看配套资源中的相关文档),如图3-3所示。

图3-3 联网搜索服务
我们点击“联网搜索服务(web-search)”下方的“查看详情”,打开“服务详情”页面如图3-4所示,点击右边的“查看文档”链接,打开页面如图3-5所示。

图3-4 “服务详情”页面

图3-5 “服务详情”页面
图3-5所示页面右侧可以获取Curl请求示例,部分主函数如下所示:
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 您的API-KEY" \
"http://xxxx-hangzhou.opensearch.aliyuncs.com/v3/openapi/workspaces/default/web-search/ops-web-search-001" \
-d '{
"history": [
{"role": "system", "content": "你是一个机器人助手"},
{"role": "user", "content": "浙江的省会是哪里"},
{"role": "assistant", "content": "杭州"}
],
"query":"杭州今日天气怎么样",
"query_rewrite":true,
"top_k":5,
"content_type":"snippet"
}'
我们还需要获取待使用的公网域名以及对应的API Key,如图3-6所示。

图3-7 API Keys页面
下面我们需要创建API Key,并同时记录对应的域名,如图3-8所示。

图3-8 获取到的域名与API Key
我们可以使用页面上提供的公网API域名,读者可以自行保存这个域名。
3.2.2 阿里搜索引擎的实现与使用
下面我们结合阿里云AI搜索开放平台完成阿里搜索引擎的实现与使用,代码如下所示:
import httpx
# ==================== 配置区(在 AI搜索开放平台控制台「API Keys」页面获取) ========
from model_config import ModelConfig
_cfg = ModelConfig.get("ali_search")
# 所有凭据 / 域名由 ModelConfig 单一来源提供 —— 这里不再保留任何默认值
_API_KEY = _cfg["api_key"]
_HOST = _cfg["host"]
_WORKSPACE_NAME = _cfg["workspace"]
_SERVICE_ID = _cfg["service_id"] # noqa: F841 保留供外部模块导入
SEARCH_URL = f"https://{_HOST}/v3/openapi/workspaces/{_WORKSPACE_NAME}/ web-search/{_SERVICE_ID}"
def ali_search(query: str, top_k: int = 5, content_type: str = "snippet") -> str:
"""阿里云 AI搜索开放平台 联网搜索工具
参数:
query: 搜索词
top_k: 搜索返回结果数(默认 5)
content_type: 搜索结果内容类型(snippet 摘要 / summary 文本摘要 / mainText 正文)
返回:搜索结果字符串
"""
# 请求头:API-KEY 认证
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
# 请求体:query 必填,其余为可选参数
payload = {
"query": query,
"query_rewrite": True, # 是否启用 LLM 对 query 进行重写
"top_k": top_k, # 返回结果数
"content_type": content_type, # 结果内容类型
}
try:
resp = httpx.post(SEARCH_URL, headers=headers, json=payload, timeout=30)
result = resp.json()
# 接口报错时(响应体含 code/message 字段,如 InvalidParameter)
if "code" in result:
return f"搜索失败:{result.get('message', result.get('code'))}"
# 正常响应:result.search_result 为结果列表
search_result = result.get("result", {}).get("search_result", [])
if not search_result:
return f"未找到「{query}」相关结果"
res = [f"🔍 {query} 搜索结果:"]
for i, item in enumerate(search_result, 1):
title = item.get("title", "无标题")
link = item.get("link", "")
snippet = item.get("snippet", "")
res.append(f"\n{i}. {title}\n 链接:{link}\n 摘要:{snippet}")
return "\n".join(res)
except Exception as e:
return f"搜索失败:{str(e)}"
# 测试
if __name__ == "__main__":
print(ali_search("北京今日天气怎么样"))
输出结果读者可以自行尝试学习。


更多推荐
所有评论(0)