Datawhale开源学习--大模型应用开发(1.0)

目录

(对于项目的扩展和思考如下) 

零、大模型应用开发(1.0)开发出来了什么呢?

一、LLM理论简介(参考大模型语言模型:从理论到实战)

问题1:GPT模型和LLaMa模型的架构是什么样的?

问题2:什么是旋转位置编码?(直接回答到问题3中)

问题3:在Transformer的基础上,大模型的架构有什么更新和改变?

二、RAG简介

问题1:什么是RAG

问题2:RAG和微调可以同时存在吗? 更具体一点:能不能先RAG再微调,或者先微调再RAG 还是说RAG和微调只能存在一个?

问题3:RAG(构造检索增强问答链)是怎么实现的?

三、LangChain简介

问题1:什么是LangChain?

四、开发LLM应用的整体流程

问题1:什么是大模型开发?

问题2:

问题2.1:应用开发的一般流程

问题2.2:在验证迭代那一步中,怎么通过bad case来针对性改进prompt engineering?

五、在开发LLM应用流程中,提出问题:

问题1.搭建数据库是怎么做的?

问题2.构建RAG应用是怎么做的?


项目地址:GitHub - Diliboy1/llm_datawhale

(对于项目的扩展和思考如下) 

零、大模型应用开发(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的基础上,大模型的架构有什么更新和改变?

答:(如下)

架构对比:除层归一化位置外
TransformerLLama
位置编码正余弦函数编码RoPE
激活函数ReluSwiGLU
层归一化位置注意力层和FFN后注意力层和FFN前
层归一化函数LayernormRMSNorm

二、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

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值