日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

千尋搜索+靈積千問LLM搭建專屬知識庫問答最佳實踐

image.png

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ù)需要以下五個步驟:

  1. 申請試用

  2. 購買資源

  3. 準備數(shù)據(jù)

  4. 配置服務(wù)

  5. 測試服務(wù)

1.1. 申請試用流程

  • step1,開通nlp服務(wù)

image.png

  • step2,進入nlp管控臺

image.png

  • step3,登錄阿里云賬號

image.png

  • step4,點擊進入千尋大模型搜索平臺

image

付費開通產(chǎn)品之后即可使用。

1.2. 購買資源

需要購買的資源包括:

  • 搜索引擎

  • 數(shù)據(jù)存儲

1.2.1. 搜索引擎

搜索引擎提供檢索服務(wù)的基礎(chǔ)組建,可在資源中心-引擎管理添加引擎也可在概覽-創(chuàng)建服務(wù)直接選擇或添加。若沒有可用的引擎,點擊我需要購買新的引擎

image.png

image.png

以下是已適配的引擎列表,可以根據(jù)實際需求進行調(diào)整:

已適配引擎列表

版本

配置

插件

鏈接

阿里云Elasticsearch

  • V8.9

  • V7.10

  • 非向量需求場景不小于2核8G

  • 向量需求場景建議不小于8核32G

  • 引擎配置流程:

  1. 選擇規(guī)格:非向量需求場景不小于2核8G,向量需求場景建議不小于8核32G。

  2. 選擇插件:需要安裝aliws插件,配置與管理-插件配置-系統(tǒng)默認插件列表。

image.png

  1. 配置安全鏈接:在ES實例的配置與管理-安全配置中開啟公網(wǎng)訪問,然后IP段加入白名單中(具體IP段配置聯(lián)系@張家棟,釘釘群二維碼可見文檔最后)。

image.pngimage.png

  • 添加引擎:

引擎配置完成后即可將ES實例的基本信息中公網(wǎng)地址和公網(wǎng)端口添加到千尋大模型搜索的引擎管理中。操作如下:

image.png

image.png

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)建方式:

  1. RDS數(shù)據(jù)源:適用于存儲數(shù)據(jù)庫類型的數(shù)據(jù),可靈活選擇數(shù)據(jù)庫庫表字段進行解析,構(gòu)建索引。

  2. OSS數(shù)據(jù)源:適用于存儲文件類型的數(shù)據(jù),可指定bucket及子路徑并對指定文件類型進行解析,構(gòu)建索引。

  3. 混合數(shù)據(jù)源:當(dāng)接入數(shù)據(jù)源同時存在文件類型及數(shù)據(jù)庫類型數(shù)據(jù)時,需要選擇混合數(shù)據(jù)源的方式進行接入。

其中混合數(shù)據(jù)源接入需購買RDS,購買后進入RDS管控臺進行如下配置:

  1. 服務(wù)地址:開啟外網(wǎng)地址后,將該外網(wǎng)地址用于企業(yè)搜索管控臺錄入數(shù)據(jù)庫地址。

image.png

  1. 網(wǎng)絡(luò)配置:進入RDS實例,白名單與安全組-白名單設(shè)置-添加白名單分組(具體IP段配置聯(lián)系@張家棟,釘釘群二維碼可見文檔最后)。

image.png

  1. 賬號創(chuàng)建:進入RDS實例,賬號管理-用戶賬號-創(chuàng)建賬號。

image.png將RDS實例的數(shù)據(jù)庫鏈接信息中外網(wǎng)地址和外網(wǎng)端口添加到千尋大模型搜索的數(shù)據(jù)源管理中。

image.png

1.3. 準備數(shù)據(jù)

在數(shù)據(jù)存儲服務(wù)準備完成后,可以對數(shù)據(jù)存儲服務(wù)中進行數(shù)據(jù)導(dǎo)入和對接,在格式上需要做一些對齊操作:

  1. RDS數(shù)據(jù)源:支持數(shù)據(jù)庫類型數(shù)據(jù)的接入。解析字段同所選數(shù)據(jù)庫庫表字段,非固定可選。若解析數(shù)據(jù)為faq類型,要求數(shù)據(jù)庫庫表字段類型為:id、question、answer、sim_question、url、gmt_modified。

  2. OSS數(shù)據(jù)源:支持文件類型數(shù)據(jù)的接入。支持解析的文件格式.pdf/.docx/.txt/.md/.html,解析字段為默認字段,固定全選。若解析數(shù)據(jù)為faq類型,則支持解析的文件格式為.csv/.xlsx,要求數(shù)據(jù)源字段類型為id、question、answer、sim_question、url。

  3. 混合數(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ù)源的格式要求。

image.png

1.4. 配置服務(wù)

在搜索引擎和數(shù)據(jù)準備完成之后,便可以回到千尋大模型搜索服務(wù)的控制臺開始搜索服務(wù)的創(chuàng)建和配置了,具體步驟如下:

1.4.1. 創(chuàng)建搜索服務(wù)

  1. 概覽-搜索增強-創(chuàng)建服務(wù),進入服務(wù)創(chuàng)建界面。

image

  1. 編輯服務(wù)名稱并選擇服務(wù)所使用的引擎,完成創(chuàng)建中進入索引配置。

image

image

其中,索引配置的關(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-v1text-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ù),則需退出流程,更改字段名稱。

  1. 打開關(guān)聯(lián)文件數(shù)據(jù)開關(guān),文件存儲類型支持OSS和HTTP兩種。選擇OSS需要配置對應(yīng)的OSS數(shù)據(jù)源,文件路徑字段內(nèi)容為源文件的OSS路徑;選擇HTTP,文件路徑字段為可下載鏈接。

image

  1. 設(shè)置主鍵、數(shù)據(jù)更新所依據(jù)時間字段、搜索字段、接口返回字段、是否自動更新。

image

概念解釋如下:

  • 主鍵

數(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. 配置加載

  1. 點擊創(chuàng)建,開始創(chuàng)建服務(wù),等待數(shù)據(jù)處理和導(dǎo)入引擎。

image

  1. 服務(wù)創(chuàng)建成功。

image

1.5. 測試服務(wù)

目前服務(wù)測試提供兩種方式:

  1. 管控臺測試;

  2. SDK測試。

1.5.1. 管控臺測試:

  1. 進入服務(wù)管理,找到創(chuàng)建的服務(wù),點擊服務(wù)測試

image

  1. 輸入搜索參數(shù)進行搜索,搜索參數(shù)配置詳見產(chǎn)品文檔中的請求入?yún)ⅲ?/a>。

image

image.png

1.5.2. SDK測試

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 install alibabacloud-alinlp20200629

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

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

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這種開源模型:

  • 獨有模型

image.png

  • 開源模型

image.png

更多模型相關(guān)內(nèi)容參考文檔:模型列表

2.2. 開通和搭建

靈積LLM服務(wù)的開通和搭建可以參考阿里云官網(wǎng)的相關(guān)信息:快速入門

3. 問答在線鏈路搭建

在完成了搜索服務(wù)搭建并打通了靈積LLM的服務(wù)之后,我們便具備了:

  1. 知識庫搜索的能力;

  2. 大模型的生成能力。

接下來可以這兩種能力相結(jié)合,組建一個完整的知識庫在線問答的鏈路,流程如下圖所示:

image.png

分階段樣例說明

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ù)測試:

  1. 進入服務(wù)管理,找到創(chuàng)建的服務(wù),點擊服務(wù)測試

image

  1. 進行LLM配置和搜索配置,具體見產(chǎn)品文檔中的多輪對話搜索。

image

  1. 輸入內(nèi)容進行搜索。

image

  1. 具體API調(diào)用參考產(chǎn)品文檔Java SDK。

5. 聯(lián)系我們

掃碼加入釘釘群:

image