背景信息
大模型可以广泛应用于各行各业。使用大模型定制聊天机器人,除了训练大模型的方式外,还可以使用提示词微调(Prompt-tuning)的方法,在提问时提供特定行业的相关语料,结合大模型的阅读理解和信息整合能力,对该垂直行业的问题提供更贴切的回答。
Hologres是一站式实时数仓引擎,与达摩院自研高性能向量计算软件库Proxima深度整合,支持高效、易用的向量计算能力,详情请参见Proxima向量计算。
可以将Hologres作为向量实时存储和检索引擎,把定制语料作为向量存储并输出给大模型,最终实现定制聊天机器人的快速搭建。
前提条件
- 已有大模型:本文适用于各种大模型。
- 已开通Hologres实例:您可以使用Hologres免费试用实例,0元搭建向量数据库,详情请参见新用户免费试用。
说明
建议使用Hologres 8CU规格,免费试用实例处理的向量数据规模为百万级。如有更大规模向量数据,请使用更大规格实例。 - 已安装Anaconda,详情请参见Anaconda。
实践步骤
- 环境准备。
- 使用Anaconda环境运行如下命令安装相关依赖:
conda create--name chatbot python=3.8conda activate chatbot pip install langchain psycopg2-binary torch transformers modelscope bottle pip install <大模型相关依赖>
- 准备大模型:本文以支持通过API访问的大模型为例,您需要准备大模型API访问密钥。
- 单击代码与样例数据或运行如下命令克隆本文所需代码与样例数据:说明
- 如果通过下载链接下载的代码与样例数据,使用前请进行解压。
- 如果使用如下代码克隆代码与样例数据,请在使用前下载Git。
git clone https://github.com/aliyun/alibabacloud-hologres-connectors.git
- 大模型试用。先试用原生大模型,针对部分Hologres相关的专业问题进行问答。
- 在
holo-chatbot/chatbot.py
代码的main
函数(107行)中,修改chat_model_name
为您想使用的大模型,示例代码如下:
说明
您可以使用任意LangChain支持的大模型,详见LangChain chat models,也可以为其他大模型实现相应的接口后进行调用。
# 选择大模型 from langchain.chat_models import <chat_model_name>chat_model =<chat_model_name>(<api_key>='xxx',<api_base>='xxx', temperature=0.1)bot = Chatbot(chat_model, args.clear, args.no_vector_store)
- 使用如下命令进入大模型:
说明
首次使用会自动下载Embedding模型(约400 MB),需要较长时间,第二次调用则不需要此过程。
# 切换目录至代码所在目录 cd alibabacloud-hologres-connectors/holo-chatbot # 运行如下命令打开设置向导,各个设置项按回车跳过即可 python generate_config.py# -n --no-vector-store: 不通过Hologres向量检索,直接调用大模型进行问答python chatbot.py-n
- 提问问题及大模型对应回答如下:
Human: 什么是Hologres? Chatbot: Hologres是一个分析型云原生数据仓库,由阿里云提供。它可以处理PB级别的数据,并提供了高性能的查询和分析能力。Hologres支持SQL和PostgreSQL协议,并提供了与阿里云生态系统的深度集成,例如MaxCompute和DataWorks。
Human: Hologres中有什么加速jsonb的方法吗? Chatbot:是的,Hologres提供了一种名为“Gin Index”的方法来加速jsonb类型的查询。Gin Index是一种基于倒排索引的数据结构,它可以快速地定位包含特定jsonb键值对的行。在Hologres中,您可以使用CREATE INDEX语句创建Gin Index,例如: CREATE INDEX idx_gin ON my_table USING gin(my_jsonb_column); 这将在my_table表的my_jsonb_column列上创建一个Gin Index。之后,您可以使用jsonb的查询操作符(例如->、->>、#>、#>>)来查询该列,并且查询将使用Gin Index进行加速
Human: Hologres中的列存jsonb是什么? Chatbot: Hologres中的列存jsonb是一种数据类型,它可以存储JSON格式的数据。JSON是一种轻量级的数据交换格式,常用于Web应用程序中。jsonb是一种二进制格式的JSON,它可以提供更快的查询速度和更小的存储空间。在Hologres中,您可以使用jsonb列来存储和查询JSON数据。
- Hologres向量数据准备。
- 在Hologres中创建数据库,详情请参见创建数据库。
- 完善连接信息。
运行如下命令打开设置向导,并填写连接信息。后续您也可以手动修改config/config.yaml
文件来更新连接信息。
python generate_config.py
- 连接信息:
参数 |
说明 |
HOLO_ENDPOINT |
Hologres实例的网络地址。 进入Hologres管理控制台的实例详情页获取网络地址。 |
HOLO_PORT |
Hologres实例的端口。 进入Hologres管理控制台的实例详情页获取端口。 |
HOLO_USER |
当前阿里云账号的AccessKey ID。 您可以单击AccessKey 管理,获取AccessKey ID。 |
HOLO_PASSWORD |
当前阿里云账号的AccessKey Secret。 您可以单击AccessKey 管理,获取AccessKey Secret。 |
HOLO_DATABASE |
Hologres实例的数据库名称。 |
- 准备语料库。本文以下载的代码与样例数据中
data
目录下的example_data.csv
文件为例。
- 语料库文件需要使用CSV格式文件,并包含
title
和content
两列。 - 本文将Hologres部分用户文档作为语料,内容示例如下。您也可以按照示例文件格式自定义语料库。
title |
content |
你是谁 |
我是Holo chatbot,一个智能问答机器人。我会尽我所能根据给定文档数据库回答您的问题。 |
你是如何实现的、架构是怎样的 |
我采用Langchain框架进行开发,Langchain是一个简单易用的python大语言模型开发框架,其中集成封装了很多实用工具。我的后端采用Hologres进行向量数据存储,可以存储大量文本以及向量数据并进行快速向量近似查询,以取得最相关的文档。最后我通过调用大模型 API来实现问答。 |
什么是实时数仓Hologres |
Hologres是阿里巴巴自主研发的一站式实时数仓引擎(Real-Time Data Warehouse),支持海量数据实时写入、实时更新、实时加工、实时分析…… |
- 语料数据向量化并导入Hologres:
运行如下命令将语料数据转化为向量(Text Embedding),并写入Hologres。
说明
本文使用达摩院在魔搭平台的CoRom开源中文embedding模型,将语料转换为768维的向量数据,详情请参见coROM。
python chatbot.py -l
- 您可以在Hologres的
langchain_pg_embedding
表中查询转化后的向量数据:
SELECT*FROM langchain_pg_embedding limit1;--返回结果示例id|embedding|metadata|document 2419815e-1407-11ee-bee5-acde48001122|{0.395261,0.123794,0.761932,0.413286,...}|{"source":"data/example_data.csv","row":1}|title: 你是如何实现的、架构是怎样的 content: 我采用Langchain框架进行开发,Langchain是一个简单易用的python大语言模型开发框架,其中集成封装了很多实用工具。我的后端采用Hologres进行向量数据存储,可以存储大量文本以及向量数据并进行快速向量近似查询,以取得最相关文档。最后我通过调用大模型 API来实现问答。
- 大模型和语料库效果验证。将上文语料库对应的向量数据输入给大模型进行提示词微调,运行如下命令进入大模型再询问其相同的问题。
python chatbot.py
- 问题一:相较于原生大模型,经语料库优化后的回答可以总结出Hologres更丰富更准确的优势。
Human: 什么是Hologres Chatbot: Hologres是阿里巴巴自主研发的一站式实时数仓引擎(Real-Time Data Warehouse),支持海量数据实时写入、实时更新、实时加工、实时分析,支持标准SQL(兼容PostgreSQL协议和语法,支持大部分PostgreSQL函数),支持PB级数据多维分析(OLAP)与即席分析(Ad Hoc),支持高并发低延迟的在线数据服务(Serving),支持多种负载的细粒度隔离与企业级安全能力,与MaxCompute、Flink、DataWorks深度融合,提供企业级离在线一体化全栈数仓解决方案。Hologres致力于高性能、高可靠、低成本、可扩展的实时数仓引擎研发,为用户提供海量数据的实时数据仓库解决方案和亚秒级交互式查询服务,广泛应用在实时数据中台建设、精细化分析、自助式分析、营销画像、人群圈选、实时风控等场景。
- 问题二:优化后的大模型已经可以理解Hologres加速查询JSONB类型的核心信息,并将版本信息、原理等内容总结得较为完整。
Human: Hologres中有什么加速jsonb的方法吗? Chatbot: 是的,Hologres从 V1.3版本开始支持对于JSONB类型开启列式存储优化,能够降低JSONB数据的存储大小并加速查询。开启JSONB列式存储优化后,系统会在底层自动将JSONB的列转换为强Schema的列式存储,查询JSONB中某一个Value时就可以直接命中指定列,从而提升查询性能。同时因为JSONB中的Value是按列式存储的,在存储层可以达到像普通结构化数据一样的存储和压缩效率,从而有效降低存储,实现降本增效。
- 问题三:优化后的大模型可以很好地将
列存
理解为列式存储优化
,并完整总结JSONB列存原理。
Human: Hologres中的列存jsonb是什么? Chatbot: Hologres中的列存JSONB是指将JSONB类型的数据按列式存储,即将JSONB中的每个键值对拆分成单独的列进行存储,而不是将整个JSONB对象作为一个整体存储。这种存储方式可以提高查询效率,因为查询时只需要命中需要的列,而不需要扫描整个JSONB对象。同时,列存JSONB还可以有效地降低存储空间,因为相同的值可以被重复存储在不同的行中,从而实现数据的压缩。Hologres从 V1.3版本开始支持对于JSONB类型开启列式存储优化。
- 可见经过优化,大模型在Hologres专业领域的回答已经非常准确。
- (可选)聊天机器人接入钉钉群聊。聊天机器人可以接入钉钉群聊,您也可以仿照
dingding_server.py
中的方式将Chatbot接入其他服务。
- 打开钉群,添加自定义机器人,详情请参见自定义机器人接入。
其中安全设置选择加签
并打开Outgoing机制,在其中填入您部署大模型定制聊天机器人服务器的IP和任意Token。将Webhook中的access_token
和secret
作为环境变量DINGDING_TOKEN
和DINGDING_SECRET
输入到连接信息(config/config.yaml
)中。 - 使用如下命令在服务器上部署HTTP服务。
# 该脚本会在后台服务钉钉机器人发来的http请求,URL为 http://localhost:8889/chat python dingding_server.py > log.txt 2>&1 &
- 接入钉钉群聊,开始聊天。
您可以在钉钉群聊中@聊天机器人,开始聊天。