千尋搜索+靈積千問LLM搭建專屬知識庫問答最佳實踐
1. 千尋大模型搜索算法服務(wù)搭建
千尋大模型搜索服務(wù)是基于大規(guī)模分布式搜索引擎搭建的,面向企業(yè)提供的一站式智能搜索PaaS服務(wù),為企業(yè)開發(fā)人員提供基礎(chǔ)結(jié)構(gòu)、API 和搜索工具。服務(wù)集成全自研多語言query分析能力(分詞、NER、糾錯、改寫、分類等),多模型結(jié)構(gòu)的預(yù)訓(xùn)練向量表示能力(encoder-only、decoder-only),混合召回和多因子排序能力(文本匹配、深度語義匹配)等,相對比純向量檢索,提升為行業(yè)領(lǐng)先搜索效果。
更多細節(jié)參考:企業(yè)智能搜索_自然語言處理(NLP)-阿里云幫助中心
由于目前服務(wù)尚未完全對外開放,需要采用定向加白配置方式試用產(chǎn)品,未來會正式對外開放。因此當(dāng)前搭建一個千尋大模型搜索服務(wù)需要以下五個步驟:
申請試用
購買資源
準備數(shù)據(jù)
配置服務(wù)
測試服務(wù)
1.1. 申請試用流程
step1,開通nlp服務(wù)
step2,進入nlp管控臺
step3,登錄阿里云賬號
step4,點擊進入千尋大模型搜索平臺
付費開通產(chǎn)品之后即可使用。
1.2. 購買資源
需要購買的資源包括:
搜索引擎
數(shù)據(jù)存儲
1.2.1. 搜索引擎
搜索引擎提供檢索服務(wù)的基礎(chǔ)組建,可在資源中心-引擎管理添加引擎,也可在概覽-創(chuàng)建服務(wù)直接選擇或添加。若沒有可用的引擎,點擊我需要購買新的引擎。
以下是已適配的引擎列表,可以根據(jù)實際需求進行調(diào)整:
已適配引擎列表 | 版本 | 配置 | 插件 | 鏈接 |
阿里云Elasticsearch |
|
|
|
引擎配置流程:
選擇規(guī)格:非向量需求場景不小于2核8G,向量需求場景建議不小于8核32G。
選擇插件:需要安裝aliws插件,配置與管理-插件配置-系統(tǒng)默認插件列表。
配置安全鏈接:在ES實例的配置與管理-安全配置中開啟公網(wǎng)訪問,然后IP段加入白名單中(具體IP段配置聯(lián)系@張家棟,釘釘群二維碼可見文檔最后)。
添加引擎:
引擎配置完成后即可將ES實例的基本信息中公網(wǎng)地址和公網(wǎng)端口添加到千尋大模型搜索的引擎管理中。操作如下:
1.2.2. 數(shù)據(jù)存儲服務(wù)
數(shù)據(jù)存儲用于保存企業(yè)知識庫,可在資源中心進行數(shù)據(jù)源管理也可在快速創(chuàng)建頁面直接選擇或添加。以下是已適配數(shù)據(jù)源列表:
已適配數(shù)據(jù)源列表 | 鏈接 |
阿里云 RDS MySQL | |
阿里云 MaxCompute | |
阿里云 OSS |
根據(jù)數(shù)據(jù)源的類型不同建議選擇不同的數(shù)據(jù)構(gòu)建方式:
RDS數(shù)據(jù)源:適用于存儲數(shù)據(jù)庫類型的數(shù)據(jù),可靈活選擇數(shù)據(jù)庫庫表字段進行解析,構(gòu)建索引。
OSS數(shù)據(jù)源:適用于存儲文件類型的數(shù)據(jù),可指定bucket及子路徑并對指定文件類型進行解析,構(gòu)建索引。
混合數(shù)據(jù)源:當(dāng)接入數(shù)據(jù)源同時存在文件類型及數(shù)據(jù)庫類型數(shù)據(jù)時,需要選擇混合數(shù)據(jù)源的方式進行接入。
其中混合數(shù)據(jù)源接入需購買RDS,購買后進入RDS管控臺進行如下配置:
服務(wù)地址:開啟外網(wǎng)地址后,將該外網(wǎng)地址用于企業(yè)搜索管控臺錄入數(shù)據(jù)庫地址。
網(wǎng)絡(luò)配置:進入RDS實例,白名單與安全組-白名單設(shè)置-添加白名單分組(具體IP段配置聯(lián)系@張家棟,釘釘群二維碼可見文檔最后)。
賬號創(chuàng)建:進入RDS實例,賬號管理-用戶賬號-創(chuàng)建賬號。
將RDS實例的數(shù)據(jù)庫鏈接信息中外網(wǎng)地址和外網(wǎng)端口添加到千尋大模型搜索的數(shù)據(jù)源管理中。
1.3. 準備數(shù)據(jù)
在數(shù)據(jù)存儲服務(wù)準備完成后,可以對數(shù)據(jù)存儲服務(wù)中進行數(shù)據(jù)導(dǎo)入和對接,在格式上需要做一些對齊操作:
RDS數(shù)據(jù)源:支持數(shù)據(jù)庫類型數(shù)據(jù)的接入。解析字段同所選數(shù)據(jù)庫庫表字段,非固定可選。若解析數(shù)據(jù)為faq類型,要求數(shù)據(jù)庫庫表字段類型為:id、question、answer、sim_question、url、gmt_modified。
OSS數(shù)據(jù)源:支持文件類型數(shù)據(jù)的接入。支持解析的文件格式.pdf/.docx/.txt/.md/.html,解析字段為默認字段,固定全選。若解析數(shù)據(jù)為faq類型,則支持解析的文件格式為.csv/.xlsx,要求數(shù)據(jù)源字段類型為id、question、answer、sim_question、url。
混合數(shù)據(jù)源:支持數(shù)據(jù)庫類型數(shù)據(jù)+文件類型數(shù)據(jù)的方式接入。數(shù)據(jù)庫類型數(shù)據(jù)存儲在對應(yīng)需要解析的字段,若還需要文件類型數(shù)據(jù),則RDS中必須字段為主鍵、文件路徑字段、文件類型字段,例如示例中的id、oss_url、format。其中文件路徑字段中支持傳入可下載鏈接或OSS文件路徑,如下圖所示,若使用OSS文件路徑,則索引構(gòu)建階段還需要配置對應(yīng)的OSS數(shù)據(jù)源。若解析數(shù)據(jù)為faq類型,需滿足上述不同數(shù)據(jù)源的格式要求。
1.4. 配置服務(wù)
在搜索引擎和數(shù)據(jù)準備完成之后,便可以回到千尋大模型搜索服務(wù)的控制臺開始搜索服務(wù)的創(chuàng)建和配置了,具體步驟如下:
1.4.1. 創(chuàng)建搜索服務(wù)
概覽-搜索增強-創(chuàng)建服務(wù),進入服務(wù)創(chuàng)建界面。
編輯服務(wù)名稱并選擇服務(wù)所使用的引擎,完成創(chuàng)建中進入索引配置。
其中,索引配置的關(guān)鍵概念如下:
字段名
字段名稱,對采用數(shù)據(jù)表作為數(shù)據(jù)源的實例,字段名和表格字段名一一對應(yīng),字段類型跟源數(shù)據(jù)表中定義的字段類型保持一致。對采用OSS文件格式作為數(shù)據(jù)源的實例,字段名稱跟離線數(shù)據(jù)解析結(jié)果字段對應(yīng)。
索引字段類型
索引字段類型定義了字段的數(shù)據(jù)類型,以便搜索引擎(例如ElasticSearch)能夠正確地處理和索引這些字段的值。以ElasticSearch為例,常見的索引字段類型:
索引字段類型 | 字段類型說明 |
text | 用于索引長文本,例如文章內(nèi)容、描述等。文本類型會進行分詞處理,以便能夠根據(jù)單詞進行搜索和匹配。 |
keyword | 用于索引短文本,例如標簽、關(guān)鍵字等。關(guān)鍵字類型不會進行分詞處理,整個字段作為一個整體進行索引和匹配。 |
interger | 用于索引INT類型數(shù)字,數(shù)字類型可以用于排序、范圍查詢等操作 |
long | 用于索引LONG類型數(shù)字,數(shù)字類型可以用于排序、范圍查詢等操作 |
double | 用于索引DOUBLE類型數(shù)字,數(shù)字類型可以用于排序、范圍查詢等操作 |
float | 用于索引FLOAT類型數(shù)字,數(shù)字類型可以用于排序、范圍查詢等操作 |
date | 用于索引日期和時間。日期類型可以進行日期范圍查詢、排序等操作。 |
boolean | 用于索引布爾值,即true或false |
binary | 用于索引二進制數(shù)據(jù),例如圖片、文件等 |
文本塊切分/Chunk
當(dāng)該字段文本長度比較長且需要作為大模型回答的參考內(nèi)容時,建議勾選該字段。勾選后該字段的長文本會被切分為短的文本塊;若不勾選,部分較長的文本后半段會被直接截斷。OSS數(shù)據(jù)源的content字段默認勾選。
向量化
文本向量化是將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值向量的過程。它將文本中的詞語、句子表示為向量形式,以便能夠信息檢索等任務(wù)中進行相關(guān)性計算。勾選向量化后,搜索的準確性能夠得到提升,對于用戶輸入的問題與相關(guān)知識庫內(nèi)容字面不一致的情況也能搜到正確的知識。
分析器
在索引構(gòu)建過程中,分析器(OR 分詞器)是用于將文本數(shù)據(jù)分割成詞的工具。它是文本分析過程中的一個重要組件,用于構(gòu)建倒排索引,以便能夠?qū)ξ谋具M行搜索和匹配。分析器將輸入的文本按照一定的規(guī)則進行分割,分析器可以將一個長文本分割成多個詞,以便能夠?qū)@些詞進行索引和搜索。
1.4.2. 向量化版本選擇
目前可以選擇text-embedding-v1和text-embedding-v2兩個向量化版本。
1.4.3. 是否關(guān)聯(lián)文件數(shù)據(jù)
當(dāng)接入數(shù)據(jù)源同時存在文件類型及數(shù)據(jù)庫類型數(shù)據(jù)時,且“文件路徑字段”和“文件類型字段”都是數(shù)據(jù)庫中的字段,需要開啟“關(guān)聯(lián)文件數(shù)據(jù)”功能,開啟后,系統(tǒng)會自動校驗,若源數(shù)據(jù)表中字段和系統(tǒng)自動擴展字段中的“title、content、parent、hier_title、nid”有重復(fù),則需退出流程,更改字段名稱。
打開關(guān)聯(lián)文件數(shù)據(jù)開關(guān),文件存儲類型支持OSS和HTTP兩種。選擇OSS需要配置對應(yīng)的OSS數(shù)據(jù)源,文件路徑字段內(nèi)容為源文件的OSS路徑;選擇HTTP,文件路徑字段為可下載鏈接。
設(shè)置主鍵、數(shù)據(jù)更新所依據(jù)時間字段、搜索字段、接口返回字段、是否自動更新。
概念解釋如下:
主鍵
數(shù)據(jù)的唯一標識
數(shù)據(jù)更新所依據(jù)時間字段
指定更新時間字段,用戶后續(xù)索引更新標識,如不指定,索引數(shù)據(jù)只會執(zhí)行首次構(gòu)建,不會做增量更新。
搜索字段
全文檢索字段,需要為keywords或text類型,用來執(zhí)行搜索操作,匹配查詢條件,限制搜索范圍。
接口返回字段
接口返回字段是指搜索請求后的返回結(jié)果字段,可在索引配置字段中選擇業(yè)務(wù)所需字段,后續(xù)可應(yīng)用于大模型多輪對話中的參考內(nèi)容。
是否自動更新
若數(shù)據(jù)源索引配置需要定期更新,則需要打開此開關(guān)。支持每小時/每天/每月三種周期自動更新,支持配置對應(yīng)更新的時間點以及時區(qū)。
1.4.4. 配置加載
點擊創(chuàng)建,開始創(chuàng)建服務(wù),等待數(shù)據(jù)處理和導(dǎo)入引擎。
服務(wù)創(chuàng)建成功。
1.5. 測試服務(wù)
目前服務(wù)測試提供兩種方式:
管控臺測試;
SDK測試。
1.5.1. 管控臺測試:
進入服務(wù)管理,找到創(chuàng)建的服務(wù),點擊服務(wù)測試。
輸入搜索參數(shù)進行搜索,搜索參數(shù)配置詳見產(chǎn)品文檔中的請求入?yún)ⅲ?/a>。
1.5.2. SDK測試
配置環(huán)境變量:
export ALIBABA_CLOUD_ACCESS_KEY_ID=YOUR_ALIBABA_CLOUD_ACCESS_KEY_ID
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=YOUR_ALIBABA_CLOUD_ACCESS_KEY_SECRET
1.5.2.1. Python SDK
pip安裝依賴:
pip install alibabacloud-alinlp20200629
Python示例代碼:
import os
import json
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
nlp_client = client.Client(config)
# 配置一個搜索request
request = models.PostMSSearchEnhanceRequest()
request.service_id = 1017 # 服務(wù)id
# 線上query
query = '測試'
# 配置并請求搜索服務(wù)
request.uq = query # 用戶輸入檢索值
request.page = 1 # 分頁(頁碼)
request.rows = 5 # 分頁(行數(shù))
response = nlp_client.post_mssearch_enhance(request)
# 打印搜索結(jié)果
print(json.dumps(response.body.data, ensure_ascii=False))
1.5.2.2. Java SDK
Maven依賴:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alinlp20200629</artifactId>
<version>3.0.0</version>
</dependency>
<!--出現(xiàn)java.lang.NoSuchMethodError: com.aliyun.credentials.Client.getCredential()Lcom/aliyun/credentials/models/CredentialModel;異常則引入-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.0</version>
</dependency>
Java示例代碼:
public static void main(String[] args) throws Exception {
// 創(chuàng)建一個搜索client
Config config = new Config();
config.setEndpoint("alinlp.cn-beijing.aliyuncs.com");
config.setAccessKeyId("xxxx");
config.setAccessKeySecret("xxxx");
Client client = new Client(config);
// 配置一個搜索request
PostMSSearchEnhanceRequest postMSSearchEnhanceRequest = new PostMSSearchEnhanceRequest();
postMSSearchEnhanceRequest.setServiceId(1017L); // 服務(wù)id
// 線上query
postMSSearchEnhanceRequest.setUq("測試"); // 用戶輸入檢索值
// 配置并請求搜索服務(wù)
postMSSearchEnhanceRequest.setPage(1); // 分頁(頁碼)
postMSSearchEnhanceRequest.setRows(5); // 分頁(行數(shù))
postMSSearchEnhanceRequest.setFields(Lists.newArrayList("name","title", "content")); // 召回字段(正排)
PostMSSearchEnhanceResponse response = client.postMSSearchEnhance(postMSSearchEnhanceRequest);
// 打印搜索結(jié)果
System.out.println(JacksonUtils.toJson(response));
}
2. 靈積平臺千問LLM服務(wù)搭建
2.1. 靈積平臺簡介
一條完整的知識庫問答鏈路,在完成相關(guān)問題的知識檢索之后,需要有LLM來基于提問和檢索到的知識庫內(nèi)容進行最終的總結(jié)和回答。但將一個大模型本身封裝成一個穩(wěn)定、可靠、易維護、易擴展的服務(wù)是一個復(fù)雜的工程。靈積模型服務(wù)平臺便是為解決模型服務(wù)而誕生的,靈積模型服務(wù)(即:DashScope)的本質(zhì)是“模型即服務(wù)”:讓各種模型的能力觸手可得。靈積LLM服務(wù)平臺將各類AI模型通過標準化的封裝形成API服務(wù),以方便應(yīng)用開發(fā)者調(diào)用。
目前在靈積LLM服務(wù)平臺中可以支持多種大模型,包括通義千問系列的獨有模型以及Llama2這種開源模型:
獨有模型
開源模型
更多模型相關(guān)內(nèi)容參考文檔:模型列表
2.2. 開通和搭建
靈積LLM服務(wù)的開通和搭建可以參考阿里云官網(wǎng)的相關(guān)信息:快速入門
3. 問答在線鏈路搭建
在完成了搜索服務(wù)搭建并打通了靈積LLM的服務(wù)之后,我們便具備了:
知識庫搜索的能力;
大模型的生成能力。
接下來可以這兩種能力相結(jié)合,組建一個完整的知識庫在線問答的鏈路,流程如下圖所示:
分階段樣例說明
Step1. 搜索前處理-多輪搜索意圖判定
搜索前處理的輸入是問答的歷史輪問答信息(History)和當(dāng)前輪的原始輸入(Query),輸出是將要傳入搜索服務(wù)的改寫后Query,因此可以通過調(diào)用多輪改寫API來完成。同時真實場景中還存在一些并不需要搜索的特殊情況(比如"你好" 這種query,不需要進行知識庫的搜索),這類問題可以通過搜索判定API來完成。因此,我們先進行多輪改寫,總結(jié)多輪query的核心意圖,搜索判定模塊對改寫后的query進行分類。
對應(yīng)的API細節(jié)可以查看文檔:開發(fā)參考_自然語言處理(NLP)-阿里云幫助中心,以下是API調(diào)用示例。
搜索判定API功能和調(diào)用示例
功能簡述:在很多場景中,我們不一定需要搜索引擎,大模型就能回答的很好,但也有很多像開放域?qū)崟r問題沒有搜索引擎就無法回答。因此,搜索判定模塊的目標是判定什么時候需要進行檢索,從而提高RAG的利用效率,提高整體效果。
調(diào)用示例:
import os
import json
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
nlp_client = client.Client(config)
# 配置一個搜索判定request
request = models.PostISRetrieveRouterRequest()
# 配置并請求搜索判定服務(wù)
request.algorithm = 'retrieve_router'
input_str = '{\"query\": \"搜索判定測試\"}'
request.input = json.loads(input_str)
response = nlp_client.post_isretrieve_router(request)
# 打印搜索判定結(jié)果
print(json.dumps(response.body.data, ensure_ascii=False))
多輪query改寫API功能和調(diào)用示例
功能簡述:在與用戶進行多輪對話互動的場景里,搜索引擎通常不能直接處理用戶的查詢和對話記錄。因此,在RAG流程中,結(jié)合對話歷史的理解和重新構(gòu)思用戶的查詢至關(guān)重要。多輪查詢的改寫可以顯著提升RAG的檢索效率、內(nèi)容生成質(zhì)量以及用戶體驗,從而增強RAG的整體表現(xiàn)。
調(diào)用示例:
import os
import json
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
nlp_client = client.Client(config)
# 配置一個多輪query改寫request
request = models.PostISConvRewriterRequest()
# 配置并請求多輪query改寫服務(wù)
request.algorithm = 'conversation_rewriter'
request.model = 'dashscope-conv-rewrite-1.8b'
input_str = '{\n' + \
' \"query\": \"貴嗎\",\n' + \
' \"history\": [\n' + \
' {\n' + \
' \"role\": \"user\",\n' + \
' \"content\": \"什么是黑梓木\"\n' + \
' },\n' + \
' {\n' + \
' \"role\": \"assistant\",\n' + \
' \"content\": \"黑梓木是一種用材最廣的木頭,在我國東北地區(qū)也稱之為臭梧桐,分布比較廣泛,產(chǎn)量也大,很多裝飾部件都會用黑梓木制作。\"\n' + \
' }\n' + \
' ]\n' + \
'}'
request.input = json.loads(input_str)
response = nlp_client.post_isconv_rewriter(request)
# 打印多輪query改寫結(jié)果
print(json.dumps(response.body.data, ensure_ascii=False))
Step2. 搜索處理
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
search_client = client.Client(config)
# 配置一個搜索request
request = models.PostMSSearchEnhanceRequest()
request.service_id = YOUR_SERVICE_ID # 控制臺搭建完后拿到service_id
# 線上query
query = '燈泡相機TD3B的鏡頭焦距是多少'
# 請求搜索服務(wù)
request.uq = query
request.rows = 5 # 設(shè)置搜索參數(shù):返回文檔數(shù)
response = search_client.post_mssearch_enhance(request)
search_results = response.body.data["data"]["docs"]
print(search_results)
Step3. 搜索后處理
為了使LLM最終的問答效果更好,在調(diào)用搜索服務(wù)拿到搜索結(jié)果之后通常還需要做一些后處理。最常見的后處理是將搜索結(jié)果放入prompt中,并采用一些思維鏈(Chain of Thought)來提升LLM的回答效果。
結(jié)合搜索結(jié)果的prompt構(gòu)建樣例代碼
通過對搜索服務(wù)response的數(shù)據(jù)進行解析可以得到一個搜索結(jié)果的列表,列表中的每個元素搜是一個相關(guān)的文檔片段,在預(yù)設(shè)的格式中每個文檔片段至少會包含“title”和“content”兩個字段來保存文本信息,可以通過以下的Python原生代碼構(gòu)建用于LLM回答的prompt和message:
# 搜索結(jié)果樣例
search_results = [
{"title": "搜索結(jié)果的title文本。", "content": "搜索結(jié)果的content文本。"}
]
# 將搜索結(jié)果組建成prompt/messages
system = f'You are a helpful assistant.\n\n'
messages = [{'role': 'system', 'content': system}]
if len(search_results) != 0:
text_result_str = '\n\n'.join([f'{x.get("title", "")}: {x.get("content", "")}' for x in search_results]).strip()
ctx = f'\n\n以下信息來自你的知識庫,可能會對回答某些問題有幫助:\n\n{text_result_str}\n\n請記住這些知識庫的信息。'
messages.append({'role': 'user', 'content': ctx})
a = '好的,我已經(jīng)記住這些知識庫的信息。有什么我可以幫助你解答的問題嗎?'
messages.append({'role': 'assistant', 'content': a})
messages.append({'role': 'user', 'content': query})
print(messages)
對于時間敏感的問題還可以加上當(dāng)前時間的信息來組成prompt:
import datetime
def get_current_date_str() -> str:
beijing_time = datetime.datetime.utcnow() + datetime.timedelta(hours=8)
cur_time = beijing_time.timetuple()
date_str = f'當(dāng)前時間:{cur_time.tm_year}年{cur_time.tm_mon}月{cur_time.tm_mday}日,星期'
date_str += ['一', '二', '三', '四', '五', '六', '日'][cur_time.tm_wday]
date_str += '。'
return date_str
system = f'You are a helpful assistant.\n\n{date_str}'
messages = [{'role': 'system', 'content': system}]
Step4. 調(diào)用靈積LLM做問答
完成prompt的組裝之后可以調(diào)用dashscope的SDK來做問答
import dashscope
# 請求dashscope做QA
response = dashscope.Generation.call(
model=dashscope.Generation.Models.qwen_max,
prompt=prompt)
if response.status_code == 200:
print(response.output) # The output text
print(response.usage) # The usage information
else:
print(response.code) # The error code.
print(response.message) # The error message.
全鏈路樣例代碼
把以上全鏈路的代碼整合到一起有如下實踐:
配置環(huán)境變量
export ALIBABA_CLOUD_ACCESS_KEY_ID=YOUR_ALIBABA_CLOUD_ACCESS_KEY_ID
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=YOUR_ALIBABA_CLOUD_ACCESS_KEY_SECRET
export DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
單輪問答Python示例代碼
import datetime
import dashscope
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
search_client = client.Client(config)
# 配置一個搜索request
request = models.PostMSSearchEnhanceRequest()
request.service_id = YOUR_SERVICE_ID # 控制臺搭建完后拿到service_id
# 線上query
query = '燈泡相機TD3B的鏡頭焦距是多少'
# 請求搜索服務(wù)
request.uq = query
request.rows = 5 # 設(shè)置搜索參數(shù):返回文檔數(shù)
response = search_client.post_mssearch_enhance(request)
search_results = response.body.data["data"]["docs"]
# 將搜索結(jié)果組建成prompt/messages
def get_current_date_str() -> str:
beijing_time = datetime.datetime.utcnow() + datetime.timedelta(hours=8)
cur_time = beijing_time.timetuple()
date_str = f'當(dāng)前時間:{cur_time.tm_year}年{cur_time.tm_mon}月{cur_time.tm_mday}日,星期'
date_str += ['一', '二', '三', '四', '五', '六', '日'][cur_time.tm_wday]
date_str += '。'
return date_str
system = f'You are a helpful assistant.\n\n{date_str}'
messages = [{'role': 'system', 'content': system}]
if len(search_results) != 0:
text_result_str = '\n\n'.join([f'{x.get("title", "")}: {x.get("content", "")}' for x in search_results]).strip()
ctx = f'\n\n以下信息來自你的知識庫,可能會對回答某些問題有幫助:\n\n{text_result_str}\n\n請記住這些知識庫的信息。'
messages.append({'role': 'user', 'content': ctx})
a = '好的,我已經(jīng)記住這些知識庫的信息。有什么我可以幫助你解答的問題嗎?'
messages.append({'role': 'assistant', 'content': a})
messages.append({'role': 'user', 'content': query})
# 請求dashscope做QA
response = dashscope.Generation.call(
model=dashscope.Generation.Models.qwen_max,
messages=messages,
result_format='message')
if response.status_code == 200:
print(response.output) # The output text
print(response.usage) # The usage information
else:
print(response.code) # The error code.
print(response.message) # The error message.
多輪問答Python示例代碼
import json
import dashscope
from alibabacloud_alinlp20200629 import client, models
from alibabacloud_tea_openapi import models as api_models
# 創(chuàng)建一個搜索client
config = api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
region_id="cn-beijing")
aliyun_client = client.Client(config)
# query & history
query = '那鏡頭光圈呢?'
history = [
{
"role": "user",
"content": "燈泡相機TD3B的鏡頭焦距是多少"
},
{
"role": "assistant",
"content": "燈泡相機TD3B的鏡頭焦距是2.8毫米。"
}
]
# 多輪改寫
# 配置并請求多輪query改寫服務(wù)
rewrite_request = models.PostISConvRewriterRequest()
rewrite_request.algorithm = 'conversation_rewriter'
rewrite_request.model = 'dashscope-conv-rewrite-1.8b'
rewrite_request.input = {
"query": query,
"history": history
}
rewrite_response = aliyun_client.post_isconv_rewriter(rewrite_request)
# 配置一個搜索request
search_request = models.PostMSSearchEnhanceRequest()
search_request.service_id = 1007 # 控制臺搭建完后拿到
# 請求搜索并打印結(jié)果
search_request.uq = query
search_request.rows = 5 # 返回文檔數(shù)
response = aliyun_client.post_mssearch_enhance(search_request)
search_results = response.body.data["data"]["docs"]
# 構(gòu)建prompt
prompt = f'你是一個問答機器人助理,你可以回答一些問題,但你只能回答一些你所知道的問題。'
if len(search_results) != 0:
text_result_str = '\n\n'.join([f'{x.get("title", "")}: {x.get("content", "")}' for x in search_results]).strip()
prompt += f'\n\n以下信息來自你的知識庫,可能會對回答某些問題有幫助:\n\n{text_result_str}\n\n請記住這些知識庫的信息。'
prompt += f'\n\n請回答問題:{query}'
# 請求LLM
response = dashscope.Generation.call(
model=dashscope.Generation.Models.qwen_max,
prompt=prompt
)
# 打印結(jié)果
if response.status_code == 200:
print(response.output) # The output text
print(response.usage) # The usage information
else:
print(response.code) # The error code.
print(response.message) # The error message.
4.補充說明
千尋大模型搜索服務(wù)管控臺可以提供知識庫問答服務(wù),其搭建流程與搜索增強服務(wù)一致,具體流程參考前述第二章的千尋大模型搜索服務(wù)搭建(在離線算法處理及索引構(gòu)建過程中需要配置大模型引用字段)。搭建完成后可以按照下述步驟進行服務(wù)測試:
進入服務(wù)管理,找到創(chuàng)建的服務(wù),點擊服務(wù)測試。
進行LLM配置和搜索配置,具體見產(chǎn)品文檔中的多輪對話搜索。
輸入內(nèi)容進行搜索。
具體API調(diào)用參考產(chǎn)品文檔Java SDK。
5. 聯(lián)系我們
掃碼加入釘釘群: