RAG集成联网搜索搭建AI智能问答最佳实践

本文为您介绍如何在大模型RAG对话系统中集成网络搜索功能,通过网络搜索获取内容,并将搜索结果传递给大语言模型进行推理,从而轻松搭建一个具备联网搜索能力的AI智能问答系统,提升用户体验和信息检索的准确性。

前提条件

已部署RAG服务,其中关键配置说明如下,具体操作,请参见大模型RAG对话系统

  • 版本选择:选择LLM一体化部署。如果您已单独部署大语言模型LLM服务,也可以选择LLM分离式部署,并在RAG服务的WebUI页面完成LLM相关配置。

  • RAG版本:选择pai-rag:0.3.4

  • 模型类别:根据您的需求进行选择。

  • 专有网络:EAS服务默认无法访问公网,若使用联网搜索功能,需配置能访问公网的专有网络,详情请参见EAS服务访问公网

步骤一:为RAG服务配置网络搜索

开通网络搜索服务

本文将以阿里云通用搜索服务和Bing搜索为例进行说明,您可以根据需求任选其一进行开通。

阿里云通用搜索服务

按照以下流程开通阿里云通用搜索服务:

  1. 单击官网申请开通链接,按照界面操作指引开通信息查询服务-通用搜索功能。

    申请开通后,系统将自动开通免费测试接口,5分钟后可试用。默认限额为:5 QPS、1000次调用/天、15天有效期。您可以前往信息查询服务控制台查看服务开通情况,如下图所示,表明测试接口已开通。更多关于通用搜索产品的测试开通、正式开通流程说明,请参见联网搜索开通说明image

  2. 创建RAM用户及其AccessKey。

    创建RAM用户并授权

    RAM用户创建AccessKey

Bing搜索

请单击azure链接,并按照界面操作指引申请Bing API Key。Bing搜索提供免费版和付费版,请根据需要选择合适的版本。

配置网络搜索

模型在线服务(EAS)页面,单击目标服务调用/日志/监控列的image按钮,进入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

    image

  • 配置Bing搜索

    重要

    请确保RAG服务已绑定具有公网访问能力的专有网络,详情请参见网络配置

    参数

    描述

    搜索引擎

    选择bing

    Bing API Key

    配置为已申请的API Key。

    image

步骤二:WebUI页面调试

配置搜索引擎后,在WebUI页面的对话页签中进行问答测试。当返回结果无误后,您可以参考步骤三:API调用进行标准化调用。image

步骤三:API调用

PAI-RAG服务已兼容OpenAI接口协议,您可以按照下列方式进行标准化调用。

获取RAG服务调用信息

  1. 模型在线服务(EAS)页面,单击RAG服务名称,进入概览页面。

  2. 基本信息区域,单击查看调用信息

  3. 调用信息对话框,获取服务访问地址和Token。

    说明

    您可以选择使用公网地址或VPC内网地址:

    • 使用公网调用地址:调用客户端需支持访问公网。

    • 使用VPC调用地址:调用客户端必须与RAG服务位于同一个专有网络内。

HTTP调用

调用方式

调用方式

调用地址

<EAS_URL>/v1/chat/completions

请求方式

POST

请求HEADERS

Authorization: EAS_TOKEN(EAS调用Token)

HTTP Body

{
    "model": "default",
    "messages": [
        {"role": "user","content": "你好"},
        {"role": "assistant","content": "你好,有什么能帮到您?"},
        {"role": "user", "content": "浙江省会是哪里"},
        {"role": "assistant", "content": "杭州是浙江的省会。"},
        {"role": "user","content": "有哪些好玩的"}
    ],
    "stream": true,
    "search_web": true,
    "index_name": "default_index"
}

其中:

  • model:模型名称,默认为default。

  • stream:配置为true,表示使用流式输出。

  • index_name:索引名称,如果不传将使用默认索引default_index。具体使用方法,请参见如何使用RAG服务进行知识库数据隔离?

  • search_web:模型在生成文本时是否会参考互联网搜索结果。取值如下:

    • True:启用互联网搜索,模型会将搜索结果作为文本生成过程中的参考信息,但模型会基于其内部逻辑判断是否使用互联网搜索结果。如果模型没有进行互联网搜索,建议优化Prompt。此外,启用互联网搜索功能可能会增加Token的消耗。

    • False(默认值):关闭互联网搜索,搜索本地知识库。

  • messages:历史对话信息和当前查询内容。

调用方法

支持以下几种调用方法:

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。

在线调试

  1. 模型在线服务(EAS)页面,单击RAG服务操作列下的在线调试,进入在线调试页面。

  2. 在调试页面的在线调试请求参数区域的Body处填写已准备好的请求体。并在请求URL文本编辑框中添加/v1/chat/completionsimage

  3. 单击发送请求

Postman

  • 按照下图示例发送服务请求

    请求方式选择POST,并输入请求地址<EAS_URL>/v1/chat/completions和请求体,其中<EAS_URL>需替换为RAG服务访问地址。示例如下:image

  • 返回示例

    • 流式输出image

    • 非流式输出image

返回格式

非流式输出

示例结果如下:

{
    "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

模型在生成文本时是否会参考互联网搜索结果。取值如下:

  • True:启用互联网搜索,模型会将搜索结果作为文本生成过程中的参考信息,但模型会基于其内部逻辑判断是否使用互联网搜索结果。如果模型没有进行互联网搜索,建议优化Prompt。此外,启用互联网搜索功能可能会增加Token的消耗。

  • False(默认值):关闭互联网搜索。