什么是RAG?
RAG:检索增强生成(Retrieval Augmented Generation)。
RAG的提出背景:
在实际业务场景中,通用的基础大模型可能存在无法满足我们需求的情况,主要有以下几方面原因:
知识局限性:大模型的知识来源于训练数据,而这些数据主要来自于互联网上已经公开的资源,对于一些实时性的或者非公开的,由于大模型没有获取到相关数据,这部分知识也就无法被掌握。
数据安全性:为了使得大模型能够具备相应的知识,就需要将数据纳入到训练集进行训练。然而,对于企业来说,数据的安全性至关重要,任何形式的数据泄露都可能对企业构成致命的威胁。
大模型幻觉:由于大模型是基于概率统计进行构建的,其输出本质上是一系列数值运算。因此,有时会出现模型“一本正经地胡说八道”的情况,尤其是在大模型不具备的知识或不擅长的场景中。
RAG方法通过引入外部知识,使大模型能够生成准确且符合上下文的答案,同时能够减少模型幻觉的出现。由于RAG简单有效,它已经成为主流的大模型应用方案之一。
RAG的三个步骤
索引:将文档库分割成较短的 Chunk,即文本块或文档片段,然后构建成向量索引。
检索:计算问题和 Chunks 的相似度,检索出若干个相关的 Chunk。
生成:将检索到的Chunks作为背景信息,生成问题的回答。
目前,开源社区中已经涌现出了众多RAG框架,例如:
-
TinyRAG:DataWhale成员宋志学精心打造的纯手工搭建RAG框架。
-
LlamaIndex:一个用于构建大语言模型应用程序的数据框架,包括数据摄取、数据索引和查询引擎等功能。
-
LangChain:一个专为开发大语言模型应用程序而设计的框架,提供了构建所需的模块和工具。
-
QAnything:网易有道开发的本地知识库问答系统,支持任意格式文件或数据库。
-
RAGFlow:InfiniFlow开发的基于深度文档理解的RAG引擎。
-
···
这些开源项目各具优势,功能丰富,极大的推动了RAG技术的发展。
然而,随着这些框架功能的不断扩展,学习者不可避免地需要承担较高的学习成本。
源2.0-2B RAG实战
下载源码
git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git cp AICamp_yuan_baseline/Task\ 3:源大模型RAG实战/* .
2.1 环境准备
【1】查看已安装依赖
【2】安装 streamlit
2.2 模型下载
【3.1】向量模型下载
【3.2】源大模型下载
2.3 RAG实战
【4】 导入所需的库
# 导入所需的库
from typing import List
import numpy as np
import torch
from transformers import AutoModel, AutoTokenizer, AutoModelForCausalLM
【5】定义向量模型类
# 定义向量模型类
class EmbeddingModel:
"""
class for EmbeddingModel
"""
def __init__(self, path: str) -> None:
self.tokenizer = AutoTokenizer.from_pretrained(path)
self.model = AutoModel.from_pretrained(path).cuda()
print(f'Loading EmbeddingModel from {path}.')
def get_embeddings(self, texts: List) -> List[float]:
"""
calculate embedding for text list
"""
encoded_input = self.tokenizer(texts, padding=True, truncation=True, return_tensors='pt')
encoded_input = {k: v.cuda() for k, v in encoded_input.items()}
with torch.no_grad():
model_output = self.model(**encoded_input)
sentence_embeddings = model_output[0][:, 0]
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
return sentence_embeddings.tolist()
print("> Create embedding model...")
embed_model_path = './AI-ModelScope/bge-small-zh-v1___5'
embed_model = EmbeddingModel(embed_model_path)
【6】定义大语言模型类
class LLM: """ class for Yuan2.0 LLM """ def __init__(self, model_path: str) -> None: print("Creat tokenizer...") self.tokenizer = AutoTokenizer.from_pretrained(model_path, add_eos_token=False, add_bos_token=False, eos_token='<eod>') self.tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True) print("Creat model...") self.model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, trust_remote_code=True).cuda() print(f'Loading Yuan2.0 model from {model_path}.') def generate(self, question: str, context: List): if context: prompt = f'背景:{context}\n问题:{question}\n请基于背景,回答问题。' else: prompt = question prompt += "<sep>" inputs = self.tokenizer(prompt, return_tensors="pt")["input_ids"].cuda() outputs = self.model.generate(inputs, do_sample=False, max_length=1024) output = self.tokenizer.decode(outputs[0]) print(output.split("<sep>")[-1])
print("> Create Yuan2.0 LLM...")
model_path = './IEITYuan/Yuan2-2B-Mars-hf'
llm = LLM(model_path)
LLM
类的入口是生成函数 generate()
,它有两个参数:
-
question
: 用户提问,是一个str字符串 -
context
: 检索到的上下文信息,是一个List,默认是[],代表没有使用RAG
知识库:knowledge.txt
广州大学(Guangzhou University),简称广大(GU),是由广东省广州市人民政府举办的全日制普通高等学校,实行省市共建、以市为主的办学体制,是国家“111计划”建设高校、广东省和广州市高水平大学重点建设高校。广州大学的办学历史可以追溯到1927年创办的私立广州大学;1951年并入华南联合大学;1983年筹备复办,1984年定名为广州大学;2000年7月,经教育部批准,与广州教育学院(1953年创办)、广州师范学院(1958年创办)、华南建设学院西院(1984年创办)、广州高等师范专科学校(1985年创办)合并组建成立新的广州大学。
郑州机械研究所有限公司(以下简称郑机所)的前身机械科学研究院1956年始建于北京,是原机械工业部直属一类综合研究院所,现隶属于国资委中国机械科学研究总院集团有限公司。郑机所伴随着共和国的成长一路走来,应运而生于首都,碧玉年华献中原。多次搬迁,驻地从北京经漯河再到郑州;数易其名,由机械科学研究院到漯河机械研究所再到郑州机械研究所,现为郑州机械研究所有限公司。1956~1958年应运而生:依据全国人大一届二次会议的提议和第一机械工业部的决策,1956年3月6日,第一机械工业部发文《(56)机技研究第66号》,通知“机械科学实验研究院”(后改名为“机械科学研究院”)在北京成立。1959~1968年首次创业:承担国家重大科研项目与开发任务,以及行业发展规划以及标准制定等工作,如“九大设备”的若干关键技术等。1969~1972年搬迁河南:1969年按照“战备疏散”的要求,机械科学研究院主体迁建河南漯河,成立“漯河机械研究所”;1972年因发展需要,改迁河南郑州,成立郑州机械研究所。1973~1998年二次创业:先后隶属于国家机械工业委员会、机械电子工业部、机械工业部;1981年4月罗干由铸造室主任升任副所长,同年经国务院批准具备硕士学位授予权;1985年“葛洲坝二、三江工程及其水电机组项目”荣获国家科技进步特等奖。1999~2016年发展壮大:1999年转企改制,隶属于国资委中国机械科学研究总院;2008年被河南省首批认定为“高新技术企业”;2011年获批组建新型钎焊材料与技术国家重点实验室;2014年被工信部认定为“国家技术创新示范企业”;历经十多年开发出填补国内外空白的大型齿轮齿条试验装备,完成了对三峡升船机齿条42.2万次应力循环次数的疲劳寿命试验测试;营业收入从几千万发展到近6亿;2017年至今协同发展:2017年经公司制改制,更名为郑州机械研究所有限公司,一以贯之地坚持党对国有企业的领导,充分发挥党委把方向、管大局、保落实的领导作用;一以贯之地建立现代企业制度,持续推进改革改制,努力实现以高质量党建引领郑机所高质量发展。
非洲野犬,属于食肉目犬科非洲野犬属哺乳动物。 又称四趾猎狗或非洲猎犬; 其腿长身短、体形细长;身上有鲜艳的黑棕色、黄色和白色斑块;吻通常黑色,头部中间有一黑带,颈背有一块浅黄色斑;尾基呈浅黄色,中段呈黑色,末端为白色,因此又有“杂色狼”之称。 非洲野犬分布于非洲东部、中部、南部和西南部一带。 栖息于开阔的热带疏林草原或稠密的森林附近,有时也到高山地区活动。其结群生活,没有固定的地盘,一般在一个较大的范围内逗留时间较长。非洲野犬性情凶猛,以各种羚羊、斑马、啮齿类等为食。奔跑速度仅次于猎; 雌犬妊娠期为69-73天,一窝十只仔,哺乳期持续6-12个星期。 其寿命11年。 非洲野犬正处在灭绝边缘,自然界中仅存两三千只。 非洲野犬被列入《世界自然保护联盟濒危物种红色名录》中,为濒危(EN)保护等级。 ",非洲野犬共有42颗牙齿(具体分布为:i=3/3;c=1/1;p=4/4;m=2/3x2),前臼齿比相对比其他犬科动物要大,因此可以磨碎大量的骨头,这一点很像鬣狗。 主要生活在非洲的干燥草原和半荒漠地带,活跃于草原、稀树草原和开阔的干燥灌木丛,甚至包括撒哈拉沙漠南部一些多山的地带。非洲野犬从来不到密林中活动。
清华大学(Tsinghua University),简称“清华”,坐落于北京市海淀区双清路30号,是教育部直属的全国重点大学、中央直管全日制普通高校、由教育部与北京市重点共建。学校是国家“双一流”A类、“985工程”“211工程”建设高校。清华大学的前身清华学堂始建于1911年,1912年更名为清华学校。1928年更名为国立清华大学。1937年抗日战争全面爆发后南迁长沙,与北京大学、南开大学组建国立长沙临时大学,1938年迁至昆明改名为国立西南联合大学。1946年迁回清华园,设有文、法、理、工、农等5个学院、26个系。1952年全国高等学校院系调整后,清华大学成为一所多科性工业大学,重点为国家培养工程技术人才,被誉为“红色工程师的摇篮”。改革开放以来,清华大学逐步确立了建设世界一流大学的长远目标,进入了蓬勃发展的新时期。学校先后恢复或新建了理科、文科、医学学科和经济管理学科,并成立了研究生院和继续教育学院。1999年,中央工艺美术学院并入,成立清华大学美术学院。2012年,中国人民银行研究生部并入,成为清华大学五道口金融学院。在国家和社会的大力支持下,通过实施“211工程”“985工程”,开展“双一流”建设,清华大学在人才培养、科学研究、社会服务、文化传承创新、国际合作交流等方面都取得了长足进展。目前,清华大学共设22个学院、59个系,已成为一所设有理学、工学、文学、艺术学、历史学、哲学、经济学、管理学、法学、教育学、医学和交叉学科等12个学科门类的综合性、研究型、开放式大学。
湖南师范大学(Hunan Normal University),简称“湖南师大(HNNU)”,位于湖南省长沙市,入选首批国家“211工程”重点建设大学、国家“双一流”建设高校, 是教育部与湖南省重点共建的部省共建“双一流”建设高校之一。湖南师范大学创建于1938年,位于历史文化名城长沙,是国家“211工程”重点建设的大学,国家“双一流”建设高校,教育部与湖南省重点共建“双一流”建设高校,教育部普通高等学校本科教学工作水平评估优秀高校。学校占地近3000亩,建筑面积133万平方米。主校区西偎麓山,东濒湘江,风光秀丽,是全国绿化“400佳”单位之一。学校设有24个学院,现有本科专业94个,本科和研究生教育覆盖哲学、经济学、法学、教育学、文学、历史学、理学、工学、医学、管理学、艺术学、交叉学科等12大学科门类。学校拥有伦理学、英语语言文学、中国近现代史、发育生物学、理论物理、基础数学等6个国家重点学科,外国语言文学入选国家“世界一流建设学科”,化学、临床医学、材料科学、工程科学、植物与动物学、环境与生态学、物理学、生物与生化、数学9个学科进入ESI全球前1%,哲学、生物学入选湖南省“世界一流培育学科”,发育生物学与生物育种学科群入选湖南省高校优势特色学科群,理论经济学、法学、政治学、马克思主义理论、教育学、心理学、体育学、中国语言文学、新闻传播学、中国史、数学、物理学、化学、地理学、统计学、计算机科学与技术、基础医学、艺术学18个学科入选湖南省“十四五”重点学科。
中南大学(Central South University,英文缩写为CSU),位于湖南省长沙市,是中华人民共和国教育部直属的全国重点大学,中央直管高校。中南大学坐落在中国历史文化名城——湖南省长沙市,占地面积317万平方米。跨湘江两岸,依巍巍岳麓,临滔滔湘水,环境幽雅,景色宜人,是求知治学的理想园地。学校设有31个二级学院,拥有享“南湘雅”美誉的湘雅医院、湘雅二医院、湘雅三医院3所大型三级甲等综合性医院及湘雅口腔医院,和湘雅医学院附属海口医院、附属肿瘤医院、附属儿童医院、附属长沙医院、附属株洲医院、附属常德医院6所非直属附属医院。中南大学由原湖南医科大学、长沙铁道学院与中南工业大学于2000年4月合并组建而成。原中南工业大学的前身为创建于1952年的中南矿冶学院,原长沙铁道学院的前身为创建于1953年的中南土木建筑学院,两校的主体学科最早溯源于1903年创办的湖南高等实业学堂的矿科和路科。原湖南医科大学的前身为1914年创建的湘雅医学专门学校,是我国创办最早的西医高等学校之一。
是否使用RAG方法结果比较
print('> Without RAG:')
llm.generate( '介绍一下广州大学', [])
print("\n")
llm.generate( '介绍一下湖南师范大学', [])
print("\n")
llm.generate( '湖南大学和中南大学分别在哪,还有湖南师范大学在广州吗', [])
print("\n")
print('> With RAG:')
llm.generate( '介绍一下广州大学', context)
print("\n")
llm.generate( '介绍一下湖南师范大学', context)
print("\n")
llm.generate( '湖南大学和中南大学分别在哪,还有湖南师范大学在广州吗', context)
使用RAG之后,模型能够结果知识库中的知识,准确回答用户的提问。 关键是,还能自我学习。
2.4 体验新模型!
源2.0 是浪潮信息发布的新一代基础语言大模型。我们开源了全部的3个模型源2.0-102B,源2.0-51B和源2.0-2B。并且我们提供了预训练,微调,推理服务的相关脚本,以供研发人员做进一步的开发。源2.0是在源1.0的基础上,利用更多样的高质量预训练数据和指令微调数据集,令模型在语义、数学、推理、代码、知识等不同方面具备更强的理解能力。
浪潮信息模型上新:
2.5 玩转 Task 3 案例:AI科研助手.py
控制台运行脚本启动“AI科研助手”:
streamlit run "Task 3 案例:AI科研助手.py" --server.address 127.0.0.1 --server.port 6006
解决错误:
安装pypdf依赖
pip install pypdf
安装faiss-cpu依赖
pip install faiss-cpu
“AI科研助手”体验(一):
“AI科研助手”体验(二):