文档

PAI+向量检索快速搭建大模型知识库对话

更新时间:

您可以使用向量检索库进行企业专属知识库的检索,并使用EAS进行AI语言大模型推理。同时,EAS还支持通过开源框架LangChain将两者有机结合,无缝集成到您的业务服务中,以获得更好的推理效果。文本为您介绍使用PAI和向量检索搭建大模型知识库对话的具体操作步骤。

背景信息

LangChain是一个开源框架,使得AI开发人员能够将像通义千问这样的大语言模型(LLM)和外部数据结合起来,从而在尽量节约计算资源的前提下,获得更好的性能和效果。通过LangChain,将输入的用户知识文件进行自然语言处理后存储在向量数据库中。每次推理时,LangChain会首先在知识库中查找与用户输入问题相近的答案,然后将这些知识库答案与用户输入一起输入到EAS的大模型服务中,以生成基于知识库的定制答案。同时,LangChain支持用户自定义Prompt,并在对话过程中提供基于LLM和向量检索的多轮对话功能。

前提条件

步骤一:准备向量检索库

您可以选择以下任意一种产品构建本地向量库:

其中,Faiss无需开通或购买即可使用,Hologres、AnalyticDB for PostgreSQL和ElasticSearch需要开通并准备相应的WebUI界面配置参数。后续您可以使用准备好的参数连接向量检索库。

Hologres

  1. 开通Hologres实例并创建数据库。具体操作,请参见购买Hologres。您需要将已创建的数据库名称保存到本地。

  2. 在实例详情页面查看调用信息。

    1. 单击实例名称,进入实例详情页面。

    2. 网络信息区域,单击指定VPC后的复制,将域名:80前面的内容保存到本地。

  3. 切换到账号管理Tab页,创建自定义用户。并将账号和密码保存到本地,后续用于连接Hologres实例。具体操作,请参见创建自定义用户

    其中:选择成员角色选择实例超级管理员(SuperUser)

AnalyticDB for PostgreSQL

  1. AnalyticDB for PostgreSQL版控制台上创建实例。具体操作,请参见创建实例

    其中:向量引擎优化选择开启

  2. 单击实例名称,进入基本信息页面,在该页面中的数据库连接信息区域,复制内网地址和外网地址并保存到本地。

    说明
    • 如果没有外网地址,您需要单击申请外网地址来获取。具体操作,请参见管理外网地址

    • 如果在同一个VPC内连接实例,只需使用内网地址。

  3. 创建数据库账号,并将数据库账号和密码保存到本地,后续用于连接数据库。具体操作,请参见创建数据库账号

  4. 配置白名单为可信来源IP。具体操作,请参见设置白名单

ElasticSearch

  1. 创建阿里云Elasticsearch实例。具体操作,请参见创建阿里云Elasticsearch实例

    其中:

    • 选择服务选择通用商业版

    • 场景初始化配置选择通用场景

    • 您需要将网络及系统配置向导页面配置的登录名登录密码保存到本地。

  2. 单击实例名称,进入实例基本信息页面。在该页面获取私网地址私网端口并保存到本地。

Faiss

使用Faiss构建本地向量库,无需购买线上向量库产品,免去了线上开通向量库产品的复杂流程,更轻量易用。

步骤二:使用EAS部署LLM大模型推理服务

  1. 进入PAI-EAS 模型在线服务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署>模型在线服务(EAS),进入PAI-EAS 模型在线服务页面。image.png

  2. PAI-EAS 模型在线服务页面,单击部署服务,在弹出对话框中,选择自定义部署,然后单击确定

  3. 部署服务页面,配置以下关键参数。

    参数

    描述

    服务名称

    自定义服务名称。

    部署方式

    选择镜像部署AI-Web应用

    镜像选择

    PAI平台镜像列表中选择chat-llm-webui;镜像版本选择2.0

    说明

    由于版本迭代迅速,部署时镜像版本选择最高版本即可。

    运行命令

    不同的模型类型对应的运行命令如下:

    • 使用chatglm2-6b模型进行部署:python webui/webui_server.py --port=8000 --model-path=THUDM/chatglm2-6b

    • 使用通义千问-7b模型进行部署:python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat

    • 使用llama2-7b模型进行部署:python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-7b-chat-hf

    • 使用Llama2-13b模型进行部署:python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-13b-chat-hf --precision=fp16

    端口号配置为:8000。

    资源组种类

    选择公共资源组

    资源配置方法

    选择常规资源配置

    资源配置选择

    必须选择GPU类型,实例规格推荐使用ml.gu7i.c16m60.1-gu30(性价比最高);

    若您选择使用Llama2-13b模型,实例规格推荐使用ecs.gn6e-c12g1.3xlarge

    专有网络配置

    • 当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。

    • 当选择Faiss作为向量检索库时,请随意选择一个专有网络。

  4. 单击部署,等待一段时间即可完成模型部署。

    服务状态运行中时,表明服务部署成功。

  5. 获取VPC地址调用的服务访问地址和Token。

    1. 单击服务名称,进入服务详情页面。

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

    3. 调用信息对话框的VPC地址调用页签,获取服务访问地址和Token,并保存到本地。

步骤三:部署LangChain服务并启动WebUI

PAI提供了最方便快捷的部署方式,您可以直接在EAS中选择指定的镜像即可部署LangChain的WebUI服务。更多关于LangChain的详细内容,请参见GitHub开源代码

  1. PAI-EAS 模型在线服务页面,单击部署服务,在弹出对话框中,选择自定义部署,然后单击确定

  2. 部署服务页面,配置以下关键参数。

    参数

    描述

    服务名称

    自定义服务名称。本案例使用的示例值为:chatbot_langchain_vpc

    部署方式

    选择镜像部署AI-Web应用

    镜像选择

    PAI平台镜像列表中选择chatbot-langchain,镜像版本选择1.0

    由于版本迭代迅速,部署时镜像版本选择最高版本即可。

    运行命令

    • 服务运行命令:uvicorn webui:app --host 0.0.0.0 --port 8000

    • 端口号输入:8000

    资源组种类

    选择公共资源组

    资源配置方法

    • 实例规格选择CPU>ecs.c7.4xlarge

    • 额外系统盘:60G

    专有网络配置

    • 当选择Hologres、AnalyticDB for PostgreSQL或ElasticSearch作为向量检索库时,请确保所配置的专有网络与选定的向量检索库保持一致。

    • 当选择Faiss作为向量检索库时,与LLM大模型推理服务配置的专有网络保持一致。

  3. 单击部署,等待一段时间即可完成模型部署。

    服务状态运行中时,表明服务部署成功。

  4. 服务部署成功后,单击服务方式列下的查看Web应用,进入WebUI页面。

步骤四:使用LangChain串联业务数据进行知识问答

配置WebUI界面参数

  1. 在WebUI页面的Settings选项卡中,根据选择的向量检索库配置相关参数。

    • Emebdding Model:支持选择4种embedding model和对应的维度(Emebdding Dimension)。推荐使用SGPT-125M-weightedmean-nli-bitfit。

    • Emebdding Dimension:选择Emebdding Model后,系统会自动进行配置,无需手动操作。

    • EAS Url:配置为步骤二中获取的服务访问地址。

    • EAS Token:配置为步骤二中获取的服务Token。

    • 配置Vector Store。不同的向量检索库对应的参数配置详情如下:

      Hologres

      • Host:配置为步骤一中查询到的Hologres调用信息。

      • Database:配置为步骤一中创建的数据库名称。

      • User:配置为步骤一中创建的自定义用户的账号。

      • Password:配置为步骤一中创建的自定义用户的密码。

      以上参数配置完成后,单击Connect Hologres,验证Hologres实例是否连接正常。

      AnalyticDB

      • Host:配置为步骤一中获取的数据库连接外网地址。

        说明

        如果在同一个VPC内连接实例,只需使用内网地址。

      • User:配置为步骤一中创建的数据库账号。

      • Database:配置为数据库名称。您可以登录数据库后进行查看,如何登录数据库,请参见登录数据库image.png

      • Password:配置为步骤一中创建的数据库密码。

      • Pre_delete:是否删除已存在的Database。取值为:True(删除)、False(不删除)。

      ElasticSearch

      • URL:配置为步骤一中获取的私网地址和端口,格式为:http://私网地址:端口

      • Index:用户自定义的索引名称。

      • User:配置为步骤一中创建ElasticSearch实例时配置的登录名。

      • Password:配置为步骤一中创建ElasticSearch实例时配置的登录密码。

      以上参数配置完成后,单击Connect ElasticSearch,验证ElasticSearch实例是否连接正常。

      Faiss

      • Path:用户自定义的数据库文件夹名称。例如faiss_path

      • Index:用户自定义的索引文件夹名称。例如faiss_index

    此外,您还可以直接在WebUI页面的Settings选项卡中上传配置文件,并单击Parse config来解析配置文件。解析成功后,WebUI页面将自动根据配置文件内容填写相应的界面参数。不同的向量检索库对应的配置文件内容如下:

    Hologres

    {
      "embedding": {
        "model_dir": "embedding_model/",
        "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
        "embedding_dimension": 768
      },
    
      "EASCfg": {
        "url": "http://xx.vpc.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
        "token": "xxxxxxx=="
      },
    
      "vector_store": "Hologres",
    
      "HOLOCfg": {
        "PG_HOST": "hgpostcn-cn.xxxxxx.vpc.hologres.aliyuncs.com",
        "PG_PORT": "80",
        "PG_DATABASE": "langchain",
        "PG_USER": "user",
        "PG_PASSWORD": "password"
      }
    }

    其中:EASCfg即为LLM大模型的服务访问地址和Token。HOLOCfg即为Hologres的相关配置。您可以参考WebUI界面参数说明进行配置。

    AnalyticDB

    {
      "embedding": {
        "model_dir": "embedding_model/",
        "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
        "embedding_dimension": 768
      },
    
      "EASCfg": {
        "url": "http://xx.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
        "token": "xxxxxxx=="
      },
    
      "vector_store": "AnalyticDB",
    
      "ADBCfg": {
        "PG_HOST": "gp.xxxxx.rds.aliyuncs.com",
        "PG_USER": "xxxxxxx", 
        "PG_DATABASE": "xxxxxxx", 
        "PG_PASSWORD": "passwordxxxx"
      }
    }

    其中:EASCfg即为LLM大模型的服务访问地址和Token。ADBCfg即为AnalyticDB for PostgreSQL的相关配置。您可以参考WebUI界面参数说明进行配置。

    ElasticSearch

    {
      "embedding": {
        "model_dir": "embedding_model/",
        "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
        "embedding_dimension": 768
      },
    
      "EASCfg": {
        "url": "http://xx.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
        "token": "xxxxxxx=="
      },
    
      "vector_store": "ElasticSearch",
    
      "ElasticSearchCfg": {
        "ES_URL": "http://es-cn-xxx.elasticsearch.aliyuncs.com:9200",
        "ES_USER": "elastic",
        "ES_PASSWORD": "password",
        "ES_INDEX": "test_index"
      }
    }

    其中:EASCfg即为LLM大模型的服务访问地址和Token。ElasticSearchCfg即为ElasticSearch的相关配置。您可以参考WebUI界面参数说明进行配置。

    Faiss

    {
      "embedding": {
        "model_dir": "embedding_model/",
        "embedding_model": "SGPT-125M-weightedmean-nli-bitfit",
        "embedding_dimension": 768
      },
    
      "EASCfg": {
        "url": "http://xx.vpc.pai-eas.aliyuncs.com/api/predict/chatllm_demo_glm2",
        "token": "xxxxxxx=="
      },
    
      "vector_store": "FAISS",
    
      "FAISS": {
        "index_path": "faiss_index",
        "index_name": "faiss_file"
      }
    }

    其中:EASCfg即为在步骤二中获取的LLM大模型的服务访问地址和Token。index_path为用户自定义的索引文件夹名称。index_name为用户自定义的数据库文件夹名称。

  2. 切换到WebUI页面的Upload选项卡中,在该页面上传用户知识库文档,并配置以下参数。image.png

    • Chunk Size:指定每个分块的大小,默认200,单位为字节。

    • Chunk Overlap:相邻分块之间的重叠量,默认为0。

    • Files:参考界面操作指引上传知识库文档,然后单击Upload。支持多文件上传,文件格式为:TXTDOCSPDF

    • Directory:参考界面操作指引上传包含知识库文档的目录,然后单击Upload

  3. 切换到WebUI页面的Chat选项卡,进行知识问答。

    • 支持三种问答方式:

      • Vector Store:直接从向量数据库中检索并返回TopK条相似结果。

      • LLM:直接与EAS-LLM对话,返回大模型的回答。

      • Vector Store+LLM:将检索返回的结果与用户的问题组装成可自定义的Prompt,送入EAS-LLM服务,从中获取问答结果。

    • Retrieval top K answers:设置向量检索库返回的相似结果条数,默认为3。

    • Please choose the prompt template type:参考界面提示,选择合适的prompt模板。

推理效果演示

以Hologres为例,为您演示推理效果。其他几种向量检索库的使用方式与Hologres相同。

  1. 参考配置WebUI界面参数章节,在Settings选项卡中配置如下图所示的参数,并测试连接是否正常。image.png

  2. 切换到Upload选项卡中,按照界面操作指引上传知识库文件,然后单击Uploadimage.png

    上传成功后,您可以在Hologres中查看写入的数据和向量等信息。具体操作,请参见image.png

  3. 切换到Chat选项卡中,选择不同的查询方式,推理效果如下。

    VectorStoreimage.png

    LLM

    image.png

    Vector Store + LLM

    image.png

API调用

  1. 获取LangChain WebUI服务的调用信息。

    1. 单击步骤三部署的LangChain WebUI服务名称,进入服务详情页面。

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

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

  2. API调用服务。以Hologres为例来说明调用过程。

    1. 上传config_holo.json建立服务连接。

      curl命令

      请根据WebUI界面参数的配置准备好config_holo.json配置文件,并在config_holo.json所在的当前目录执行以下命令。

      curl -X 'POST' '<service_url>config' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: multipart/form-data'  -F 'file=@config_es.json'

      其中:<service_url>替换为步骤1获取的服务访问地址;<service_token>替换为步骤1获取的服务Token。

      Python脚本

      请根据WebUI界面参数的配置准备好config_holo.json配置文件,并在config_holo.json所在的当前目录执行以下脚本。

      import requests
      
      EAS_URL = 'http://chatbot-langchain.xx.cn-beijing.pai-eas.aliyuncs.com'
      
      
      def test_post_api_config():
          url = EAS_URL + '/config'
          headers = {
              'Authorization': 'xxxxx==',
          }
          files = {'file': (open('config_es.json', 'rb'))}
          response = requests.post(url, headers=headers, files=files)
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = response.json()
          return ans['response']
      print(test_post_api_config())

      其中:EAS_URL配置为步骤1获取的服务访问地址;Authorization配置为步骤1获取的服务Token。

    2. 上传本地知识库文件。

      Curl命令

      准备好知识库文件,格式为TXTDOCSPDF,例如PAI.txt。然后在知识库文件所在的当前目录执行以下命令。

      curl -X 'POST' '<service_url>uploadfile' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: multipart/form-data'  -F 'file=@PAI.txt;type=text/plain'

      其中:<service_url>替换为步骤1获取的服务访问地址;<service_token>替换为步骤1获取的服务Token。

      Python脚本

      准备好知识库文件,格式为TXTDOCSPDF,例如PAI.txt。然后在知识库文件所在的当前目录执行以下命令。

      import requests
      
      EAS_URL = 'http://chatbot-langchain.xx.cn-beijing.pai-eas.aliyuncs.com'
      
      
      def test_post_api_uploafile():
          url = EAS_URL + '/uploadfile'
          headers = {
              'Authorization': 'xxxxx==',
          }
          files = {'file': (open('PAI.txt', 'rb'))}
          response = requests.post(url, headers=headers, files=files)
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = response.json()
          return ans['response']
      print(test_post_api_uploafile())
      # success
      

      其中:EAS_URL配置为步骤1获取的服务访问地址;Authorization配置为步骤1获取的服务Token。

    3. 使用chat/vectorstorechat/llmchat/langchain三种问答方式进行知识问答。

      curl 命令

      方式一:chat/vectorstore

      curl -X 'POST'  '<service_url>chat/vectorstore' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什么是机器学习PAI?"}'

      方式二:chat/llm

      curl -X 'POST'  '<service_url>chat/llm' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什么是机器学习PAI?"}'

      方式三:chat/langchain

      curl -X 'POST'  '<service_url>chat/langchain' -H 'Authorization: <service_token>' -H 'accept: application/json'  -H 'Content-Type: application/json'  -d '{"question": "什么是机器学习PAI?"}'

      其中:<service_url>替换为步骤1获取的服务访问地址;<service_token>替换为步骤1获取的服务Token。

      Python脚本

      import requests
      
      EAS_URL = 'http://chatbot-langchain.xx.cn-beijing.pai-eas.aliyuncs.com'
      
      
      def test_post_api_chat():
          url = EAS_URL + '/chat/vectorstore'
          # url = EAS_URL + '/chat/llm'
          # url = EAS_URL + '/chat/langchain'
          headers = {
              'accept': 'application/json',
              'Content-Type': 'application/json',
              'Authorization': 'xxxxx==',
          }
          data = {
              'question': '什么是机器学习PAI?'
          }
          response = requests.post(url, headers=headers, json=data)
      
          if response.status_code != 200:
              raise ValueError(f'Error post to {url}, code: {response.status_code}')
          ans = response.json()
          return ans['response']
      print(test_post_api_chat())

      其中:EAS_URL配置为步骤1获取的服务访问地址;Authorization配置为步骤1获取的服务Token。

      相关文档

  • 本页导读 (1)
文档反馈