目录
问题3:在Transformer的基础上,大模型的架构有什么更新和改变?
问题2:RAG和微调可以同时存在吗? 更具体一点:能不能先RAG再微调,或者先微调再RAG 还是说RAG和微调只能存在一个?
问题2.2:在验证迭代那一步中,怎么通过bad case来针对性改进prompt engineering?
(对于项目的扩展和思考如下)
零、大模型应用开发(1.0)开发出来了什么呢?
基于本地知识库、Zhipuai_API以及streamlit模块建立了一个对话机器人
解释1:这里的本地知识库是用Langchain模块解析本地的南瓜书的PDF建立的知识库
形如:
一、LLM理论简介(参考大模型语言模型:从理论到实战)
问题1:GPT模型和LLaMa模型的架构是什么样的?
答:GPT模型主要是decoder-only模型架构,缺少了原始Transformer架构中的交叉注意力结构。当前绝大多数大语言模型结构都采用了类似 GPT 架构,使用基于 Transformer 架构构造的仅
由解码器组成的网络结构,采用自回归的方式构建语言模型。但是在位置编码、层归一化位置以
及激活函数等细节上各有不同。(如下图所示)
LLama模型的整体 Transformer架构与 GPT-2 类似,但是采用了前置层归一化(Pre-normalization)并使用 RMSNorm 归一化函数(Normalizing Function)、激活函数更换为 SwiGLU,并使用了旋转位置嵌入(RoP)
问题2:什么是旋转位置编码?(直接回答到问题3中)
问题3:在Transformer的基础上,大模型的架构有什么更新和改变?
答:(如下)
Transformer | LLama | |
位置编码 | 正余弦函数编码 | RoPE |
激活函数 | Relu | SwiGLU |
层归一化位置 | 注意力层和FFN后 | 注意力层和FFN前 |
层归一化函数 | Layernorm | RMSNorm |
二、RAG简介
问题1:什么是RAG
答:检索增强生成,步骤为从数据库中检索,然后和原来的输入一起组成比较强的输入,到模型中进行生成(不准确),准确的说法:将用户的问题输入到检索系统中,从本地数据库中检索相关信息,对相关信息进行处理和增强,将增强的信息输入到模型当中。
(由此产生了一个问题:这些相关信息怎么增强?)
通过构建本地数据库,通过在本地知识库中检索相似度最高的向量。
import sys
sys.path.append("../C3 搭建知识库") # 将父目录放入系统路径中
# 在上面的C3知识库模块中找下面要引用的东西
# 使用智谱 Embedding API,注意,需要将上一章实现的封装代码下载到本地
from zhipuai_embedding import ZhipuAIEmbeddings
from langchain.vectorstores.chroma import Chroma
# 定义 Embeddings
embedding = ZhipuAIEmbeddings()
# 向量数据库持久化路径
persist_directory = '../../data_base/vector_db/chroma'
# 加载数据库
vectordb = Chroma(
persist_directory=persist_directory, # 允许我们将persist_directory目录保存到磁盘上
embedding_function=embedding
)
question = "什么是prompt engineering?"
docs = vectordb.similarity_search(question,k=4)
问题2:RAG和微调可以同时存在吗? 更具体一点:能不能先RAG再微调,或者先微调再RAG 还是说RAG和微调只能存在一个?
答:独立存在,可以共存;RAG本质上处理的是输出数据的增强,和模型本身没有关系,微调调整的是模型本身,和数据没有关系,所以两者是独立的。
问题3:RAG(构造检索增强问答链)是怎么实现的?
答:
#step1:
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm,
retriever=vectordb.as_retriever(),
return_source_documents=True,
chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
#用langchain.chains中的RetrievalQA类来构建问答链,
#解释一下:
#retriever是构造一个检索器,用以检索和问题相关的原始文档,
#return_source_documents=True,表示原始文档也会返回
#step2:
#关键在于QA_CHAIN_PROMPT怎么理解:
from langchain.prompts import PromptTemplate
template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答案。最多使用三句话。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
{context}
问题: {question}
"""
QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)
#在这里用PromptTemplate类创造了一个问答链提示词,那么问题在于{context}和{question}是怎么被填充的呢?
#当输入问题的时候,retriever在本地向量数据库中检索出来的结果会输入到{context}中,问题会输出到{question}中
#然后把QA_CHAIN_PROMPT放入到llm参数中进行输出答案。。。。
#step3:得到输出
result = qa_chain({"query": question_1})
result包括输入和输出
三、LangChain简介
问题1:什么是LangChain?
答:LangChain 为基于 LLM 开发自定义应用提供了高效的开发框架,便于开发者迅速地激发 LLM 的强大能力,搭建 LLM 应用。LangChain 也同样支持多种大模型的 Embeddings,内置了 OpenAI、LLAMA 等大模型 Embeddings 的调用接口。但是,LangChain 并没有内置所有大模型,它通过允许用户自定义 Embeddings 类型,来提供强大的可扩展性。
四、开发LLM应用的整体流程
问题1:什么是大模型开发?
答:以大模型语言为核心,通过大模型的强大理解能力和生成能力,结合特殊的数据和业务逻辑来实现某一目标的过程。
问题2:
问题2.1:应用开发的一般流程
答:确定目标,设计功能,搭建整体架构,搭建知识库,pe(构建RAG应用),前后端搭建,验证迭代,体验优化;
问题2.2:在验证迭代那一步中,怎么通过bad case来针对性改进prompt engineering?
答:
五、在开发LLM应用流程中,提出问题:
问题1.搭建数据库是怎么做的?
答:如下:
step1:在搭建数据库之前,需要进行数据处理,主要是用langchain进行处理
数据读取:选择langchain的PDF读取程序和Markdown读取程序
数据清洗:主要是使用正则表达式去清除掉多余的部分
文档分割:因为如果检索结果是单个文档,那么单个文档的知识过长就会导致回答问题的时候超过模型的推理能力,因此把文档按照规则分割成chunk,回答问题的时候直接回答相应数量的chunk(词块)
(有两个重要参数:chunk_size:块个数和chunk_overlap:重叠部分)
step2:利用langchain中的Chroma向量存储库
from langchain.vectorstores.chroma import Chroma
vectordb = Chroma.from_documents(
documents=split_docs[:20], #选择的分割文本的前20页
embedding=embedding, #API来定义的Embedding
persist_directory=persist_directory #本地存储地址
)
问题2.构建RAG应用是怎么做的?
答:RAG简介中的问题2