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

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

背景及实现思路


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


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


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



整体流程



主要分为三个阶段:

  1. 本地知识库的向量化。通过文本向量模型将其转化为高质量低维度的向量数据,再写入DashVector向量检索服务。这里数据的向量化我们采用了灵积模型服务上的Embedding API实现。
  2. 相关知识点的提取。将提问文本向量化后,通过 DashVector 提取相关知识点的原文。
  3. 构造 Prompt 进行提问。将相关知识点作为“限定上下文+提问” 一起作为prompt询问通义千问。



前提准备


1. 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 篇突发事件的新闻报道的语料和标注数据,这里我们只需要提取原始的新闻稿文本,并将其向量化后入库。文本向量化的教程可以参考《基于向量检索服务与灵积实现语义搜索》。示例代码如下:

importosimportdashscopefromdashscopeimportTextEmbeddingfromdashvectorimportClient, Docdefprepare_data(path, batch_size=25):
batch_docs= []
forfileinos.listdir(path):
withopen(path+'/'+file, 'r', encoding='utf-8') asf:
batch_docs.append(f.read())
iflen(batch_docs) ==batch_size:
yieldbatch_docsbatch_docs= []
ifbatch_docs:
yieldbatch_docsdefgenerate_embeddings(news):
rsp=TextEmbedding.call(
model=TextEmbedding.Models.text_embedding_v1,
input=news    )
embeddings= [record['embedding'] forrecordinrsp.output['embeddings']]
returnembeddingsifisinstance(news, list) elseembeddings[0]
if__name__=='__main__':
dashscope.api_key='{your-dashscope-api-key}'# 初始化 dashvector clientclient=Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'    )
# 创建集合:指定集合名称和向量维度, text_embedding_v1 模型产生的向量统一为 1536 维rsp=client.create('news_embedings', 1536)
assertrsp# 加载语料id=0collection=client.get('news_embedings')
fornewsinlist(prepare_data('CEC-Corpus/raw corpus/allSourceText')):
ids= [id+ifori, _inenumerate(news)]
id+=len(news)
vectors=generate_embeddings(news)
# 写入 dashvector 构建索引rsp=collection.upsert(
            [
Doc(id=str(id), vector=vector, fields={"raw": doc})
forid, vector, docinzip(ids, vectors, news)
            ]
        )
assertrsp

在示例中,我们将 Embedding 向量和新闻报道的文稿(作为raw字段)一起存入DashVector向量检索服务中,以便向量检索时召回原始文稿。


2. 知识点的提取

将 CEC-Corpus 数据集所有新闻报道写入DashVector服务后,就可以进行快速的向量检索。实现这个检索,我们同样将提问的问题进行文本向量化后,再在DashVector服务中检索最相关的知识点,也就是相关新闻报道。

fromdashvectorimportClientfromembeddingimportgenerate_embeddingsdefsearch_relevant_news(question):
# 初始化 dashvector clientclient=Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'    )
# 获取刚刚存入的集合collection=client.get('news_embedings')
assertcollection# 向量检索:指定 topk = 1 rsp=collection.query(generate_embeddings(question), output_fields=['raw'],
topk=1)
assertrspreturnrsp.output[0].fields['raw']


3. 构造 Prompt 向LLM(通义千问)提问

在通过提问搜索到相关的知识点后,我们就可以将 “提问 + 知识点” 按照特定的模板作为 prompt 向LLM发起提问了。在这里我们选用的LLM是通义千问,这是阿里巴巴自主研发的超大规模语言模型,能够在用户自然语言输入的基础上,通过自然语言理解和语义分析,理解用户意图。可以通过提供尽可能清晰详细的指令(prompt),来获取更符合预期的结果。这些能力都可以通过通义千问API来获得。

具体我们这里设计的提问模板格式为:请基于我提供的内容回答问题。内容是{___},我的问题是{___},当然您也可以自行设计合适的模板。

fromdashscopeimportGenerationdefanswer_question(question, context):
prompt=f'''请基于```内的内容回答问题。"    ```{context}
    ```    我的问题是:{question}    '''rsp=Generation.call(model='qwen-turbo', prompt=prompt)
returnrsp.output.text




知识问答


做好这些准备工作以后,就可以对LLM做与具体知识点相关的提问了。比如在 CEC-Corpus 新闻数据集里,有如下一篇报道。因为整个新闻数据集已经在之前的步骤里,转换成向量入库了,我们现在就可以把这个新闻报道作为一个知识点,做出针对性提问:海南安定追尾事故,发生在哪里?原因是什么?人员伤亡情况如何?,并查看相应答案。



importdashscopefromsearchimportsearch_relevant_newsfromanswerimportanswer_questionif__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}')



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


写在最后

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

相关文章
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
【大模型】使用哪些资源来了解 LLM 的最新进展?
【5月更文挑战第9天】【大模型】使用哪些资源来了解 LLM 的最新进展?
|
4天前
|
机器学习/深度学习 人工智能 JSON
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
LLM 大模型学习必知必会系列(一):大模型基础知识篇
LLM 大模型学习必知必会系列(一):大模型基础知识篇
LLM 大模型学习必知必会系列(一):大模型基础知识篇
|
4天前
|
自然语言处理 搜索推荐 知识图谱
【大模型】描述与 LLM 相关的个人项目或感兴趣的领域
【5月更文挑战第9天】【大模型】描述与 LLM 相关的个人项目或感兴趣的领域
|
4天前
|
存储 安全 数据安全/隐私保护
【大模型】如何确保负责任地开发和部署 LLM?
【5月更文挑战第7天】【大模型】如何确保负责任地开发和部署 LLM?
|
4天前
|
机器学习/深度学习 人工智能 安全
【大模型】LLM的广泛采用有哪些潜在的社会影响?
【5月更文挑战第7天】【大模型】LLM的广泛采用有哪些潜在的社会影响?
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
【大模型】LLM研究和开发的一些新兴趋势
【5月更文挑战第7天】【大模型】LLM研究和开发的一些新兴趋势
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
【大模型】如何向非技术受众解释LLM的概念及其能力?
【5月更文挑战第7天】【大模型】如何向非技术受众解释LLM的概念及其能力?
|
4天前
|
监控 搜索推荐 安全
【大模型】哪些关键考虑因素使用 LLM 进行客户服务交互
【5月更文挑战第7天】【大模型】哪些关键考虑因素使用 LLM 进行客户服务交互
|
4天前
|
UED
【大模型】如何诊断和解决LLM 开始生成令人反感或与事实不符的输出?
【5月更文挑战第7天】【大模型】如何诊断和解决LLM 开始生成令人反感或与事实不符的输出?