赞
踩
title: 动手学大模型应用开发之 RAG
authors: Ethan Lin
year: 2024-04-16
tags:
为保证最合适的体验,建议用 Obsidian 笔记软件打开该笔记之内容。
所有的笔记来自 动手学大模型应用开发 。该笔记仅提供:一些提炼自原书的一些框架概念、一些个人思考。具体细节与实现需要看原书及其对应的程序。
[!来源]
动手学大模型应用开发-C1-S2
#笔记/定义 #笔记/用途
[[大型语言模型]](LLM)虽然具有强大的能力,然而在某些情况下仍可能无法提供准确的答案。为了解决大型语言模型在生成文本时面临的一系列挑战,提高模型的性能和输出质量,[[检索增强生成]](RAG, Retrieval-Augmented Generation)架构整合了从庞大知识库中检索到的相关信息,并以此为基础,指导大型语言模型生成更为精准的答案,从而显著提升了回答的准确性与深度。
RAG 两大部分:
大模型根据检索部分的答案片段发挥其自身能力举一反三生成一个回答。这个回答最好能尽可能满足用户的需求。
[!来源]
动手学大模型应用开发-C1-S3
#笔记/定义 #笔记/用途
[[LangChain]] 框架是一个开源工具,充分利用了大型语言模型的强大能力,以便开发各种下游应用。它的目标是为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。
#笔记/流程
流程图之LangChain
核心组件:
检索问答链
来完成检索问答。[!来源]
动手学大模型应用开发-C1-S4
#笔记/流程
开发 LLM 之流程:
#类型/举例 简要分析知识库助手项目开发流程
按照章1节6一步一步动手做。
#笔记/定义 #笔记/辨析
System Prompt 与 User Prompt 区别在于,前者相当于一种初始化配置,影响这个会话过程。后者相当于Prompt。
#笔记/举例
{
"system prompt": "你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt": "我今天有什么事务?"
}
#笔记/定义 #笔记/用途
Temperature 参数控制模型生成之随机性发挥想象力。
∈
[
0
,
1
]
\in [0,1]
∈[0,1] 。越小越准确。
#笔记/操作
这里使用了智谱 GLM 。
Prompt 设计原则
假如把大模型类比做乙方。那么这些设计这些原则也适用于甲方与乙方的交互。
#笔记/思考
为了防止或者尽可能验证、纠正幻觉,是否可以采取 Agent 推理回答问题详尽反馈过程,让其它 AI 专家或者人类专家进行监测?此外还需要提供正确的数据库。
词向量(Embeddings)是将文本信息编码成实数向量的技术。该技术在机器学习与 NLP 当中十分基础。
该技术的思路为构建映射。映射左侧的明文信息相似度对应于右侧的编码信息的相似度。如图所示:
优点:对于计算机而言,编码信息更适合检索。
向量数据库更适合大语言模型数据存储。优点是查询效率高于传统数据库。
主流的向量数据库
名称 | 编程语言 | 特点 | 优点 | 缺点 | 备注 |
---|---|---|---|---|---|
Chroma | - | 开源 | 轻量、适合初学者 | 暂时不支持 GPU | - |
Weaviate | - | - | - | - | - |
Qdrant | Rust | - | 效率高 | - | - |
以 LangChain 为例处理数据过程如下:
选择源文档
读取数据
清洗数据:
一般来说使用常规的清洗技术即可。
分割文档:
为了适配模型支持的上下文,需要分割文档。为了保持分割后的文档的连续性,可以考虑在分割不同的块(chunk)值键保留重叠部分
搭建向量数据库
因为我选的是智谱模型的 API ,暂时没有被 LangChain 集成。这里直接用了原书对应的工程之封装好的代码。
关于向量检索有几种算法:
以原书对应的教程里封装的代码 zhipuai_llm.py 为例。该代码实现了 LangChain 框架调用智谱 AI 大模型。
构建 RAG 应用步骤:
这里采用了
Stramlit
工具包。
#笔记/比较
名称 | 用途 | 优点 | 缺点 | 备注 |
---|---|---|---|---|
Stramlit | 构建机器学习数据科学用的 Web 应用程序 | 无需编写 HTML/CSS/JS ,直接用 Python 语言构建 | - | |
Flask | - | - | - | 尚未了解,暂时无法比较 |
Django | - | - | - | 尚未了解,暂时无法比较 |
速查 Streamlit 之模块
Streamlit 基本模块:
st.write()
:这是最基本的模块之一,用于在应用程序中呈现文本、图像、表格等内容。
st.title()
、st.header()
、st.subheader()
:这些模块用于添加标题、子标题和分组标题,以组织应用程序的布局。
st.text()
、st.markdown()
:用于添加文本内容,支持 Markdown 语法。
st.image()
:用于添加图像到应用程序中。
st.dataframe()
:用于呈现 Pandas 数据框。
st.table()
:用于呈现简单的数据表格。
st.pyplot()
、st.altair_chart()
、st.plotly_chart()
:用于呈现 Matplotlib、Altair 或 Plotly 绘制的图表。
st.selectbox()
、st.multiselect()
、st.slider()
、st.text_input()
:用于添加交互式小部件,允许用户在应用程序中进行选择、输入或滑动操作。
st.button()
、st.checkbox()
、st.radio()
:用于添加按钮、复选框和单选按钮,以触发特定的操作。
这些基础模块使得通过 Streamlit 能够轻松地构建交互式数据应用程序,并且在使用时可以根据需要进行组合和定制,更多内容请查看官方文档
评估大模型之思路:
对于不同的 Prompt 版本的不同的提问案例,可以进行排列组合,用人工评估实现。但是如果排列组合数量太大,需要考虑用自动评估。
自动评估包括:
简单自动评估方法,有以下方法:
大模型自动评估方法,主要通过构造 Prompt Engineering 让大模型充当一个评估者的角色,从而替代人工评估的评估员;同时大模型可以给出类似于人工评估的结果,因此可以采取人工评估中的多维度量化评估的方式,实现快速全面的评估。
#笔记/比较
评估方法 | 类型 | 优点 | 缺点 | 备注 |
---|---|---|---|---|
人工评估 | 手动 | 准确度高、全面性强 | 人力成本高、时间成本高 | |
简单自动评估 | 自动 | 人力成本低、评估速度快 | 准确度不足、全面性不足 | |
大模型自动评估 | 自动 | 兼备上述二者优点 | 需要具备大模型开发经验 |
优化检索的思路。列举一些导致需要优化的常见的问题对应的原因:
优化生成部分。列举一些思路:
关于 ![[学习笔记之动手学大模型应用开发之RAG#^lg05pg]] 可以进一步学习 LangChain 的 Agent 部分。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。