LlamaIndex

使用场景

LlamaIndex 是一个上下文增强 LLM 应用的数据框架,帮助用户构建 LLM 应用程序,它包括:

  • 数据连接器(data connectors) :用于引入现有数据源和数据格式,包括 APIs、PDFs、Docs、SQL等。LlamaHub 提供了数百种连接器
  • 数据索引(Data indexes) :以中间表示形式构建数据,以便与 LLMs 一起使用
  • 引擎(Engines) :提供数据的自然语言访问接口
    • 查询引擎(Query Engines) :用于问答
    • 聊天引擎(Chat Engines) :与数据进行多消息来回交互对话

LLamaIndex 还支持与外部应用程序框架集成,如 Flask、LangChain、Docker、ChatGPT 等

阶段步骤

载入阶段

  • Nodes/Documents :文档(Document) 是围绕任何数据源的容器,节点(Node) 是 LlamaIndex 中数据的原子数据单元,表示为源文档的块(chunk)。Nodes 具有元数据,这些元数据与它们所在的文档以及与其他节点相关联
  • Connectors :数据连接器通常称为读取器(Reader),它将来自不同数据源和数据格式的数据导入 Documents 和 Nodes 中

索引阶段

  • Indexes :加载数据后,LlamaIndex 将数据索引到易于检索的结构中,这个过程通常涉及生成 向量嵌入(vector embeddings) ,这些向量嵌入储存在称为 向量存储(vector store) 的数据库中
  • Embeddings :在筛选数据相关性时,LlamaIndex 会将查询转换为嵌入,并在向量存储中找到与查询嵌入最相似的数据

查询阶段

  • Retrievers :检索器负责在给出查询时,如何有效地从索引中检索相关上下文,检索策略对所获取数据的相关性和执行效率至关重要
  • Routers :路由器用于确定使用哪个检索器从知识库中获取相关上下文。具体来说,RouterRetriever 类负责选择一个或多个候选检索器来执行查询,检索器的选择根据候选元数据和查询来匹配最佳的选项
  • Node Postprocessors :节点后处理器接收一组检索到的节点,并对它们转换、过滤或重新排序逻辑
  • Response Synthesizers :响应合成器使用用户查询和获取的一组文本片段,从LLM生成回应

Python构建方法

使用LlamaIndex进行构建通常涉及使用 LlamaIndex cor 和一系列的 插件 。Python 中有两种方法构建 LlamaIndex :

  • llama-index : 一个包含 core LlamaIndex 和一系列集成的入门级Python包
  • llama-index-core : 在 Llamahub 上安装 core LlamaIndex 以及所需的集成包。LlamaHub 有超过300个与核心无缝工作的 LlamaIndex 集成包,允许自由定义 LLM 、嵌入和向量存储

参考

[1]. llama-index - PyPI

[2]. LlamaIndex

[3]. LlamaHub

Langchain

LangChain 是一个基于大型语言模型(LLM)开发应用程序的框架,它主要有两个能力:

  1. 允许将 LLM 模型与外部数据源进行连接
  2. 允许与 LLM 模型进行交互

框架组成

  • langchain-core : 核心库
  • langchain-community : 第三方集成,如 langchain-openailangchain-anthropic
  • langchain : 构成应用程序认知架构的链(Chains)、代理(agents)和检索策略(retrieval strategies)
  • LangGraph : 集成 LangChain 中的建模图方法,非必需
  • LangServe : 将 LangCahin 链部署为 REST API
  • LangSmith : 开发人员平台,用于调试、测试、评估、监控 LLM 应用程序

概念构成

LLM & ChatModel

在 LangChain 中,ChatModel 和 LLM)都是用于处理自然语言输入的模型,但它们之间存在一些区别

  1. ChatModel 更擅长处理聊天对话场景,而 LLM 则具有更广泛的知识和语言理解能力
  2. LLM 能够处理更长的文本序列,并具有更高的语言理解能力
  3. ChatModel 适用于聊天机器人、对话系统等场景,而 LLM 可以应用于自然语言生成、文本分类、机器翻译等多个场景

ChatModel 是一种特定于聊天对话的模型,而 LLM 是一种更通用的大型语言模型

Loader 加载器

从指定源进行加载数据,如:

  • DirectoryLoader : 文件夹
  • CSVLoader : CSV 文件
  • EverNoteLoader : EverNote 笔记
  • UnstructuredHTMLLoader : 任意网页
  • PyPDFLoader : PDF 文件
  • YoutubeLoader : Youtube

具体见 Document loaders

Document 文档

当使用loader加载器读取到数据源后,数据源需要转换成 Document 对象后,后续才能进行使用

Vectorstores 向量存储

数据相关性搜索是通过向量运算的,所以需要将加载进来的数据 Document 进行向量化,才能进行向量运算搜索。转换成向量也很简单,只需要把数据存储到对应的向量数据库中即可完成向量的转换

LangChain Doc Vector Stores 部分介绍了四种向量存储选项:

  • Chroma
  • Pinecone
  • FAISS
  • Lance

向量存储无法直接集成到 LangChain 表达式语言链中

ectorstores 实现了一个 as_retriever ,这将生成一个 Retriever 对象,可以集成到 LangChain 表达式语言链中

Retrievers 检索器

检索器用于返回给定非结构化查询的文档,它比向量存储更通用

检索器不需要能够存储文档,只需返回(或检索)它们,向量存储可以作为检索器的主干

Retrievers 可以集成到 LCEL 链中,具体见 Vector stores and retrievers

Chain 链

我们可以把 Chain 理解为任务。一个 Chain 就是一个任务,当然也可以像链条一样,一个一个的执行多个链

Agent 代理

它可以动态的帮助选择和调用 chain 或者已有的工具

LangChain 表达式(LCEL)

LangChain 表达式语言(LCEL),是一种声明式的方式,可以轻松地将链条组合在一起

如下代码所示:

1
2
3
4
5
6
7
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

chain.invoke({"topic": "ice cream"})

其中

1
chain = prompt | model | output_parser

这行代码使用 LCEL 将不同的表达式组合在一起,形成一个单一的链条, | 类似于 unix 管道符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。

在上例链条中,用户输入被传递给提示模板,然后提示模板的输出被传递给模型,然后模型的输出被传递给输出解析器。

参考

[1]. LangChain 快速入门

[2]. LangChain v0.2