LLM - LangChain + RAG
局限
大模型的核心能力 - 意图理解 + 文本生成
局限 | 描述 |
---|---|
数据的及时性 | 大部分 AI 大模型都是预训练的,如果要问一些最新的消息,大模型是不知道的 |
复杂任务处理 | AI 大模型在问答方面表现出色,但不总是能够处理复杂任务 AI 大模型主要是基于文本的交互(多模态除外) |
代码生成与下载 | 根据需求描述生成对应的代码,并提供下载链接 - 暂时不支持 |
与企业应用场景的集成 | 读取关系型数据库里面的数据,并根据提示进行任务处理 - 暂时不支持 |
- 在实际应用过程中,输入数据和输出数据,不仅仅是纯文本
- AI Agent - 需要解析用户的输入输出
AI Agent
AI Agent 是以 LLM 为核心控制器的一套代理系统
- 控制端处于核心地位,承担记忆、思考以及决策等基础工作
- 感知模块负责接收和处理来自于外部环境的多样化信息 - 文字、声音、图片、位置等
- 行动模块通过生成文本、API 调用、使用工具等方式来执行任务以及改变环境
LangChain - 开源 + 提供一整套围绕 LLM 的 Agent 工具
- AI Agent 很有可能在未来一段时间内成为 AI 发展的一个重要方向
- LLM 是大厂的游戏 - 除非能开发出能够低成本训练和推理的 LLM
- AI Agent 是普通玩家可以入局的
LangChain
- 一开始,LangChain 只是一个技术框架,可以快速开发 AI 应用
- 不需要储备太多算法知识,只需要知道如何与 LLM 进行交互即可 - API 接口和参数
- 至今,LangChain 成为了一个 AI 应用开发平台,包含 4 大组件
核心组件
LangChain 是当下最火的 AI Agent 技术框架,使用 MIT 开源协议
Component | Desc | ≈ |
---|---|---|
LangChain | LLM 应用开发框架 | SpringCloud |
LangSmith | 统一的 DevOps 平台 也是一套 Agent DevOps 规范,可以应用于其它框架 |
K8S + GitLab CI/CD + … |
LangServe | 用于部署 LangChain 应用程序,并提供 API 管理能力 | APISIX |
LangGraph | 用于使用 LLM 构建有状态、多参与者应用程序的库 | Nacos |
技术架构
Module | Desc |
---|---|
LangChain-Core | 基础抽象 + LangChain 表达式语言 |
LangChain-Community | 第三方集成 |
LangChain | 构成应用程序认知架构的链、代理、检索策略 |
Model I/O
主要与 LLM 打交道
- 主要组成部分:Format + Predict + Parse
- LLM 可以理解为只接受文本输入和文本输出的模型
- LangChain 中的 LLM 是纯文本补全模型,不包含多模态模型
Format
- 在把数据输入到 LLM 之前,无论数据来自于搜索引擎、向量数据库还是接口
- 都必须先对数据进行格式化,转换成 LLM 能理解的格式
Predict
- LangChain 原生支持的丰富 API,可以实现对各个 LLM 的调用
Parse
- 对 LLM 返回的文本内容进行解析
- 随着多模态模型的日益成熟,未来会实现对多模态模型输出结构的解析
Retrieval
从各种数据源中抓取数据,进行词向量化、向量数据存储、向量数据检索
Agents
- Agents 是指实现具体任务的模块,如从某个第三方接口获取数据,用作 LLM 的输入
- LangChain 原生支持多种类型的 Agents,可以根据实际需要进行自定义
Chains
- Chains 为顺序调用,类似于 Linux Pipelines - 文件处理链条、SQL 查询链条、搜索链条
- LangChain Chains 主要通过 LangChain 表达式实现 - LCEL - LangChain Expression Language
- 一些底层的 Chains 并没有通过 LCEL 实现,而是通过 LegacyChain
Memory
- Memory 指 LLM 的一些输入和输出,包含历史对话信息,可以放入缓存,提升性能
- 使用流程
- 在执行核心逻辑之前先查询缓存,如果查询到则直接使用
- 在执行完核心逻辑,返回给用户前,将内容写入缓存,方便后面使用
Callbacks
LangChain 针对各个组件提供回调机制 - 链条、模型、代理、工具等
Callback | Desc |
---|---|
构造函数回调 | 只适用于对象本身 |
请求回调 | 适用于对象本身以及其所有子对象 |
LCEL
LCEL 用于构建 Chains
1 | from langchain_core.output_parsers import StrOutputParser |
- Chains 与 Linux Pipelines 类似,通过
|
来连接不同组件,构成复杂 Chains,以实现特定功能 - 每个组件的输出会作为下一个组件的输入,直到最后一个组件执行完
可以通过 LCEL 将多个 Chains 关联在一起
1 | chain1 = prompt1 | model | StrOutputParser() |
核心思想
- LLM 是核心控制器,所有的操作都是围绕 LLM 的输入和输出在进行
- Chains 可以将一系列组件串起来进行功能叠加 - 逻辑抽象 + 组件复用
RAG
知识滞后
- LLM 是基于预训练的,一般 LLM 的训练周期为 1~3 个月
- 因为成本过高,所以 LLM 注定不可能频繁更新知识 - 知识滞后 - GPT-4 为 2023.12
- 如果想 LLM 能够理解数据,或者将数据喂给 LLM 做推理时,必须进行 RAG
技术流程
通过 RAG 让 LLM 支持最新的知识索引 - 使用最新的知识进行推理
- 任务 1
- 通过网络爬虫,爬取大量信息
- 与搜索引擎的数据爬取过程一样,但不涉及 Page Rank
- 只是纯粹的知识爬取,并向量化存储 - 最新数据
- 任务 2
- 用户提问时,先将问题向量化
- 然后在向量库里检索,将检索到的信息构建成提示,喂给 LLM,LLM 处理完后进行输出
也可以实时调用搜索引擎的接口,获取最新数据,然后向量化后喂给 LLM
向量化
- 向量化 - 将语言通过数学的方式进行表达
- 生成的向量数据取决于使用的 Embedding 模型
向量存储
- 将向量化后的数据存储在向量数据库中
- 常见的向量数据库 - Faiss + Milvus
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.