本文为您介绍如何在大模型RAG对话系统中集成网络搜索功能,通过网络搜索获取内容,并将搜索结果传递给大语言模型进行推理,从而轻松搭建一个具备联网搜索能力的AI智能问答系统,提升用户体验和信息检索的准确性。
前提条件
已部署RAG服务,其中关键配置说明如下,具体操作,请参见大模型RAG对话系统。
版本选择:选择LLM一体化部署。如果您已单独部署大语言模型LLM服务,也可以选择LLM分离式部署,并在RAG服务的WebUI页面完成LLM相关配置。
RAG版本:选择pai-rag:0.3.4。
模型类别:根据您的需求进行选择。
专有网络:EAS服务默认无法访问公网,若使用联网搜索功能,需配置能访问公网的专有网络,详情请参见让EAS服务访问公网。
步骤一:为RAG服务配置网络搜索
开通网络搜索服务
本文将以阿里云通用搜索服务和Bing搜索为例进行说明,您可以根据需求任选其一进行开通。
阿里云通用搜索服务
按照以下流程开通阿里云通用搜索服务:
Bing搜索
请单击azure链接,并按照界面操作指引申请Bing API Key。Bing搜索提供免费版和付费版,请根据需要选择合适的版本。
配置网络搜索
在模型在线服务(EAS)页面,单击目标服务调用/日志/监控列的按钮,进入WebUI页面。然后在WebUI页面的应用页签中的联网搜索Tab页,配置搜索引擎。
配置阿里云通用搜索服务
参数
描述
搜索引擎
选择aliyun。
搜索数量
当QPS限制为1时,搜索数量的最大值不能超过10。
Endpoint
支持通过公网(
iqs.cn-zhangjiakou.aliyuncs.com
)发起调用:请确保RAG服务已绑定具有公网访问能力的专有网络,详情请参见网络配置。以下地域也支持通过阿里云VPC地址发起调用:
华北2(北京):
iqs-vpc.cn-beijing.aliyuncs.com
华东2(上海):
iqs-vpc.cn-shanghai.aliyuncs.com
华北3(张家口):
iqs-vpc.cn-zhangjiakou.aliyuncs.com
Access Key ID
请填写已获取的AccessKey。
Access Key Secret
配置Bing搜索
重要请确保RAG服务已绑定具有公网访问能力的专有网络,详情请参见网络配置。
参数
描述
搜索引擎
选择bing。
Bing API Key
配置为已申请的API Key。
步骤二:WebUI页面调试
配置搜索引擎后,在WebUI页面的对话页签中进行问答测试。当返回结果无误后,您可以参考步骤三:API调用进行标准化调用。
步骤三:API调用
PAI-RAG服务已兼容OpenAI接口协议,您可以按照下列方式进行标准化调用。
获取RAG服务调用信息
在模型在线服务(EAS)页面,单击RAG服务名称,进入概览页面。
在基本信息区域,单击查看调用信息。
在调用信息对话框,获取服务访问地址和Token。
说明您可以选择使用公网地址或VPC内网地址:
使用公网调用地址:调用客户端需支持访问公网。
使用VPC调用地址:调用客户端必须与RAG服务位于同一个专有网络内。
HTTP调用
调用方式
调用方式 | |
调用地址 |
|
请求方式 | POST |
请求HEADERS |
|
HTTP Body |
其中:
|
调用方法
支持以下几种调用方法:
cURL
示例代码如下:
curl -X POST <EAS_URL>/v1/chat/completions -H 'Authorization: <EAS_TOKEN>' -H 'Content-Type: application/json' -d '{"model": "default", "search_web": true, "index_name": "default_index", "messages": [{"role": "user","content": "你好"}, {"role": "assistant","content": "你好,有什么能帮到您?"}, {"role": "user", "content": "浙江省会是哪里"}, {"role": "assistant", "content": "杭州是浙江的省会。"}, {"role": "user","content": "有哪些好玩的"}], "stream": false}'
其中:
<EAS_URL>:替换为RAG服务访问地址。
<EAS_TOKEN>:替换为RAG服务Token。
在线调试
在模型在线服务(EAS)页面,单击RAG服务操作列下的在线调试,进入在线调试页面。
在调试页面的在线调试请求参数区域的Body处填写已准备好的请求体。并在请求URL文本编辑框中添加
/v1/chat/completions
。单击发送请求。
Postman
按照下图示例发送服务请求
请求方式选择POST,并输入请求地址
<EAS_URL>/v1/chat/completions
和请求体,其中<EAS_URL>需替换为RAG服务访问地址。示例如下:返回示例
流式输出
非流式输出
返回格式
非流式输出
示例结果如下:
{
"id": "8df97a998f29485fb6b8f0fa1d65****",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "杭州有很多好玩的地方,以下是一些推荐的景点:\n\n1. **西湖** - 首批国家5A级旅游景区,中国十大风景名胜之一,以自然与人文景观著称。\n2. **西溪国家湿地公园** - 适合亲近自然,感受湿地的魅力。\n3. **灵隐寺** - 杭州最古老的寺庙之一,具有深厚的文化底蕴。\n4. **六和塔** - 杭州的标志性建筑之一,可以登塔俯瞰江景。\n5. **宋城** - 可以体验宋朝的历史文化。\n6. **雷峰塔** - “雷峰夕照”是杭州一大美景,可以欣赏夕阳下的西湖。\n7. **湘湖** - 湖光山色、古桥流水,适合休闲活动。\n8. **钱塘江大桥** - 不仅实用,还是观赏钱塘江壮丽景色的好地方。\n9. **京杭大运河** - 体验古代水运文化的绝佳地点。\n10. **太子湾公园** - 自然与人文景观结合的美丽公园。\n\n此外,还有其他一些免费景点也非常值得一去,比如杭州植物园、法喜寺、胡雪岩故居等。",
"refusal": null,
"role": "assistant",
"audio": null,
"function_call": null,
"tool_calls": null
}
}
],
"created": 1739450868,
"model": "qwen-turbo",
"object": "chat.completion",
"service_tier": null,
"system_fingerprint": null,
"usage": {
"completion_tokens": 0,
"prompt_tokens": 0,
"total_tokens": 0,
"completion_tokens_details": null,
"prompt_tokens_details": null
}
}
流式输出
SSE格式,示例结果如下:
{
"id": "7eb65e8cbc62428ca7ae22782addc****",
"choices": [
{
"delta": {
"content": "坊",
"function_call": null,
"refusal": null,
"role": "assistant",
"tool_calls": null
},
"finish_reason": null,
"index": 240,
"logprobs": null
}
],
"created": 1739451105,
"model": "DeepSeek-R1-Distill-Qwen-32B",
"object": "chat.completion.chunk",
"service_tier": null,
"system_fingerprint": null,
"usage": null
}
Python SDK调用
在本地终端中执行Python代码调用服务,代码示例如下:
from openai import OpenAI
##### API 配置 #####
openai_api_key = "EAS_TOKEN"
openai_api_base = "EAS_URL/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
#### Chat ####
def chat():
stream = True
chat_completion = client.chat.completions.create(
model="default",
stream=stream,
messages=[
{"role": "user","content": "你好"},
{"role": "assistant","content": "你好,有什么能帮到您?"},
{"role": "user", "content": "浙江省会是哪里"},
{"role": "assistant", "content": "杭州是浙江的省会。"},
{"role": "user","content": "有哪些好玩的"}
],
extra_body={
"search_web": True,
}
)
if stream:
for chunk in chat_completion:
print(chunk.choices[0].delta.content, end="")
else:
result = chat_completion.choices[0].message.content
print(result)
chat()
其中关键配置说明如下:
参数 | 描述 | |
openai_api_key | 将EAS_TOKEN替换为RAG服务的Token。 | |
openai_api_base | 将EAS_URL替换为RAG服务的访问地址。 | |
extra_body | search_web | 模型在生成文本时是否会参考互联网搜索结果。取值如下:
|