首页 > 其他分享 >DashVector x 通义千问大模型:打造基于专属知识的问答服务

DashVector x 通义千问大模型:打造基于专属知识的问答服务

时间:2024-05-17 13:53:36浏览次数:21  
标签:DashVector 千问 question API LLM news 向量 通义

本教程演示如何使用向量检索服务(DashVector,结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务。其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问 API以及Embedding API来接入。

背景及实现思路

大语言模型(LLM)作为自然语言处理领域的核心技术,具有丰富的自然语言处理能力。但其训练语料库具有一定的局限性,一般由普适知识、常识性知识,如维基百科、新闻、小说,和各种领域的专业知识组成。导致 LLM 在处理特定领域的知识表示和应用时存在一定的局限性,特别对于垂直领域内,或者企业内部等私域专属知识。

实现专属领域的知识问答的关键,在于如何让LLM能够理解并获取存在于其训练知识范围外的特定领域知识。同时可以通过特定Prompt构造,提示LLM在回答特定领域问题的时候,理解意图并根据注入的领域知识来做出回答。在通常情况下,用户的提问是完整的句子,而不像搜索引擎只输入几个关键字。这种情况下,直接使用关键字与企业知识库进行匹配的效果往往不太理想,同时长句本身还涉及分词、权重等处理。相比之下,倘若我们把提问的文本,和知识库的内容,都先转化为高质量向量,再通过向量检索将匹配过程转化为语义搜索,那么提取相关知识点就会变得简单而高效。

接下来我们将基于中文突发事件语料库(CEC Corpus)演示关于突发事件新闻报道的知识问答。

整体流程

image
主要分为三个阶段:

本地知识库的向量化。通过文本向量模型将其转化为高质量低维度的向量数据,再写入DashVector向量检索服务。这里数据的向量化我们采用了灵积模型服务上的Embedding API实现。

相关知识点的提取。将提问文本向量化后,通过 DashVector 提取相关知识点的原文。

构造 Prompt 进行提问。将相关知识点作为“限定上下文+提问” 一起作为prompt询问通义千问。

前提准备

1. API-KEY 和 Cluster准备
开通灵积模型服务,并获得 API-KEY。请参考:开通DashScope并创建API-KEY。

开通DashVector向量检索服务,并获得 API-KEY。请参考:DashVector API-KEY管理。

开通DashVector向量检索服务,并创建Cluster。

获取Cluster的Endpoint,Endpoint获取请查看 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
创建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}')

image

可以看到,基于DashVector作为向量检索的底座,LLM大模型的知识范畴得到了针对性的扩展,并且能够对于专属的特定知识领域做出正确的回答。

写在最后

从本文的范例中,可以看到DashVector作为一个独立的向量检索服务,提供了开箱即用的强大向量检索服务能力,这些能力和各个AI模型结合,能够衍生多样的AI应用的可能。这里的范例中,LLM大模型问答,以及文本向量生成等能力,都是基于灵积模型服务上的通义千问API和Embedding API来接入的,在实际操作中,相关能力同样可以通过其他三方服务,或者开源模型社区,比如ModelScope上的各种开源LLM模型来实现。


免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector
image

标签:DashVector,千问,question,API,LLM,news,向量,通义
From: https://www.cnblogs.com/DashVector/p/18197648

相关文章

  • 通义千问 2.5 “客串” ChatGPT4,你分的清吗?
    作者:张添翼、董艺荃引子OpenAI发布了最新的GPT-4o模型,通义千问也在前不久刚发布通义千问2.5,已经和GPT-4-Turbo不分伯仲:既然目前还没有和GPT-4o文本生成能力的对比数据,就让我们来和大模型一起做个游戏测试一下:我们让通义千问2.5扮演GPT4,来和真正的GPT4进行问答P......
  • LLM-通义千问:MyBatis-Plus 多租户插件
    MyBatis-Plus(简称MP)是一个对MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。多租户(Multi-Tenant)是一种软件架构技术,它允许多个组织(即“租户”)共享同一应用程序的实例,但每个组织的数据都是隔离且私有的。在多租户场景下,MyBatis-Plus提供了一种插件......
  • LLM-通义千问:掌握的Java知识过于零散,怎么系统地串一串
    要系统地整理和深化你的Java知识,可以遵循以下几个步骤和策略:1.回顾基础语言基础:从Java的基本语法开始,包括变量声明、数据类型、运算符、控制结构(if-else,for,while等)、数组和方法定义。面向对象编程:深入理解类与对象、继承、封装、多态这些核心概念,并实践如何设计良好的类......
  • 告别繁琐阅读,阿里通义智文阅读助手带您轻松畅游知识海洋!
    哈喽,大家好,我是木头左,致力于程序服务生活!一、阿里通义智文阅读助手简介阿里通义智文阅读助手是一款基于人工智能技术的阅读辅助工具,可以帮助用户更高效地阅读和理解各种类型的文档,如PPT、图片和PDF等。通过深度学习技术,助手能够识别文档中的关键信息,为用户提供智能摘要、关键......
  • 手绘与文字的完美结合:阿里的通义万相涂鸦作画体验分享
    哈喽,大家好,我是木头左,AI改变生活!一、涂鸦作画简介涂鸦作画是一款基于人工智能技术的绘画工具,用户可以通过简单的手绘操作,结合文字描述,快速生成具有个性的艺术作品。这款工具的出现,让看到了科技与艺术的完美结合,为的生活带来了无限的想象空间。二、如何使用涂鸦作画?注册并登......
  • 通义灵码企业版正式发布,满足企业私域知识检索、数据合规、统一管理等需求
    5月9日阿里云AI峰会,阿里云智能集团首席技术官周靖人宣布,通义灵码企业版正式发布,满足企业用户的定制化需求,帮助企业提升研发效率。通义灵码是国内用户规模第一的智能编码助手,基于SOTA水准的通义千问代码模型Code-Qwen1.5研发,插件下载量已超350万。通义灵码熟练掌握J......
  • 通义灵码企业版正式发布,满足企业私域知识检索、数据合规、统一管理等需求
    5月9日阿里云AI峰会,阿里云智能集团首席技术官周靖人宣布,通义灵码企业版正式发布,满足企业用户的定制化需求,帮助企业提升研发效率。通义灵码是国内用户规模第一的智能编码助手,基于SOTA水准的通义千问代码模型Code-Qwen1.5研发,插件下载量已超350万。通义灵码熟练掌握J......
  • AI 001 号员工通义灵码入职阿里云丨阿里云云原生 4 月产品月报
    云原生月度动态云原生是企业数字创新的最短路径。《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。趋势热点......
  • 通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?
    作者:别象进入2024年,AI热度持续上升,翻阅科技区的文章,AI可谓是军书十二卷,卷卷有爷名。而麦肯锡最近的研究报告显示,软件工程是AI影响最大的领域之一,AI已经成为了软件工程的必选项,也有研究称开发者每天的事务性工作可能占到了七成左右,比如单侧编写等,而这部分恰好是AI所擅长......
  • 通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?
    作者:别象进入2024年,AI热度持续上升,翻阅科技区的文章,AI可谓是军书十二卷,卷卷有爷名。而麦肯锡最近的研究报告显示,软件工程是AI影响最大的领域之一,AI已经成为了软件工程的必选项,也有研究称开发者每天的事务性工作可能占到了七成左右,比如单侧编写等,而这部分恰好是AI所擅长......