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

DashVector x 通義千問大模型:打造基于專屬知識的問答服務

本教程演示如何使用向量檢索服務(DashVector),結合LLM大模型等能力,來打造基于垂直領域專屬知識等問答服務。其中LLM大模型能力,以及文本向量生成等能力,這里基于靈積模型服務上的通義千問 API以及Embedding API來接入。

背景及實現思路

大語言模型(LLM)作為自然語言處理領域的核心技術,具有豐富的自然語言處理能力。但其訓練語料庫具有一定的局限性,一般由普適知識、常識性知識,如維基百科、新聞、小說,和各種領域的專業知識組成。導致 LLM 在處理特定領域的知識表示和應用時存在一定的局限性,特別對于垂直領域內,或者企業內部等私域專屬知識。

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

接下來我們將基于中文突發事件語料庫(CEC Corpus)演示關于突發事件新聞報道的知識問答。

整體流程

image.png

主要分為三個階段:

  1. 本地知識庫的向量化。通過文本向量模型將其轉化為高質量低維度的向量數據,再寫入DashVector向量檢索服務。這里數據的向量化我們采用了靈積模型服務上的Embedding API實現。

  2. 相關知識點的提取。將提問文本向量化后,通過 DashVector 提取相關知識點的原文。

  3. 構造 Prompt 進行提問。將相關知識點作為“限定上下文+提問” 一起作為prompt詢問通義千問。

前提準備

1. API-KEY 和 Cluster準備

說明

靈積模型服務DashScope的API-KEY與DashVector的API-KEY是獨立的,需要分開獲取。

2. 環境準備

說明

需要提前安裝 Python3.7 及以上版本,請確保相應的 python 版本。

pip3 install dashvector dashscope

3. 數據準備

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

搭建步驟

說明

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

1. 本地知識庫的向量化

CEC-Corpus 數據集包含 332 篇突發事件的新聞報道的語料和標注數據,這里我們只需要提取原始的新聞稿文本,并將其向量化后入庫。文本向量化的教程可以參考《基于向量檢索服務與靈積實現語義搜索》。創建embedding.py文件,并將如下示例代碼復制到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}'
    )

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

    # 加載語料
    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)
        # 寫入 dashvector 構建索引
        rsp = collection.upsert(
            [
                Doc(id=str(id), vector=vector, fields={"raw": doc})
                for id, vector, doc in zip(ids, vectors, news)
            ]
        )
        assert rsp

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

2. 知識點的提取

將 CEC-Corpus 數據集所有新聞報道寫入DashVector服務后,就可以進行快速的向量檢索。實現這個檢索,我們同樣將提問的問題進行文本向量化后,再在DashVector服務中檢索最相關的知識點,也就是相關新聞報道。創建search.py文件,并將如下示例代碼復制到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. 構造 Prompt 向LLM(通義千問)提問

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

具體我們這里設計的提問模板格式為:請基于我提供的內容回答問題。內容是{___},我的問題是{___},當然您也可以自行設計合適的模板。創建answer.py,并將如下示例代碼復制到answer.py中。

from dashscope import Generation


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

知識問答

做好這些準備工作以后,就可以對LLM做與具體知識點相關的提問了。比如在 CEC-Corpus 新聞數據集里,有如下一篇報道。因為整個新聞數據集已經在之前的步驟里,轉換成向量入庫了,我們現在就可以把這個新聞報道作為一個知識點,做出針對性提問:海南定安追尾事故,發生在哪里?原因是什么?人員傷亡情況如何?,并查看相應答案。

image.png

創建run.py文件,并將如下示例代碼復制到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 = '海南定安追尾事故,發生在哪里?原因是什么?人員傷亡情況如何?'
    context = search_relevant_news(question)
    answer = answer_question(question, context)

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

9305b3a2e1597914428956d18e04ff85

可以看到,基于DashVector作為向量檢索的底座,LLM大模型的知識范疇得到了針對性的擴展,并且能夠對于專屬的特定知識領域做出正確的回答。

寫在最后

從本文的范例中,可以看到DashVector作為一個獨立的向量檢索服務,提供了開箱即用的強大向量檢索服務能力,這些能力和各個AI模型結合,能夠衍生多樣的AI應用的可能。這里的范例中,LLM大模型問答,以及文本向量生成等能力,都是基于靈積模型服務上的通義千問API和Embedding API來接入的,在實際操作中,相關能力同樣可以通過其他三方服務,或者開源模型社區,比如ModelScope上的各種開源LLM模型來實現。