面试题 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.logits``probs = 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解析。
参考:PDFTriage: Question Answering over Long, Structured Documents
参考链接:https://www.langchain.com/langchain
附上技术清单
在这里,我们想要强调的是:成功求职并不是一件难事,关键在于你是否做好了充分的准备。通过学习和掌握AI技术的相关知识和技能,了解面试中可能出现的问题和技巧,你就能够在面试中展现出自己的专业素养和实力,赢得面试官的青睐和认可。因此,让我们一起努力,用知识和技能武装自己,迎接AI时代的挑战和机遇吧!
有需要的朋友可以扫描下方二维码,免费获取更多相关资料!
最后,祝愿所有转行、求职的同学都能够在AI产品面试中取得优异的成绩,找到心仪的工作!加油!