使用Hologres和大模型免費(fèi)定制專屬聊天機(jī)器人
本文為您介紹如何基于Hologres向量計(jì)算能力,無(wú)需進(jìn)行模型訓(xùn)練,即可免費(fèi)、快速定制專屬聊天機(jī)器人。
背景信息
大模型可以廣泛應(yīng)用于各行各業(yè)。使用大模型定制聊天機(jī)器人,除了訓(xùn)練大模型的方式外,還可以使用提示詞微調(diào)(Prompt-tuning)的方法,在提問(wèn)時(shí)提供特定行業(yè)的相關(guān)語(yǔ)料,結(jié)合大模型的閱讀理解和信息整合能力,對(duì)該垂直行業(yè)的問(wèn)題提供更貼切的回答。
Hologres是一站式實(shí)時(shí)數(shù)倉(cāng)引擎,與達(dá)摩院自研高性能向量計(jì)算軟件庫(kù)Proxima深度整合,支持高效、易用的向量計(jì)算能力,詳情請(qǐng)參見(jiàn)Proxima向量計(jì)算。
可以將Hologres作為向量實(shí)時(shí)存儲(chǔ)和檢索引擎,把定制語(yǔ)料作為向量存儲(chǔ)并輸出給大模型,最終實(shí)現(xiàn)定制聊天機(jī)器人的快速搭建。
前提條件
已有大模型:本文適用于各種大模型。
已開(kāi)通Hologres實(shí)例:您可以使用Hologres免費(fèi)試用實(shí)例,0元搭建向量數(shù)據(jù)庫(kù),詳情請(qǐng)參見(jiàn)新用戶免費(fèi)試用。
說(shuō)明建議使用Hologres 8CU規(guī)格,免費(fèi)試用實(shí)例處理的向量數(shù)據(jù)規(guī)模為百萬(wàn)級(jí)。如有更大規(guī)模向量數(shù)據(jù),請(qǐng)使用更大規(guī)格實(shí)例。
已安裝Anaconda,詳情請(qǐng)參見(jiàn)Anaconda。
實(shí)踐步驟
環(huán)境準(zhǔn)備。
使用Anaconda環(huán)境運(yùn)行如下命令安裝相關(guān)依賴:
conda create --name chatbot python=3.8 conda activate chatbot pip install langchain psycopg2-binary torch transformers modelscope bottle pip install <大模型相關(guān)依賴>
準(zhǔn)備大模型:本文以支持通過(guò)API訪問(wèn)的大模型為例,您需要準(zhǔn)備大模型API訪問(wèn)密鑰。
單擊代碼與樣例數(shù)據(jù)或運(yùn)行如下命令克隆本文所需代碼與樣例數(shù)據(jù):
說(shuō)明如果通過(guò)下載鏈接下載的代碼與樣例數(shù)據(jù),使用前請(qǐng)進(jìn)行解壓。
如果使用如下代碼克隆代碼與樣例數(shù)據(jù),請(qǐng)?jiān)谑褂们跋螺dGit。
git clone https://github.com/aliyun/alibabacloud-hologres-connectors.git
大模型試用。
先試用原生大模型,針對(duì)部分Hologres相關(guān)的專業(yè)問(wèn)題進(jìn)行問(wèn)答。
在
holo-chatbot/chatbot.py
代碼的main
函數(shù)(107行)中,修改chat_model_name
為您想使用的大模型,示例代碼如下:說(shuō)明您可以使用任意LangChain支持的大模型,詳見(jiàn)LangChain chat models,也可以為其他大模型實(shí)現(xiàn)相應(yīng)的接口后進(jìn)行調(diào)用。
# 選擇大模型 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)
使用如下命令進(jìn)入大模型:
說(shuō)明首次使用會(huì)自動(dòng)下載Embedding模型(約400 MB),需要較長(zhǎng)時(shí)間,第二次調(diào)用則不需要此過(guò)程。
# 切換目錄至代碼所在目錄 cd alibabacloud-hologres-connectors/holo-chatbot # 運(yùn)行如下命令打開(kāi)設(shè)置向?qū)В鱾€(gè)設(shè)置項(xiàng)按回車跳過(guò)即可 python generate_config.py # -n --no-vector-store: 不通過(guò)Hologres向量檢索,直接調(diào)用大模型進(jìn)行問(wèn)答 python chatbot.py -n
提問(wèn)問(wèn)題及大模型對(duì)應(yīng)回答如下:
Human: 什么是Hologres? Chatbot: Hologres是一個(gè)分析型云原生數(shù)據(jù)倉(cāng)庫(kù),由阿里云提供。它可以處理PB級(jí)別的數(shù)據(jù),并提供了高性能的查詢和分析能力。Hologres支持SQL和PostgreSQL協(xié)議,并提供了與阿里云生態(tài)系統(tǒng)的深度集成,例如MaxCompute和DataWorks。
Human: Hologres中有什么加速jsonb的方法嗎? Chatbot:是的,Hologres提供了一種名為“Gin Index”的方法來(lái)加速jsonb類型的查詢。Gin Index是一種基于倒排索引的數(shù)據(jù)結(jié)構(gòu),它可以快速地定位包含特定jsonb鍵值對(duì)的行。在Hologres中,您可以使用CREATE INDEX語(yǔ)句創(chuàng)建Gin Index,例如: CREATE INDEX idx_gin ON my_table USING gin(my_jsonb_column); 這將在my_table表的my_jsonb_column列上創(chuàng)建一個(gè)Gin Index。之后,您可以使用jsonb的查詢操作符(例如->、->>、#>、#>>)來(lái)查詢?cè)摿校⑶也樵儗⑹褂肎in Index進(jìn)行加速
Human: Hologres中的列存jsonb是什么? Chatbot: Hologres中的列存jsonb是一種數(shù)據(jù)類型,它可以存儲(chǔ)JSON格式的數(shù)據(jù)。JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于Web應(yīng)用程序中。jsonb是一種二進(jìn)制格式的JSON,它可以提供更快的查詢速度和更小的存儲(chǔ)空間。在Hologres中,您可以使用jsonb列來(lái)存儲(chǔ)和查詢JSON數(shù)據(jù)。
Hologres向量數(shù)據(jù)準(zhǔn)備。
在Hologres中創(chuàng)建數(shù)據(jù)庫(kù),詳情請(qǐng)參見(jiàn)創(chuàng)建數(shù)據(jù)庫(kù)。
完善連接信息。
運(yùn)行如下命令打開(kāi)設(shè)置向?qū)В⑻顚戇B接信息。后續(xù)您也可以手動(dòng)修改
config/config.yaml
文件來(lái)更新連接信息。python generate_config.py
連接信息:
參數(shù)
說(shuō)明
HOLO_ENDPOINT
Hologres實(shí)例的網(wǎng)絡(luò)地址。
進(jìn)入Hologres管理控制臺(tái)的實(shí)例詳情頁(yè)獲取網(wǎng)絡(luò)地址。
HOLO_PORT
Hologres實(shí)例的端口。
進(jìn)入Hologres管理控制臺(tái)的實(shí)例詳情頁(yè)獲取端口。
HOLO_USER
當(dāng)前阿里云賬號(hào)的AccessKey ID。
您可以單擊AccessKey 管理,獲取AccessKey ID。
HOLO_PASSWORD
當(dāng)前阿里云賬號(hào)的AccessKey Secret。
您可以單擊AccessKey 管理,獲取AccessKey Secret。
HOLO_DATABASE
Hologres實(shí)例的數(shù)據(jù)庫(kù)名稱。
準(zhǔn)備語(yǔ)料庫(kù)。
本文以下載的代碼與樣例數(shù)據(jù)中
data
目錄下的example_data.csv
文件為例。語(yǔ)料庫(kù)文件需要使用CSV格式文件,并包含
title
和content
兩列。本文將Hologres部分用戶文檔作為語(yǔ)料,內(nèi)容示例如下。您也可以按照示例文件格式自定義語(yǔ)料庫(kù)。
title
content
你是誰(shuí)
我是Holo chatbot,一個(gè)智能問(wèn)答機(jī)器人。我會(huì)盡我所能根據(jù)給定文檔數(shù)據(jù)庫(kù)回答您的問(wèn)題。
你是如何實(shí)現(xiàn)的、架構(gòu)是怎樣的
我采用Langchain框架進(jìn)行開(kāi)發(fā),Langchain是一個(gè)簡(jiǎn)單易用的python大語(yǔ)言模型開(kāi)發(fā)框架,其中集成封裝了很多實(shí)用工具。我的后端采用Hologres進(jìn)行向量數(shù)據(jù)存儲(chǔ),可以存儲(chǔ)大量文本以及向量數(shù)據(jù)并進(jìn)行快速向量近似查詢,以取得最相關(guān)的文檔。最后我通過(guò)調(diào)用大模型 API來(lái)實(shí)現(xiàn)問(wèn)答。
什么是實(shí)時(shí)數(shù)倉(cāng)Hologres
Hologres是阿里巴巴自主研發(fā)的一站式實(shí)時(shí)數(shù)倉(cāng)引擎(Real-Time Data Warehouse),支持海量數(shù)據(jù)實(shí)時(shí)寫入、實(shí)時(shí)更新、實(shí)時(shí)加工、實(shí)時(shí)分析……
語(yǔ)料數(shù)據(jù)向量化并導(dǎo)入Hologres:
運(yùn)行如下命令將語(yǔ)料數(shù)據(jù)轉(zhuǎn)化為向量(Text Embedding),并寫入Hologres。
說(shuō)明本文使用達(dá)摩院在魔搭平臺(tái)的CoRom開(kāi)源中文embedding模型,將語(yǔ)料轉(zhuǎn)換為768維的向量數(shù)據(jù),詳情請(qǐng)參見(jiàn)coROM。
python chatbot.py -l
您可以在Hologres的
langchain_embedding
表中查詢轉(zhuǎn)化后的向量數(shù)據(jù):SELECT * FROM langchain_embedding limit 1; --返回結(jié)果示例 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: 你是如何實(shí)現(xiàn)的、架構(gòu)是怎樣的 content: 我采用Langchain框架進(jìn)行開(kāi)發(fā),Langchain是一個(gè)簡(jiǎn)單易用的python大語(yǔ)言模型開(kāi)發(fā)框架,其中集成封裝了很多實(shí)用工具。我的后端采用Hologres進(jìn)行向量數(shù)據(jù)存儲(chǔ),可以存儲(chǔ)大量文本以及向量數(shù)據(jù)并進(jìn)行快速向量近似查詢,以取得最相關(guān)文檔。最后我通過(guò)調(diào)用大模型 API來(lái)實(shí)現(xiàn)問(wèn)答。
大模型和語(yǔ)料庫(kù)效果驗(yàn)證。
將上文語(yǔ)料庫(kù)對(duì)應(yīng)的向量數(shù)據(jù)輸入給大模型進(jìn)行提示詞微調(diào),運(yùn)行如下命令進(jìn)入大模型再詢問(wèn)其相同的問(wèn)題。
python chatbot.py
問(wèn)題一:相較于原生大模型,經(jīng)語(yǔ)料庫(kù)優(yōu)化后的回答可以總結(jié)出Hologres更豐富更準(zhǔn)確的優(yōu)勢(shì)。
Human: 什么是Hologres Chatbot: Hologres是阿里巴巴自主研發(fā)的一站式實(shí)時(shí)數(shù)倉(cāng)引擎(Real-Time Data Warehouse),支持海量數(shù)據(jù)實(shí)時(shí)寫入、實(shí)時(shí)更新、實(shí)時(shí)加工、實(shí)時(shí)分析,支持標(biāo)準(zhǔn)SQL(兼容PostgreSQL協(xié)議和語(yǔ)法,支持大部分PostgreSQL函數(shù)),支持PB級(jí)數(shù)據(jù)多維分析(OLAP)與即席分析(Ad Hoc),支持高并發(fā)低延遲的在線數(shù)據(jù)服務(wù)(Serving),支持多種負(fù)載的細(xì)粒度隔離與企業(yè)級(jí)安全能力,與MaxCompute、Flink、DataWorks深度融合,提供企業(yè)級(jí)離在線一體化全棧數(shù)倉(cāng)解決方案。Hologres致力于高性能、高可靠、低成本、可擴(kuò)展的實(shí)時(shí)數(shù)倉(cāng)引擎研發(fā),為用戶提供海量數(shù)據(jù)的實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)解決方案和亞秒級(jí)交互式查詢服務(wù),廣泛應(yīng)用在實(shí)時(shí)數(shù)據(jù)中臺(tái)建設(shè)、精細(xì)化分析、自助式分析、營(yíng)銷畫像、人群圈選、實(shí)時(shí)風(fēng)控等場(chǎng)景。
問(wèn)題二:優(yōu)化后的大模型已經(jīng)可以理解Hologres加速查詢JSONB類型的核心信息,并將版本信息、原理等內(nèi)容總結(jié)得較為完整。
Human: Hologres中有什么加速jsonb的方法嗎? Chatbot: 是的,Hologres從 V1.3版本開(kāi)始支持對(duì)于JSONB類型開(kāi)啟列式存儲(chǔ)優(yōu)化,能夠降低JSONB數(shù)據(jù)的存儲(chǔ)大小并加速查詢。開(kāi)啟JSONB列式存儲(chǔ)優(yōu)化后,系統(tǒng)會(huì)在底層自動(dòng)將JSONB的列轉(zhuǎn)換為強(qiáng)Schema的列式存儲(chǔ),查詢JSONB中某一個(gè)Value時(shí)就可以直接命中指定列,從而提升查詢性能。同時(shí)因?yàn)镴SONB中的Value是按列式存儲(chǔ)的,在存儲(chǔ)層可以達(dá)到像普通結(jié)構(gòu)化數(shù)據(jù)一樣的存儲(chǔ)和壓縮效率,從而有效降低存儲(chǔ),實(shí)現(xiàn)降本增效。
問(wèn)題三:優(yōu)化后的大模型可以很好地將
列存
理解為列式存儲(chǔ)優(yōu)化
,并完整總結(jié)JSONB列存原理。Human: Hologres中的列存jsonb是什么? Chatbot: Hologres中的列存JSONB是指將JSONB類型的數(shù)據(jù)按列式存儲(chǔ),即將JSONB中的每個(gè)鍵值對(duì)拆分成單獨(dú)的列進(jìn)行存儲(chǔ),而不是將整個(gè)JSONB對(duì)象作為一個(gè)整體存儲(chǔ)。這種存儲(chǔ)方式可以提高查詢效率,因?yàn)椴樵儠r(shí)只需要命中需要的列,而不需要掃描整個(gè)JSONB對(duì)象。同時(shí),列存JSONB還可以有效地降低存儲(chǔ)空間,因?yàn)橄嗤闹悼梢员恢貜?fù)存儲(chǔ)在不同的行中,從而實(shí)現(xiàn)數(shù)據(jù)的壓縮。Hologres從 V1.3版本開(kāi)始支持對(duì)于JSONB類型開(kāi)啟列式存儲(chǔ)優(yōu)化。
可見(jiàn)經(jīng)過(guò)優(yōu)化,大模型在Hologres專業(yè)領(lǐng)域的回答已經(jīng)非常準(zhǔn)確。
(可選)聊天機(jī)器人接入釘釘群聊。
聊天機(jī)器人可以接入釘釘群聊,您也可以仿照
dingding_server.py
中的方式將Chatbot接入其他服務(wù)。打開(kāi)釘群,添加自定義機(jī)器人,詳情請(qǐng)參見(jiàn)自定義機(jī)器人接入。
其中安全設(shè)置選擇
加簽
并打開(kāi)Outgoing機(jī)制,在其中填入您部署大模型定制聊天機(jī)器人服務(wù)器的IP和任意Token。將Webhook中的access_token
和secret
作為環(huán)境變量DINGDING_TOKEN
和DINGDING_SECRET
輸入到連接信息(config/config.yaml
)中。使用如下命令在服務(wù)器上部署HTTP服務(wù)。
# 該腳本會(huì)在后臺(tái)服務(wù)釘釘機(jī)器人發(fā)來(lái)的http請(qǐng)求,URL為 http://localhost:8889/chat python dingding_server.py > log.txt 2>&1 &
接入釘釘群聊,開(kāi)始聊天。
您可以在釘釘群聊中@聊天機(jī)器人,開(kāi)始聊天。