今天我们再来写一篇关于大语言模型的实战应用——如何开发一个垂直领域的知识问答系统?

1.原理

(1)基于传统技术的实现方案

在没有大语言模型之前,有如下传统技术实现知识问答系统:

  • 关键词匹配:在系统内预设一些关键词,系统根据用户提出的问题进行关键词匹配,从中提取出匹配的答案。
    • 局限性:仅适用于简单、明确的问题,但复杂问题、多义词等,效果就不好。
  • 规则匹配:在系统内预设一些规则模板,系统根据用户提出的问题结构进行匹配,这些规则模板包括:语法规则、语义规则、业务领域规则。
    • 局限性:需要人类专家编写规则模板,对领域知识的抽象和表达能力有一定要求。
  • 统计方法:系统基于统计学模型构建,如:条件随机场(CRF,Conditional Random Field),进行问题分类、命名实体识别等。
    • 局限性:强依赖数据,数据采集、数据清洗、数据标注,都要消耗人类巨大的工作量。
  • 知识图谱:系统基于领域相关的知识图谱或实体构建,可以通过图谱中的实体、关系和属性实现问题解析和答案生成。
    • 局限性:需要人类专家对业务领域的知识进行建模、抽象,好不容易构建好,知识刷新了。。。

(2)基于大语言模型的实现方案

和老李师傅聊大语言模型,他说:

  • 大语言模型,是从wordworld的过程——AI学习一堆word的关系,然后就具备了概括、抽象、推理的能力去描述世界。

  • 人类程序员,是从worldword的过程——人类学习这个世界,然后用代码描述世界(代码就是一堆word的组合)。

最后,他老人家感叹道:“N年后,别人看我们,就像我们看伏尔加河上的纤夫。纤夫光着腚,我们光着头。”image-20230905163751495

的确如此,相较于前述传统技术,基于大语言模型实现知识问答系统,有很多天然优势:

  • 学习效率高:大语言模型学习速度极快。后文实践章节中,有这么一个例子:我找公路军团的同学要了1000多份交通专业的文档和书籍,大语言模型1分钟学习10个文档,2小时学完1000份,而每小时只消耗了1.39元。这位交通领域的专家无比惊讶地告诉我——这1000多个文档,他也只详细看完了其中200个。
  • 无需人工干预:传统技术需要大量的人工干预,特别强依赖人类专家那些只可意会、不可言传的经验。而大语言模型可以自动学习和更新知识,无需人工干预。这意味着问答应用可以及时获取最新的知识,随着时间的推移变得更加智能和准确。
  • 多轮对话:大语言模型还可以处理复杂的问题和多轮对话。它能够理解问题的语义和上下文,并根据用户的追问进行适当的回答。这使得问答应用更加交互式和人性化,提供更好的用户体验。
  • ……好处太多,省略千言万语……

(3)大语言模型选型

大语言模型的选型需要根据LLM App的应用场景,并且也不是只选1个,而是选择N个,形成大语言模型矩阵。

image-20230906090930061

  • 世界知识:从世界知识看,目前主流的LLM如下:
    • GPT系:当红炸子鸡的它,提供的接口包括ModelCompletionsChatEditsImagesEmbeddingsAudioFilesFine-tunesOthers等10大类,完整地覆盖了训练推理场景。针对微调场景,覆盖了词嵌入、微调,在推理场景,覆盖了预测、聊天、修正、多模态。知识文档不涉密且不差钱的公司,可直接使用。笔者为了测试GPT4的API,半小时就花光了40大洋,求赞助!
    • LLama系:卷王Meta的开源大戏,LLama一出,瞬间抢走了chatGPT的焦点。随后各顶流大学就开始了基于LLama的训练微调,推出了以Vicuna、Alpaca为代表的一系列模型。LLama2发布后更是好评无数,没几天又推出了最会写代码的CodeLLama。。。大语言模型界的卷王实至名归!
    • Claude系:谷歌前员工的大神们拉旗单干的产品,也是GPT系的强劲对手。
    • GLM系:清华大学出品,公司化商业运作。chatGLM的中文能力非常不错,GLM-130B成为2022年亚洲唯一入选全球30个主流大模型全方位测评报告的候选对象。国货之光,本文的知识问答系统就是演示的它。
模型系列版本厂商/机构开源or闭源调用形式
GPT系GPT3.5Turbo、GPT4OpenAI闭源远程调用
LLama系LLama、LLama2、CodeLLamaMeta开源本地调用
Claude系Claude-instant、Claude-2-100kAnthropic闭源远程调用
GLM系chatGLM2、GLM-130B、VisualGLM-6B清华大学开源本地调用
  • 领域知识:以编程辅助领域为例,目前表现不错的LLM如下:
模型系列版本厂商/机构开源or闭源调用形式
BigCode系StarCoder、OctoPack、SantaCoderHugging Face开源本地调用
LLama系CodeLLamaMeta开源本地调用
GLM系CodeGeeX2清华大学开源本地调用

综上分析:

  • 对世界知识的表现体现的是大语言模型的通才,对领域知识的表现体现的是大语言模型的专才
  • 在没有一个大语言模型即是通才又是专才的限制下,垂直领域知识问答系统需要的是大语言模型矩阵

(4)大语言模型之外的关键技术

是不是选择好了大语言模型,LLM APP就信手拈来呢?很不幸,不是!

在最近的一次行业交流中,有两个议题值得思考:

  • 量变引起质变:百度智能云/技术委员会主席王耀,针对大语言模型的训练推理场景,阐述了通用云计算、分布式云、智能计算的计算范式的变化。其中,最心酸的一个故事是:以前硬件上某个万分之一的故障是可以接受的,现在不可以了,因为大语言模型训练的计算量级无比巨大!
  • 淘金时代的卖铲人:LangChain CEO Harrision Chase分享的议题是《Why LangChain,What I Saw When Building AI Application with LLM》,在各大厂商逐鹿中原的时候,LangChain忽然火了,按照这个趋势,它应该会成为LLM APP的开发框架了。

因为,训练大语言模型的计算量剧增,对原有的云计算有新的诉求。

因为,粘合大语言模型需要有很多工作,需要有LLM APP的开发框架。

通过LangChain的特性介绍和架构,我们可以知道大语言模型之外,我们还需要做如下事情:

  • 文本处理:对各类型文档的加载,对文本的切分等。
  • 向量存储:适配不同向量数据库,将文档内容向量化并存储。
  • 提示词管理:创建提示词模板,最大化重用提示词。
  • 模型适配:针对不同厂商,适配各类大语言模型的接口。
  • 输出解析:对大语言模型输出的文本进行结构化解析。

具体可以看笔者这篇文章:《【chatGPT】学习笔记10-LangChain之ModelIO,对LLM的抽象1》

(5)架构示例:LangChain-ChatChat

垂直领域问答系统的开源项目已经有很多了,以LangChain-ChatChat为例,可以看到这类LLM APP的软件架构:

image-20230906095324183

  • 训练环节

    • Unstructured Loader:负责将知识文档加载并解析。
    • Text Splitter:将文档按照标点符号,拆分断句。
    • Text Chunks:将断句分词分组,分词分组间存在一定的上下文关联。

    image-20230906095608282

    • Embedding:词嵌入,并将词向量存储于向量数据库中。
  • 应用环节

    • Query Embedding:将用户提问转换了词向量。
    • Vector Similarity:在向量数据库中,用问题词向量,去搜索相关的知识文本向量。
    • Related Text Chunks:根据相关的知识文本向量,反查出对应的知识文本分词分组。这里有个细节,还会将文本分词分组的前后分词分组一并返回(因为这些文字可能有上下文关联关系)。

    image-20230906100110319

    • Prompt Template:提示词模板,这个模块是知识问答系统的关键!最简单的提示词模板就是:
      • 已知:[Related Text Chunks获得的知识文本分词分组],请问[用户的问题]如何答复?
      • 这,不就是开卷考试吗?

    image-20230906100510639

从上述架构可以看出来,曾经很复杂的知识问答系统,大部分核心难点,都被大语言模型搞定了。

接下来,我们来动手实践一下,构建一个我们自己的知识问答系统。

2.实践

2.1.推理环境搭建

  • STEP1.基于MiniCoda,创建虚拟环境

image-20230906101650577

  • STEP2.激活虚拟环境,安装运行时环境

image-20230906101852342

  • STEP3.下载依赖。

image-20230906102057137

  • STEP5.初始化向量数据库。

image-20230906102553686

  • STEP6.配置model_config.py、server_config.py、llm_api.py。

image-20230906102733935

image-20230906102716203

image-20230906102703074

image-20230906102652268

  • STEP7.启动应用

image-20230906103336869

2.2.模型部署

  • STEP1.下载大语言模型和词嵌入模型——chatGLM2-6B、m3e-base

image-20230906102213647

image-20230906102246753

  • STEP2.部署大语言模型和词嵌入模型。

image-20230906103747404

2.3.模型微调

  • STEP1.通过WebUI,上传知识文档。

image-20230906103254463

  • STEP2.编写提示词模板

image-20230906104642146

image-20230906104709680

  • 经过2小时的学习,LLM修炼完了1000多份智慧交通的资料,这学习效率杠杠滴!
    • PS:感谢公路军团的专家,提供珍藏多年的资料,改天请您吃饭!

image-20230906105032126

2.4.模型测试

直接上视频,咨询了一下交通行业的这位专家,回答挺靠谱:

3.总结

本文阐述了基于大语言模型的知识问答系统的实现原理及原型实践过程,原型距离可商用还有很多细节需打磨,但我们可以得到如下观点:

  • 从实现原理看:
    • 技术关键点1:要选择合适的多种大语言模型,形成大语言模型的矩阵
    • 技术关键点2:除大语言模型选型,还需借助LangChain处理好诸多环节(文档结构化、分段分词、词嵌入、上下文、向量搜索、提示词等)。
  • 从实践看:
    • 数据:数据收集、数据清洗、词嵌入等,极为重要。
    • 大语言模型:需跟踪各大厂商大语言模型的最新能力,快速替换到应用软件中,保持大语言模型的先进性
    • 提示词:提示词模板的设计,决定了能否充分发挥大语言模型的潜力
    • 工具链:熟练运用LangChain、向量数据库等工具,有助于设计并实现适应业务场景的问答业务流。

今天就写到这里,后续专栏会继续展示基于大语言模型的LLM应用,欢迎共同探索(上述环境已做成镜像,需要的同学可后台联系作者)。