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

DashVector x 通義千問(wèn)大模型:打造基于專(zhuān)屬知識(shí)的問(wèn)答服務(wù)

更新時(shí)間:

本教程演示如何使用向量檢索服務(wù)(DashVector),結(jié)合LLM大模型等能力,來(lái)打造基于垂直領(lǐng)域?qū)僦R(shí)等問(wèn)答服務(wù)。其中LLM大模型能力,以及文本向量生成等能力,這里基于靈積模型服務(wù)上的通義千問(wèn) API以及Embedding API來(lái)接入。

背景及實(shí)現(xiàn)思路

大語(yǔ)言模型(LLM)作為自然語(yǔ)言處理領(lǐng)域的核心技術(shù),具有豐富的自然語(yǔ)言處理能力。但其訓(xùn)練語(yǔ)料庫(kù)具有一定的局限性,一般由普適知識(shí)、常識(shí)性知識(shí),如維基百科、新聞、小說(shuō),和各種領(lǐng)域的專(zhuān)業(yè)知識(shí)組成。導(dǎo)致 LLM 在處理特定領(lǐng)域的知識(shí)表示和應(yīng)用時(shí)存在一定的局限性,特別對(duì)于垂直領(lǐng)域內(nèi),或者企業(yè)內(nèi)部等私域?qū)僦R(shí)。

實(shí)現(xiàn)專(zhuān)屬領(lǐng)域的知識(shí)問(wèn)答的關(guān)鍵,在于如何讓LLM能夠理解并獲取存在于其訓(xùn)練知識(shí)范圍外的特定領(lǐng)域知識(shí)。同時(shí)可以通過(guò)特定Prompt構(gòu)造,提示LLM在回答特定領(lǐng)域問(wèn)題的時(shí)候,理解意圖并根據(jù)注入的領(lǐng)域知識(shí)來(lái)做出回答。在通常情況下,用戶(hù)的提問(wèn)是完整的句子,而不像搜索引擎只輸入幾個(gè)關(guān)鍵字。這種情況下,直接使用關(guān)鍵字與企業(yè)知識(shí)庫(kù)進(jìn)行匹配的效果往往不太理想,同時(shí)長(zhǎng)句本身還涉及分詞、權(quán)重等處理。相比之下,倘若我們把提問(wèn)的文本,和知識(shí)庫(kù)的內(nèi)容,都先轉(zhuǎn)化為高質(zhì)量向量,再通過(guò)向量檢索將匹配過(guò)程轉(zhuǎn)化為語(yǔ)義搜索,那么提取相關(guān)知識(shí)點(diǎn)就會(huì)變得簡(jiǎn)單而高效。

接下來(lái)我們將基于中文突發(fā)事件語(yǔ)料庫(kù)(CEC Corpus)演示關(guān)于突發(fā)事件新聞報(bào)道的知識(shí)問(wèn)答。

整體流程

image.png

主要分為三個(gè)階段:

  1. 本地知識(shí)庫(kù)的向量化。通過(guò)文本向量模型將其轉(zhuǎn)化為高質(zhì)量低維度的向量數(shù)據(jù),再寫(xiě)入DashVector向量檢索服務(wù)。這里數(shù)據(jù)的向量化我們采用了靈積模型服務(wù)上的Embedding API實(shí)現(xiàn)。

  2. 相關(guān)知識(shí)點(diǎn)的提取。將提問(wèn)文本向量化后,通過(guò) DashVector 提取相關(guān)知識(shí)點(diǎn)的原文。

  3. 構(gòu)造 Prompt 進(jìn)行提問(wèn)。將相關(guān)知識(shí)點(diǎn)作為“限定上下文+提問(wèn)” 一起作為prompt詢(xún)問(wèn)通義千問(wèn)。

前提準(zhǔn)備

1. API-KEY 和 Cluster準(zhǔn)備

  • 開(kāi)通靈積模型服務(wù),并獲得 API-KEY。請(qǐng)參考:API-KEY的獲取與配置

  • 開(kāi)通DashVector向量檢索服務(wù),并獲得 API-KEY。請(qǐng)參考:DashVector API-KEY管理

  • 開(kāi)通DashVector向量檢索服務(wù),并創(chuàng)建Cluster

  • 獲取Cluster的Endpoint,Endpoint獲取請(qǐng)查看 Cluster詳情

說(shuō)明

靈積模型服務(wù)DashScope的API-KEY與DashVector的API-KEY是獨(dú)立的,需要分開(kāi)獲取。

2. 環(huán)境準(zhǔn)備

說(shuō)明

需要提前安裝 Python3.7 及以上版本,請(qǐng)確保相應(yīng)的 python 版本。

pip3 install dashvector dashscope

3. 數(shù)據(jù)準(zhǔn)備

git clone https://github.com/shijiebei2009/CEC-Corpus.git

搭建步驟

說(shuō)明

本教程所涉及的 your-xxx-api-key 以及 your-xxx-cluster-endpoint,均需要替換為您自己的API-KAY及CLUSTER_ENDPOINT后,代碼才能正常運(yùn)行。

1. 本地知識(shí)庫(kù)的向量化

CEC-Corpus 數(shù)據(jù)集包含 332 篇突發(fā)事件的新聞報(bào)道的語(yǔ)料和標(biāo)注數(shù)據(jù),這里我們只需要提取原始的新聞稿文本,并將其向量化后入庫(kù)。文本向量化的教程可以參考《基于向量檢索服務(wù)與靈積實(shí)現(xiàn)語(yǔ)義搜索》。創(chuàng)建embedding.py文件,并將如下示例代碼復(fù)制到embedding.py中:

import os

import dashscope
from dashscope import TextEmbedding

from dashvector import Client, Doc


def prepare_data(path, batch_size=25):
    batch_docs = []
    for file in os.listdir(path):
        with open(path + '/' + file, 'r', encoding='utf-8') as f:
            batch_docs.append(f.read())
            if len(batch_docs) == batch_size:
                yield batch_docs
                batch_docs = []

    if batch_docs:
        yield batch_docs


def generate_embeddings(news):
    rsp = TextEmbedding.call(
        model=TextEmbedding.Models.text_embedding_v1,
        input=news
    )
    embeddings = [record['embedding'] for record in rsp.output['embeddings']]
    return embeddings if isinstance(news, list) else embeddings[0]


if __name__ == '__main__':
    dashscope.api_key = '{your-dashscope-api-key}'
    
    # 初始化 dashvector client
    client = Client(
      api_key='{your-dashvector-api-key}',
      endpoint='{your-dashvector-cluster-endpoint}'
    )

    # 創(chuàng)建集合:指定集合名稱(chēng)和向量維度, text_embedding_v1 模型產(chǎn)生的向量統(tǒng)一為 1536 維
    rsp = client.create('news_embedings', 1536)
    assert rsp

    # 加載語(yǔ)料
    id = 0
    collection = client.get('news_embedings')
    for news in list(prepare_data('CEC-Corpus/raw corpus/allSourceText')):
        ids = [id + i for i, _ in enumerate(news)]
        id += len(news)
        
        vectors = generate_embeddings(news)
        # 寫(xiě)入 dashvector 構(gòu)建索引
        rsp = collection.upsert(
            [
                Doc(id=str(id), vector=vector, fields={"raw": doc})
                for id, vector, doc in zip(ids, vectors, news)
            ]
        )
        assert rsp

在示例中,我們將 Embedding 向量和新聞報(bào)道的文稿(作為raw字段)一起存入DashVector向量檢索服務(wù)中,以便向量檢索時(shí)召回原始文稿。

2. 知識(shí)點(diǎn)的提取

將 CEC-Corpus 數(shù)據(jù)集所有新聞報(bào)道寫(xiě)入DashVector服務(wù)后,就可以進(jìn)行快速的向量檢索。實(shí)現(xiàn)這個(gè)檢索,我們同樣將提問(wèn)的問(wèn)題進(jìn)行文本向量化后,再在DashVector服務(wù)中檢索最相關(guān)的知識(shí)點(diǎn),也就是相關(guān)新聞報(bào)道。創(chuàng)建search.py文件,并將如下示例代碼復(fù)制到search.py文件中。

from dashvector import Client

from embedding import generate_embeddings


def search_relevant_news(question):
    # 初始化 dashvector client
    client = Client(
      api_key='{your-dashvector-api-key}',
      endpoint='{your-dashvector-cluster-endpoint}'
    )

    # 獲取剛剛存入的集合
    collection = client.get('news_embedings')
    assert collection

    # 向量檢索:指定 topk = 1 
    rsp = collection.query(generate_embeddings(question), output_fields=['raw'],
                           topk=1)
    assert rsp
    return rsp.output[0].fields['raw']

3. 構(gòu)造 Prompt 向LLM(通義千問(wèn))提問(wèn)

在通過(guò)提問(wèn)搜索到相關(guān)的知識(shí)點(diǎn)后,我們就可以將 “提問(wèn) + 知識(shí)點(diǎn)” 按照特定的模板作為 prompt 向LLM發(fā)起提問(wèn)了。在這里我們選用的LLM是通義千問(wèn),這是阿里巴巴自主研發(fā)的超大規(guī)模語(yǔ)言模型,能夠在用戶(hù)自然語(yǔ)言輸入的基礎(chǔ)上,通過(guò)自然語(yǔ)言理解和語(yǔ)義分析,理解用戶(hù)意圖。可以通過(guò)提供盡可能清晰詳細(xì)的指令(prompt),來(lái)獲取更符合預(yù)期的結(jié)果。這些能力都可以通過(guò)通義千問(wèn)API來(lái)獲得。

具體我們這里設(shè)計(jì)的提問(wèn)模板格式為:請(qǐng)基于我提供的內(nèi)容回答問(wèn)題。內(nèi)容是{___},我的問(wèn)題是{___},當(dāng)然您也可以自行設(shè)計(jì)合適的模板。創(chuàng)建answer.py,并將如下示例代碼復(fù)制到answer.py中。

from dashscope import Generation


def answer_question(question, context):
    prompt = f'''請(qǐng)基于```內(nèi)的內(nèi)容回答問(wèn)題。"
	```
	{context}
	```
	我的問(wèn)題是:{question}。
    '''
    
    rsp = Generation.call(model='qwen-turbo', prompt=prompt)
    return rsp.output.text

知識(shí)問(wèn)答

做好這些準(zhǔn)備工作以后,就可以對(duì)LLM做與具體知識(shí)點(diǎn)相關(guān)的提問(wèn)了。比如在 CEC-Corpus 新聞數(shù)據(jù)集里,有如下一篇報(bào)道。因?yàn)檎麄€(gè)新聞數(shù)據(jù)集已經(jīng)在之前的步驟里,轉(zhuǎn)換成向量入庫(kù)了,我們現(xiàn)在就可以把這個(gè)新聞報(bào)道作為一個(gè)知識(shí)點(diǎn),做出針對(duì)性提問(wèn):海南定安追尾事故,發(fā)生在哪里?原因是什么?人員傷亡情況如何?,并查看相應(yīng)答案。

image.png

創(chuàng)建run.py文件,并將如下示例代碼復(fù)制到run.py文件中。

import dashscope

from search import search_relevant_news
from answer import answer_question

if __name__ == '__main__':
    dashscope.api_key = '{your-dashscope-api-key}'

    question = '海南定安追尾事故,發(fā)生在哪里?原因是什么?人員傷亡情況如何?'
    context = search_relevant_news(question)
    answer = answer_question(question, context)

    print(f'question: {question}\n' f'answer: {answer}')

9305b3a2e1597914428956d18e04ff85

可以看到,基于DashVector作為向量檢索的底座,LLM大模型的知識(shí)范疇得到了針對(duì)性的擴(kuò)展,并且能夠?qū)τ趯?zhuān)屬的特定知識(shí)領(lǐng)域做出正確的回答。

寫(xiě)在最后

從本文的范例中,可以看到DashVector作為一個(gè)獨(dú)立的向量檢索服務(wù),提供了開(kāi)箱即用的強(qiáng)大向量檢索服務(wù)能力,這些能力和各個(gè)AI模型結(jié)合,能夠衍生多樣的AI應(yīng)用的可能。這里的范例中,LLM大模型問(wèn)答,以及文本向量生成等能力,都是基于靈積模型服務(wù)上的通義千問(wèn)API和Embedding API來(lái)接入的,在實(shí)際操作中,相關(guān)能力同樣可以通過(guò)其他三方服務(wù),或者開(kāi)源模型社區(qū),比如ModelScope上的各種開(kāi)源LLM模型來(lái)實(shí)現(xiàn)。