dashvector x 通义千问大模型:打造基于专属知识的问答服务-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 320
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2024-05-13 18:19
文章分类
文章存档

2024年(4)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 大数据

2024-05-24 14:02:13

本教程演示如何使用向量检索服务(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 和 cluster准备

  • 开通灵积模型服务,并获得 api-key。请参考:。

  • 开通dashvector向量检索服务,并获得 api-key。请参考:dashvector 

  • 开通dashvector向量检索服务,并。

  • 获取cluster的endpoint,endpoint获取请查看 。

:
  •     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服务中检索{banned}{banned}{banned}最佳佳佳相关的知识点,也就是相关新闻报道。创建search.py文件,并将如下示例代码复制到search.py文件中。


    1. from dashvector import client

    2. from embedding import generate_embeddings


    3. def search_relevant_news(question):
    4.     # 初始化 dashvector client
    5.     client = client(
    6.       api_key='{your-dashvector-api-key}',
    7.       endpoint='{your-dashvector-cluster-endpoint}'
    8.     )

    9.     # 获取刚刚存入的集合
    10.     collection = client.get('news_embedings')
    11.     assert collection

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


    3. 构造 prompt 向llm(通义千问)提问

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


    具体我们这里设计的提问模板格式为:请基于我提供的内容回答问题。内容是{___},我的问题是{___},当然您也可以自行设计合适的模板。创建answer.py,并将如下示例代码复制到answer.py中。


    1. from dashscope import generation


    2. def answer_question(question, context):
    3.     prompt = f'''请基于```内的内容回答问题。"
    4.     ```
    5.     {context}
    6.     ```
    7.     我的问题是:{question}。
    8.     '''
    9.     
    10.     rsp = generation.call(model='qwen-turbo', prompt=prompt)
    11.     return rsp.output.text


    知识问答

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


    创建run.py文件,并将如下示例代码复制到run.py文件中。


    1. import dashscope

    2. from search import search_relevant_news
    3. from answer import answer_question

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

    6.     question = '海南安定追尾事故,发生在哪里?原因是什么?人员伤亡情况如何?'
    7.     context = search_relevant_news(question)
    8.     answer = answer_question(question, context)

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


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


    写在{banned}最佳后

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

    阅读(19) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    ")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
    网站地图