大模型技术实践(三)|10分钟用LangChain和Llama 2打造心灵疗愈机器人

发布日期:2024-12-18    作者:锻錾器物

  由于大模型在垂直行业领域的问答效果仍有待提升,因此,领域知识的注入成为了最直接的解决方案之一。知识注入办法能够分为

  微调是通过少量特定用例的增量数据对基础模型进行进一步训练,改变其神经网络中的参数权重。微调适用于任务或域定义明确,且有足够的标记数据的场景,比如风格微调。目前常用的微调方法有Freeze,P-tuning和LoRA,相关细节会在下期文章中详细介绍。

  ▪ 高质量训练数据集的构建,微调训练所需的算力以及微调模型定期更新等开销都不容小觑

  ▪ 试错成本比较高,特定领域数据一般难以覆盖模型已学到的参数,且有几率会使模型其他下游任务的表现下降

  外挂知识库的本质在于不修改基座模型参数,通过提示词工程(prompt Engineering)将特定知识作为prompt中的context,即召回相关性最高的几个文档,让模型分析这些蕴含知识后,并返回答案。知识库适合要求输出明确且精度高的任务。

  ▪ 回答精确度更高,基于相关文档中的最相关特定段落进行语义搜索能消除查询歧义以生成更精确的答案

  但大模型上下文窗口长度的限制和prompt的构造等因素带来的潜在精度下降也需要纳入知识库构建的考量。

  为了打造特定领域(Domain-specific Knowledge)的知识问答系统,我们应该借助提供了外挂知识库的搜索方案LangChain框架。

  除了用LLM Wrapper可以接入众多的大模型(如 OpenAI、Cohere、Hugging Face),LangChain同时也通过VectorStore Wrapper接口集成了主流的向量数据库(如 Milvus、Pinecone、Chroma等)来优化语义搜索。LangChain能接入的数据类型涵盖了文本、PPT、图片、HTML、Pdf等非结构化文件。相较于传统数据库的精确搜索,即完全匹配,向量数据库使用最邻近(Approximate Nearest Neighbor,ANN)算法和相似度度量(如余弦相似度,内积等)来找到和查询问题最相似的向量。基于本地知识库问答的大致流程如下:

  目前,我们已拆解完了LangChain+LLM文档问答的大致链路,接下来我们郑重进入实战环节。

  i. 上期文章“大模型技术实践(二)|关于Llama 2你必须了解到的那些事儿”:

  ii. UCloud官方的“LLaMA2 模型快速部署”文档:模型快速部署

  对于中文的场景,也有其他优秀的开源模型可供选择,如m3e和bge等[5]。

  这个数据集是从Google网页上爬取的一些心灵鸡汤引用短文,共包含631条文本

  LangChain对于不同格式的数据源内置了不同的解析脚本,最终这一些数据都将转换为纯txt文本格式,以实现文本标准化。

  文本切分中的chunk_size指定了切分后的文本块的字数,chunk_overlap指定了切分文本块之间的重叠字数。由于鸡汤引用文本总长度较短,且文本内部语义关联度高,所以这里的chunk_size设置为50,chunk_overlap设置为20。

  文本切分后,我们应该将文本进行向量化表示,将其映射为低维稠密的向量并存储到然向量数据库中。向量数据库选用了无需注册的FAISS。

  FAISS默认使用L2(欧式距离),召回的文档按照相似度结果从大到小排序。

  我们可以借鉴上面的模板,根据场景定制化自己的模板来拼接query和召回结果

  外挂知识库将用户问题和本地知识向量化,比较两者的向量相似度(Vector Similarity)进行召回。然而,这种全量的Embedding-Search在面对多知识点聚合处理的场景下,存在召回精度低的问题。因为知识库的构建是对单个知识点进行索引,而非对不同知识点的排列组合分别索引。

  为了避免召回遗漏,直观的处理方法有降低相似度阈值(similarity score threshold)和增加召回数量(top_k),但这不免会引入无关的知识点噪声且增加和LLM交互的token开销。

  提升问答系统的精度可以从意图识别和召回优化两个角度考虑,且两者都可以用关键词表示,即从直接将用户query和知识点进行embedding转变为对两者提取关键词后再进行匹配。意图识别能够最终靠关键词提取(Information Extraction, IE)和槽位填充(Slot Filling,SF)实现。:

  利用LLM思维链(Chain-of-Thought,COT)的提示能力来引导用户多轮对话并进行信息总结。针对我们的心灵疗愈机器人的场景,比如用户查询心灵鸡汤的句子,那么就要求用户的提供年龄段,情绪问题和情感需求等信息。语义槽格式如下:

  i. 对相同知识点建立多级索引,有助于实现对维度查询。比如对一位奥运冠军的姓名,竞赛项目,年龄,获奖时间等分别建立索引。

  ii. 将知识库转化为以关系三元组为核心的知识图谱。三元组的抽取除了传统的命名实体识别(NER)等方法,也能够最终靠prompt让大模型来进行抽取。

  类似于Bert时代的垂直领域问答系统,我们大家可以将语义检索和传统的Elasticsearch(ES)关键词搜索并行,对两者进行加权打分投票来获取最终的top_k。

  目前类似于以上优化思路已经落地的有“智海-录问”法律大模型 [6],其基座模型为Baichuan-7B。智海-录问知识增强的完整链路如图3。有必要注意一下的是,智海-录问在知识库中对每一个知识点是以 [key, value] pair 形式存储的。key是知识点的内容简介,用于检索;value是知识点的详细的细节内容,用于模型输入。实现细节请参照其Hugging Face仓库。

  除了Embedding部分,“LangChain+LLM”(图2)链路内的其他组件也有逐步优化的空间:

  由于文本重叠(overlap)的大小没有统一标准,如何保证语义完整和连贯都要一直测试。

  在提示词模板的设计上要增加明确约束条件的指令,减少大模型出现幻觉现象的几率。

  选择基座模型还是微调后的模型,以及对中文的支持程度的需求都需要结合下游场景进行判别。

  本期文章带你基于“LangChain+LLM”框架快速搭建了知识增强后的问答机器人--心灵疗愈师,并探讨了提升模型的内容理解和执行能力的潜在优化方向。下期文章我们将深入解读目前主流的大模型微调技术,敬请期待~