RAG - QA + Qwen + dashscope

2024-03-25 07:20
文章标签 qwen qa rag dashscope

本文主要是介绍RAG - QA + Qwen + dashscope,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、关于项目
    • 二、准备
      • 1、安装依赖包
      • 2、准备数据集
      • 3、准备 API-Key
    • 三、代码实现
      • 准备数据
      • 生成 embeddings
      • 检索方法
      • 问答


转载改编自:qwen_doc_search_QA_based_on_dashscope.ipynb
https://github.com/modelscope/modelscope/blob/master/examples/pytorch/application/qwen_doc_search_QA_based_on_dashscope.ipynb


一、关于项目

  • dashscope : https://blog.csdn.net/lovechris00/article/details/136938486
  • Qwen : https://blog.csdn.net/lovechris00/article/details/135790058

二、准备


1、安装依赖包

# install required packages
!pip install dashvector dashscope
!pip install transformers_stream_generator python-dotenv

2、准备数据集

这里使用的是 中文突发事件语料库,由 上海大学-语义智能实验室 提供
https://github.com/shijiebei2009/CEC-Corpus

# prepare news corpus as knowledge source
!git clone https://github.com/shijiebei2009/CEC-Corpus.git

数据集内容:

../datasets/CEC-Corpus$ tree
.
├── CEC
│   ├── 交通事故
│   │   ├── 101国道密云段现惨祸客车农用车相撞致6人亡.xml
│   │   ├── 104国道浙江温岭段发生翻车事故致2死2伤.xml 
│   │   ├── ... 
│   │   └── 黑龙江五常发生特大交通事故6人死亡.xml
│   ├── 地震
│   │   ├── 上海:高层建筑普遍有震感但不会造成危害.xml 
│   │   ├── ...
│   │   ├── 重庆市区有明显震感电线杆在摇晃.xml
│   │   └── 青海发生6.3级地震震区人口密度低尚无人员伤亡.xml
│   ├── 恐怖袭击
│   │   ├── 4月7日凌晨5时,近300名穿着“警察”制服.xml
│   │   ├── 世界杯险遇恐怖袭击警方发现犯罪组织欲炸桥.xml
│   │   ├── ... 
│   │   └── 阿尔及利亚汽车炸弹爆炸11人死31人伤.xml
│   ├── 火灾
│   │   ├── 上海永嘉路老式洋房突发火灾好心市民合力救出被困老太.xml
│   │   ├── 云南丽江束河古镇昨凌晨失火.xml
│   │   ├── ... 
│   │   └── 马尼拉华人区住宅发生火灾一华人老妇被烧伤.xml
│   └── 食物中毒
│       ├── 上海一家公司70多名员工食物中毒.xml 
│       ├── ... 
│       └── 龙岗一小食店发生一起疑似中毒事件.xml
├── raw corpus (332 文件)
│   └── allSourceText
│       ├── 101国道密云段现惨祸客车农用车相撞致6人亡.txt  
│       ├── ...
│       ├── 黑龙江鸡西市20多名小学生疑似食物中毒.txt
│       └── 龙岗一小食店发生一起疑似中毒事件.txt
└── README.md

3、准备 API-Key

如果没有,可以点击申请;
阿里云需要实名认证后才能刚申请,人脸识别也很快。

  • dashvector API-Key
    https://dashvector.console.aliyun.com/cn-hangzhou/api-key
  • dashscope API-Key
    https://dashscope.console.aliyun.com/apiKey

三、代码实现

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 = 12with open(path, 'r', encoding='utf-8') as f:doc = ''count = 0for line in f:if count < chunk_size and line.strip() != '':doc += linecount += 1if count == chunk_size:batch_docs.append(doc)if len(batch_docs) == size:yield batch_docs[:]batch_docs.clear()doc = ''count = 0if batch_docs:yield batch_docs

生成 embeddings

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

id = 0
dir_path = 'xx/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_path, batch_size)):ids = [id + i for i, _ in enumerate(news)]id += len(news)# generate embedding from raw docsvectors = generate_embeddings(news)# upsert and indexret = collection.upsert([Doc(id=str(id), vector=vector, fields={"raw": doc})for id, doc, vector in zip(ids, news, vectors)])print(ret)

# check the collection status
collection = dashvector_client.get(collection_name)
rsp = collection.stats()
print(rsp)

检索方法

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

# query the top 1 results
question = '清华博士发生了什么?'
context = search_relevant_context(question, topk=1)
print(context)

2006-08-26 10:41:45
823日上午940分,京沪高速公路沧州服务区附近,一辆由北向南行驶的金杯面包车撞到高速公路护栏上,车上5名清华大学博士后研究人员及1名司机受伤,被紧急送往沧州二医院抢救。截至发稿时,仍有一名张姓博士后研究人员尚未脱离危险。

# initialize qwen 7B model
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfigtokenizer = 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等相关超参

问答

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

# test the case on plain LLM without vectorDB enhancement
question = '清华博士发生了什么?'
answer = answer_question(question, '')
print(f'question: {question}\n' f'answer: {answer}')
请基于```内的内容回答问题。"
\```\```
我的问题是:清华博士发生了什么?。question: 清华博士发生了什么?
answer: 清华博士是指清华大学的博士研究生。作为一名AI语言模型,我无法获取个人的身份信息或具体事件,因此无法回答清华博士发生了什么。如果您需要了解更多相关信息,建议您查询相关媒体或官方网站。

# test the case with knowledge
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: 8月23日上午9时40分,一辆由北向南行驶的金杯面包车撞到高速公路护栏上,车上5名清华大学博士后研究人员及1名司机受伤,被紧急送往沧州二医院抢救。

2024-03-24(日)

这篇关于RAG - QA + Qwen + dashscope的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/844231

相关文章

我的第2个AI项目-RAG with Gemma hosted on HuggingFace and Weaviate in DSPy

目录 项目简介概述时间kaggle地址主要工作和收获技术栈数据集模型表现 未来项目说明思路和原则为什么不把现在的项目做深一点?博客风格转变 bug修复版本兼容问题 项目简介 概述 本项目简要介绍了如何使用 DSPy 构建一个简单的 RAG 管道,且利用了托管在 Hugging Face 上的 Gemma LLM模型 和 Weaviate 向量数据库。 时间 2024.09

jmeter压力测试,通过LLM利用RAG实现知识库问答,NEO4J部署,GraphRAG以知识图谱在查询时增强提示实现更准确的知识库问答(9/7)

前言         这周也是杂七杂八的一天(高情商:我是一块砖,哪里需要往哪里搬),首先是接触了jemter这个压力测试工具,然后帮公司的AIGC项目编写使用手册和问答手册的第一版,并通过这个平台的智能体实现知识库问答的功能展示,以及部分个人扩展和思考(NEO4J创建知识图谱的GraphRAG)。 Jmeter         Jmeter是一个压力测试工具,一开始导师叫我熟悉的时候我还说

深入RAG优化:BGE词嵌入全解析与Landmark Embedding新突破

前面已经写过一篇关于Embedding选型的文章,《如何高效选择RAG的中文Embedding模型?揭秘最佳实践与关键标准!》,主要介绍通过开源网站的下载量和测评效果选择Embedding模型。 一、Embedding选型建议与结果 选型建议: 1、大部分模型的序列长度是 512 tokens。8192 可尝试 tao-8k,1024 可尝试 stella。 2、在专业数据领域上,嵌入

langchain 《斗破苍穹》智谱 RAG 问题搜索

目录 代码 项目介绍 模型对比实验 分块方法对比 检索方法对比 结果 10条问题 15条问题 局限性 代码 https://github.com/5zjk5/prompt-engineering/tree/master 项目介绍 《斗破苍穹》小说 RAG 问答,爬虫爬取整部小说章节,并分别保存到不同的数据源中。 txt,pdf,markdown,word。

提升LLM结果:何时使用知识图谱RAG

通过知识图谱增强 RAG 可以帮助检索,使系统能够更深入地挖掘数据集以提供详细的响应。 有时,检索增强生成 (RAG) 系统无法深入文档集以找到所需的答案。我们可能会得到泛泛的或肤浅的回复,或者我们可能会得到回复,其中 RAG 系统检索到的细节很少,然后用不相关或不正确的信息填补空白——这被称为“幻觉”。 深度知识库和文档集可能包含我们用 RAG 提示回答问题所需的所有信息,但 RAG 系统

通义千问Qwen 2大模型的预训练和后训练范式解析

LLMs,也就是大型语言模型,现在已经发展得挺厉害的。记得最开始的时候,我们只有GPT这样的模型,但现在,我们有了一些更复杂的、开放权重的模型。以前,训练这些模型的时候,我们主要就是做预训练,但现在不一样了,我们还会加上后训练这个阶段。 咱们今天就以通义千问Qwen 2这个模型为例,来好好分析一下Qwen 2的预训练和后训练都是怎么搞的。它在大型语言模型界里算是挺能打的。不过,虽然它很强

使用Cloudflare构建RAG应用;端到端语音开源大模型;AI幻灯片生成器,等六个开源项目

✨ 1: Cloudflare RAG 如何使用Cloudflare构建一个完整的RAG应用,结合多种搜索技术和AI服务。 Cloudflare RAG(Retrieval Augmented Generation)是一个全栈示例,展示如何使用 Cloudflare 构建 RAG 应用程序。该项目结合了 Cloudflare Workers、Pages、D1、KV、R2、AI Gate

风趣图解LLMs RAG的15种设计模式-第二课

全部用的是Midjourney连续性一致性绘图画成

LlamaIndex结合DSPy,进一步优化RAG系统

大家好,本文将介绍如何运用LlamaIndex和DSPy这两个工具来构建和优化检索增强型生成(Retrieval-Augmented Generation, RAG)系统。通过这两个框架的无缝结合,不仅能够简化开发过程,还能显著提高RAG系统的整体性能。接下来,将详细解析LlamaIndex与DSPy如何高效协同,带来1+1>2的效果。 1.LlamaIndex LlamaIndex 是用于构

增强RAG:选择最佳的嵌入和重排模型

对于如何选择最佳的嵌入模型和重排模型,给出了详细的步骤和代码。 在构建检索增强生成(RAG)管道时,关键组件之一是检索器。我们有多种嵌入模型可供选择,包括 OpenAI、CohereAI 和开源的sentence transformers。此外,还有来自 CohereAI 和sentence transformers的几种重排器可供选择。 但是,在所有这些选项中,我们如何确定最佳组合以获得顶级