通义千问7B-基于本地知识库问答

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 上期,我们介绍了通义千问7B模型的微调+部署方式,但在实际使用时,很多开发者还是希望能够结合特定的行业知识来增强模型效果,这时就需要通过外接知识库,让大模型能够返回更精确的结果。

导读


上期,我们介绍了通义千问7B模型的微调+部署方式,但在实际使用时,很多开发者还是希望能够结合特定的行业知识来增强模型效果,这时就需要通过外接知识库,让大模型能够返回更精确的结果。

本文将介绍一下如何从魔搭社区Notebook中,一键实现本地知识库的搭建,从而增强大模型能力。



环境配置与安装


本文在魔搭社区的PAI-DSW环境配置下运行 (24G显存)

python>=3.8


使用步骤

本文在ModelScope的Notebook的环境(这里以PAI-DSW为例)配置下运行 (可以单卡运行, 显存要求20G)


服务器连接与环境准备

1、进入ModelScope首页:modelscope.cn,进入我的Notebook


2、选择GPU环境,进入PAI-DSW在线开发环境


3、打开Notebook


4、将github中的最佳实践复制粘贴到notebook中

基于阿里云DashScope和Dashvector产品的通义千问7B基于本地知识库的最佳实践:

https://github.com/modelscope/modelscope/blob/master/examples/pytorch/application/qwen_doc_search_QA_based_on_dashscope.ipynb


基于开源langchain的通义千问7B基于本地知识库的最佳实践:

https://github.com/modelscope/modelscope/blob/master/examples/pytorch/application/qwen_doc_search_QA_based_on_langchain.ipynb



原理介绍

大模型利用知识库增强的逻辑的原理,是高效地将相关的信息从知识库中抽取出来并以提示词的方式送入大模型,大模型会根据相关知识以及本身生成能力输出用户想要的信息。


如何高效地从知识库中获取相关信息,采用的是目前广泛应用的基于向量搜索的方案。 向量搜索的原理是将文本转换为一串向量,并在向量数据库中以向量为索引,进行文本存储,召回的时候根据向量之间的空间距离进行相似召回,查找效率远高于传统数据库存储。


向量搜索依赖于背后向量搜索引擎,以及向量生成技术。本文中向量搜索引擎采用的是阿里云DashVector向量检索服务, 向量生成则采用的是阿里云DashScope提供的TextEmbedding API


这里我们想要问答基于的知识库,是开源的中文突发事件语料库,通过如下建议步骤,可借助向量检索完成基于该知识库的问答:


将开源的中文突发事件语料库,通过TextEmbedding进行向量生成;

生成好的文本向量,结合原始文本一同送入DashVector向量库,并进行建库建索引,这一步为向量建索引;

建好索引后,如果要查找相关信息,会把需要查找的信息利用相同的向量生成方法生成向量,并通过向量引擎中的召回算法快速高效地召回相似向量,以及向量所对应的原始文本,这一步为向量召回;

到这一步,即完成了高效的在知识库中的查找有效信息的能力。


之后的步骤就是将召回的文本加入到提示词中喂给大模型进行后续生成。下面我们通过代码来看一下整体流程。


代码解读


本文简单介绍一下基于阿里云DashScope和Dashvector产品的通义千问7B基于本地知识库的代码逻辑:


1、申请DashScope的AK(https://help.aliyun.com/zh/dashscope/faq#D1Hxs


2、申请Dashvector的AK(https://help.aliyun.com/document_detail/2510230.html?spm=5176.28371440.help.dexternal.6a5866d7gjWRIL


安装依赖,下载测试知识库:

# install required packages
!pip install dashvector dashscope
!pip install transformers_stream_generator python-dotenv
# prepare news corpus as knowledge source
!git clone https://github.com/shijiebei2009/CEC-Corpus.git



我们引用了DashScope作为文本生成的工具【向量生成】, DashVector作为向量检索引擎【检索引擎】


对存储引擎进行初始化

import dashscope
import os
from dotenv import load_dotenv
from dashscope import TextEmbedding
from dashvector import Client, Doc
# get env variable from .env
# please make sure DASHSCOPE_KEY is defined in .env
load_dotenv()
dashscope.api_key = os.getenv('DASHSCOPE_KEY')
# initialize DashVector for embedding's indexing and searching
dashvector_client = Client(api_key='{your-dashvector-api-key}')
# define collection name
collection_name = 'news_embeddings'
# delete if already exist
dashvector_client.delete(collection_name)
# create a collection with embedding size of 1536
rsp = dashvector_client.create(collection_name, 1536)
collection = dashvector_client.get(collection_name)



定义一个索引数据的生成方法用于后续逻辑, 从文件夹读取多个文件的方法如下

def prepare_data_from_dir(path, size):
    # prepare the data from a file folder in order to upsert to dashvector with a reasonable doc's size.
    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) == size:
                yield batch_docs[:]
                batch_docs.clear()
    if batch_docs:
        yield batch_docs



从单个大文件读取的方法如下

def prepare_data_from_file(path, size):
    # prepare the data from file in order to upsert to dashvector with a reasonable doc's size.
    batch_docs = []
    chunk_size = 12
    with open(path, 'r', encoding='utf-8') as f:
        doc = ''
        count = 0
        for line in f:
            if count < chunk_size and line.strip() != '':
                doc += line
                count += 1
            if count == chunk_size:
                batch_docs.append(doc)
                if len(batch_docs) == size:
                    yield batch_docs[:]
                    batch_docs.clear()
                doc = ''
                count = 0
    if batch_docs:
        yield batch_docs



向量Embedding基于DashScope文本向量(TextEmbedding)模型生成,这里生成的向量将作为向量引擎的索引

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



向量、原始文本数据会在这一段写入 DashVector,从而完成本地知识库索引的构建。

id = 0
dir_name = 'CEC-Corpus/raw corpus/allSourceText'
# indexing the raw docs with index to dashvector
collection = dashvector_client.get(collection_name)
# embedding api max batch size
batch_size = 4  
for news in list(prepare_data_from_dir(dir_name, batch_size)):
    ids = [id + i for i, _ in enumerate(news)]
    id += len(news)
    # generate embedding from raw docs
    vectors = generate_embeddings(news)
    # upsert and index
    ret = collection.upsert(
        [
            Doc(id=str(id), vector=vector, fields={"raw": doc})
            for id, doc, vector in zip(ids, news, vectors)
        ]
    )
    print(ret)



定义检索方法,用于召回知识库信息

def search_relevant_context(question, topk=1, client=dashvector_client):
    # query and recall the relevant information
    collection = client.get(collection_name)
    # recall the top k similiar results from dashvector
    rsp = collection.query(generate_embeddings(question), output_fields=['raw'],
                           topk=topk)
    return "".join([item.fields['raw'] for item in rsp.output])



我们检测一下召回效果

初始化ModelScope上的7B千问模型

# initialize qwen 7B model
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen-7B-Chat", revision = 'v1.0.5',trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("qwen/Qwen-7B-Chat", revision = 'v1.0.5',device_map="auto", trust_remote_code=True, fp16=True).eval()
model.generation_config = GenerationConfig.from_pretrained("Qwen/Qwen-7B-Chat",revision = 'v1.0.5', trust_remote_code=True) # 可指定不同的生成长度、top_p等相关超参


构建prompt模板

# define a prompt template for the knowledge enhanced LLM generation
def answer_question(question, context):
    prompt = f'''请基于```内的内容回答问题。"
  ```
  {context}
  ```
  我的问题是:{question}。
    '''
    history = None
    print(prompt)
    response, history = model.chat(tokenizer, prompt, history=None)
    return response


大模型原始回答

# test the case without knowledge
question = '清华博士发生了什么?'
answer = answer_question(question, '')
print(f'question: {question}\n' f'answer: {answer}')


打印输出

请基于```内的内容回答问题。"
  ```
  ```
  我的问题是:清华博士发生了什么?。
question: 清华博士发生了什么?
answer: 抱歉,我无法理解您所说的“清华博士”指的是哪个具体的事件或情况。请您提供更详细的信息,我会尽力回答您的问题。


大模型原始回答

# test the case with knowledge
question = '清华博士发生了什么?'
context = search_relevant_context(question, topk=1)
answer = answer_question(question, context)
print(f'question: {question}\n' f'answer: {answer}')


打印输出

请基于```内的内容回答问题。"
  ```
  2006-08-26 10:41:45
8月23日上午9时40分,京沪高速公路沧州服务区附近,一辆由北向南行驶的金杯面包车撞到高速公路护栏上,车上5名清华大学博士后研究人员及1名司机受伤,被紧急送往沧州二医院抢救。截至发稿时,仍有一名张姓博士后研究人员尚未脱离危险。
  ```
  我的问题是:清华博士发生了什么?。
question: 清华博士发生了什么?
answer: 一辆由北向南行驶的金杯面包车撞到高速公路护栏上,车上5名清华大学博士后研究人员及1名司机受伤。


可以看到有了千问7B模型能够基于向量检索知识库,对“清华博士发生了什么?” 这个一般情况下没有明确答案的问题,作出比较好的知识库检索和回答了。



上,就是通义千问7B基于本地知识库问答的操作和演示,其中,我们使用了阿里云DashScope的免费额度和 DashVector的免费资源的相关产品。这种方法可以让各种行业的知识库与通义千问结合,给出更加精准的答案。


DashScope链接:https://dashscope.aliyun.com/

DashVector链接:https://www.aliyun.com/activity/intelligent/DashVector


视频链接

https://live.csdn.net/v/320559

相关文章
|
5月前
|
人工智能 自然语言处理 知识图谱
Yuxi-Know:开源智能问答系统,基于大模型RAG与知识图谱技术快速构建知识库
Yuxi-Know是一个结合大模型RAG知识库与知识图谱技术的智能问答平台,支持多格式文档处理和复杂知识关系查询,具备多模型适配和智能体拓展能力。
966 55
Yuxi-Know:开源智能问答系统,基于大模型RAG与知识图谱技术快速构建知识库
|
4月前
|
自然语言处理 IDE 开发工具
通义灵码新增 Inline Chat 能力,代码行内随时问答,沉浸式编码,心流不断
通义灵码行间会话(Inline Chat)支持开发者在代码编辑器区域进行对话,开发者可以通过自然语言对话的方式进行单个文件内的代码修改或进行即时提问。
194 0
|
5月前
|
存储 人工智能 自然语言处理
RAG 实战|用 StarRocks + DeepSeek 构建智能问答与企业知识库
本文由镜舟科技解决方案架构师石强与StarRocks TSC Member赵恒联合撰写,围绕RAG(检索增强生成)技术展开,结合DeepSeek和StarRocks构建智能问答系统。RAG通过外部知识检索与AI生成相结合,解决大模型知识静态、易编造信息的问题。文章详细介绍了系统组成、操作流程及优化方法,包括DeepSeek部署、StarRocks向量索引配置、知识存储与提取等环节,并通过代码示例演示了从文本向量化到生成回答的完整过程。最后,加入RAG机制后,系统性能显著提升,支持企业级知识库与智能客服场景。文中还提供了Web可视化界面实现方案,助力开发者快速上手。
|
3月前
|
人工智能 自然语言处理 数据挖掘
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
|
3月前
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
|
2月前
|
存储 自然语言处理 监控
民航机场大模型私有知识库搭建步骤:技术选型 + 实施路径全解析!
近年来,民航机场面临知识管理难题,大模型技术为构建高效、安全的企业知识库提供了新思路。本文介绍知识库发展历程、大模型应用挑战,并详述私有化部署策略与八大实施步骤,助力民航提升运营效率与服务质量。
|
3月前
|
人工智能 数据库
智能体(AI Agent)开发实战之【LangChain】(四)结合大模型基于RAG实现本地知识库问答和纠错
本文介绍如何基于RAG实现知识库问答系统的输入内容纠错功能。通过加载本地知识库、构建向量数据库,结合大语言模型对输入文本进行检索比对与纠错优化,提升问答准确性。
|
4月前
|
人工智能 自然语言处理 数据库
云上玩转Qwen3系列之二:PAI-LangStudio搭建联网搜索和RAG增强问答应用
本文详细介绍了如何使用 PAI-LangStudio 和 Qwen3 构建基于 RAG 和联网搜索 的 AI 智能问答应用。该应用通过将 RAG、web search 等技术和阿里最新的推理模型 Qwen3 编排在一个应用流中,为大模型提供了额外的联网搜索和特定领域知识库检索的能力,提升了智能回答的效果,减少了幻觉。开发者可以基于该模板进行灵活扩展和二次开发,以满足特定场景的需求。

热门文章

最新文章