面试题 1.1
为什么大模型需要外挂(向量)知识库?如何将外部知识注入大模型,最直接的方法:利用外部知识对大模型进行微调
回答
大模型需要外挂(向量)知识库的原因:
- 知识更新频率:大模型在训练时使用的知识是静态的,而实际应用中知识不断更新,外挂知识库可以确保模型使用最新的信息。
- 知识覆盖范围:单纯依靠模型训练时的数据可能无法覆盖所有领域的知识,通过外挂知识库可以扩展模型的知识覆盖范围。
- 效率问题:在大模型中直接嵌入所有知识不仅训练成本高,而且在推理过程中也会导致效率低下,使用外挂知识库可以提高响应速度和效率。
将外部知识注入大模型的最直接方法:利用外部知识对大模型进行微调
思路:构建几十万量级的数据,然后利用这些数据对大模型进行微调,以将额外知识注入大模型。
优点:简单粗暴,能够直接将额外知识嵌入模型。
缺点:
- 效果有限:几十万量级的数据可能无法很好地将额外知识注入大模型,导致知识融合效果不理想。
- 训练成本高:需要多卡并行训练,且需要训练很多天,成本昂贵。
既然大模型微调不是将外部知识注入大模型的最优方案,那是否有其它可行方案?
可行方案:
-
使用外挂(向量)知识库:
-
- 背景介绍:外挂知识库可以通过向量化的方式存储大量的知识点,并在模型推理过程中动态调用这些知识。知识库可以不断更新,确保模型使用最新的信息。
- 实现方式:在模型推理时,通过检索和匹配机制,调用外挂知识库中的相关知识,以补充模型的回答。
-
知识蒸馏(Knowledge Distillation):
-
- 背景介绍:知识蒸馏是一种从大模型向小模型传递知识的方法,可以将大模型中的知识提取并注入到小模型中,从而降低计算成本。
- 实现方式:训练一个辅助模型,利用大模型的输出作为标签,指导小模型学习,从而将知识注入小模型。
-
检索增强模型(Retrieval-Augmented Generation, RAG):
-
- 背景介绍:RAG模型结合了检索和生成的能力,通过检索模块找到相关的知识,再由生成模块生成回答。
- 实现方式:在生成回答之前,首先通过检索模块找到相关知识,然后将检索到的信息与模型输入结合,通过生成模块生成最终回答。
-
动态适应机制(Dynamic Adaptation Mechanism):
-
- 背景介绍:动态适应机制允许模型在推理过程中根据上下文动态调整和调用外部知识。
- 实现方式:设计模型架构,使其能够在推理过程中动态调用外部知识库,并根据上下文信息进行调整和生成答案。
面试题 1.2
基于LLM+向量库的文档对话思路是怎么样?
回答
基于LLM+向量库的文档对话的基本思路包括以下步骤:
-
加载文件
-
- 背景介绍:首先,需要加载包含要对话的文档文件。这可以是各种格式的文档,如PDF、Word、TXT等。
- 实现方式:使用适当的库(如PyMuPDF、docx等)将文件加载到系统中。
-
读取文本
-
- 背景介绍:将加载的文件内容读取成纯文本格式,便于后续处理。
- 实现方式:利用文件处理库读取文本内容,并进行必要的预处理,如去除多余的空格和特殊字符。
-
文本分割
-
- 背景介绍:为了便于向量化处理和提高检索效率,需要将长文本分割成较小的段落或句子。
- 实现方式:可以使用自然语言处理技术进行段落或句子的分割,常用的方法包括按段落、句子或固定长度进行分割。
-
文本向量化
-
- 背景介绍:将分割后的文本转换为向量表示,以便进行相似性计算。
- 实现方式:利用预训练的语言模型(如BERT、GPT等)将文本段落转换为向量表示。可以使用开源库(如Sentence-BERT、Transformers等)实现向量化。
-
问句向量化
-
- 背景介绍:将用户输入的问题转换为向量表示,以便与文档向量进行匹配。
- 实现方式:同样使用预训练的语言模型将问题转换为向量表示。
-
在文本向量中匹配出与问句向量最相似的Top K个
-
- 背景介绍:利用相似性度量(如余弦相似度)在文本向量库中找到与问句向量最相似的Top K个向量。
- 实现方式:计算问句向量与所有文本向量的相似度,选择相似度最高的Top K个文本向量。可以使用快速检索算法(如FAISS)提高匹配效率。
-
匹配出的文本作为上下文和问题一起添加到Prompt中
-
- 背景介绍:将找到的最相似的文本段落作为上下文信息,与用户的问题一起形成新的Prompt,提供给LLM生成回答。
- 实现方式:将选中的Top K个文本段落拼接成一个上下文字符串,并将其与用户的问题一起构造新的输入Prompt。
-
提交给LLM生成回答
-
- 背景介绍:将构造好的Prompt提交给预训练的大语言模型(LLM),生成最终的回答。
- 实现方式:调用大语言模型的API或框架(如GPT-3、ChatGPT等),将Prompt输入模型,获取生成的回答。
面试题 1.3
基于LLM+向量库的文档对话核心技术是什么?
回答
基于LLM+向量库的文档对话核心技术:embedding
思路:
将用户知识库内容经过 embedding 存入向量知识库,然后用户每一次提问也会经过 embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 prompt 提交给 LLM 回答。
-
Embedding(嵌入)技术
-
- 背景介绍:Embedding 是将文本数据转换为固定长度的向量表示的技术,这些向量捕捉了文本的语义信息,便于后续的相似度计算和检索。
- 实现方式:使用预训练的语言模型(如BERT、GPT)将文本转换为高维向量。常用的工具和库包括Transformers、Sentence-Transformers等。
-
向量相关性算法
-
-
背景介绍:向量相关性算法用于计算两个向量之间的相似度,常用的算法包括余弦相似度、欧氏距离等。
-
实现方式:
-
-
向量检索工具
-
- 背景介绍:为了在大规模向量库中快速找到相似向量,使用专门的向量检索工具可以显著提高效率。
- 实现方式:常用的向量检索工具包括FAISS、Annoy等,它们支持高效的最近邻搜索和相似性计算。
面试题 1.4
基于LLM+向量库的文档对话 prompt 模板 如何构建?
回答
构建基于LLM+向量库的文档对话的 prompt 模板需要确保提供足够的上下文信息,并明确要求LLM生成简洁且专业的回答。以下是详细的模板构建思路及示例:
Prompt 模板构建思路:
- 提供上下文信息:确保 prompt 包含从向量库中匹配到的相关文本片段,作为上下文信息。
- 明确回答要求:指明LLM需要根据提供的上下文信息回答问题,若信息不足,则提示无法回答。
- 语言和风格要求:指定回答应使用中文,且不能添加编造成分,保证回答的准确性和专业性。
具体步骤:
- 准备上下文信息(context):从向量库中匹配到的最相似文本片段。
- 准备用户问题(question):用户提出的具体问题。
- 构建 prompt 模板:整合上下文信息和问题,并加入明确的回答指示。
Prompt 模板示例:
已知信息:{context}
根据上述已知信息,简洁和专业地回答用户的问题。如果无法从中得到答案,请说“根据已知信息无法回答该问题”或“没有提供足够的相关信息”,不允许在答案中添加编造成分。答案请使用中文。
问题是:{question}
基于LLM+向量库的文档对话优化面
痛点1:文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失
问题描述
问题1:如何让LLM简要、准确回答细粒度知识?
-
举例及标答:用户:2023年我国上半年的国内生产总值是多少?LLM:根据文档,2023年的国民生产总值是593034亿元。
-
需求分析:
-
- 简要,不要有其他废话。
- 准确,不要随意编造。
问题2:如何让LLM回答出全面的粗粒度(跨段落)知识?
-
举例及标答:用户:根据文档内容,征信中心有几点声明?LLM:根据文档内容,有三点声明,分别是:一、……;二……;三……。
-
需求分析:
-
- 语义级别的分割,而不是简单基于html或者pdf的换行符分割。
- 防止模型只回答部分内容而遗漏其他重要信息。
解决方案:
原则:基于LLM的文档对话架构分为两部分:先检索,后推理。重心在检索(推荐系统),推理交给LLM整合即可。检索部分要满足三点:①尽可能提高召回率,②尽可能减少无关信息,③速度快。
具体实现:
语义切分和关键信息抽取
- 语义切分方法1:利用NLP的篇章分析(discourse parsing)工具,提取段落之间的主要关系,并合并具有从属关系的段落,确保每段表达同一主题。
- 语义切分方法2:利用BERT等模型进行语义分割,通过判断相邻段落的语义衔接关系来进行切分。可以设置相似度阈值进行合并或断开,保证切分的段落语义连贯。
def is_nextsent(sent, next_sent):
encoding = tokenizer(sent, next_sent, return_tensors="pt", truncation=True, padding=False)
with torch.no_grad():
outputs = model(**encoding, labels=torch.LongTensor([1]))
logits = outputs.
logitsprobs = torch.softmax(logits/TEMPERATURE, dim=1)
next_sentence_prob = probs[:, 0].item()
return next_sentence_prob > MERGE_RATIO
_RATIO
段落和句子的关键信息抽取
- 方法1:利用成分句法分析(constituency parsing)和命名实体识别(NER)工具提取核心部分和重要实体。
- 方法2:使用语义角色标注(Semantic Role Labeling)提取“谁对谁做了什么”的信息。
- 方法3:使用关键词提取工具(如HanLP或KeyBERT)提取关键信息。
- 方法4:训练一个生成关键词的模型,如ChatLaw中的KeyLLM模型。
多级索引系统
- 组织所有文本成二级索引,第一级是关键信息,第二级是原始文本,二者一一映射。
- 检索部分只对关键信息做embedding,参与相似度计算,把召回结果映射的原始文本交给LLM。
文档切片和检索
- 基于语义切片,防止大粒度的切片带来噪声。
- 使用高效的向量检索工具(如FAISS)和高质量的文本向量化工具,并对文本向量化工具进行微调。
痛点2:在基于垂直领域表现不佳
解决方案:
-
模型微调
-
- 对embedding模型进行垂直领域数据微调。
- 对LLM进行垂直领域数据微调。
痛点3:langchain 内置问答分句效果不佳
解决方案:
- 使用更好的文档拆分方式(如达摩院的语义识别模型)。
- 改进填充方式,仅添加相关度高的句子。
- 文本分段后,对每段分别总结,基于总结内容进行匹配。
痛点4:如何尽可能召回与query相关的Document
解决方案:
- 切分Document时,考虑Document的长度、Document embedding质量和被召回Document数量之间的相互影响。
- 使用高质量的文本向量化工具(如经过微调的工具)提高检索效果。
- 结合ES搜索结果与FAISS结果。
痛点5:如何让LLM基于query和context得到高质量的response
解决方案:
- 尝试多个prompt模板,选择最合适的。
- 用与本地知识问答相关的语料,对LLM进行微调。
痛点6:embedding模型在表示text chunks时偏差太大
解决方案:
- 用更小的text chunk配合更大的topk来提升表现。
- 使用适合多语言的embedding模型。
痛点7:不同的 prompt 可能产生完全不同的效果
解决方案:
- 构造合适的prompt,进行大量尝试。
- 训练和微调时,使用包含指令数据的instruction data。
痛点8:llm生成效果问题
解决方案:
- 选择适合的开源模型并进行微调,如llama2和baichuan2。
- 构造domain dataset进行微调,让LLM更符合特定需求。
痛点9:如何更高质量地召回context喂给LLM
解决方案:
- 更细颗粒度地做recall,提高召回质量。
- 使用学术相关的embedding模型和指令数据,优化pdf解析。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。