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)开发应用程序的框架,它主要有两个能力:
- 允许将 LLM 模型与外部数据源进行连接
- 允许与 LLM 模型进行交互
框架组成
langchain-core
: 核心库langchain-community
: 第三方集成,如langchain-openai
、langchain-anthropic
等langchain
: 构成应用程序认知架构的链(Chains)、代理(agents)和检索策略(retrieval strategies)LangGraph
: 集成 LangChain 中的建模图方法,非必需LangServe
: 将 LangCahin 链部署为 REST APILangSmith
: 开发人员平台,用于调试、测试、评估、监控 LLM 应用程序
概念构成
LLM & ChatModel
在 LangChain 中,ChatModel 和 LLM)都是用于处理自然语言输入的模型,但它们之间存在一些区别
- ChatModel 更擅长处理聊天对话场景,而 LLM 则具有更广泛的知识和语言理解能力
- LLM 能够处理更长的文本序列,并具有更高的语言理解能力
- 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 | prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}") |
其中
1 | chain = prompt | model | output_parser |
这行代码使用 LCEL 将不同的表达式组合在一起,形成一个单一的链条, |
类似于 unix 管道符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。
在上例链条中,用户输入被传递给提示模板,然后提示模板的输出被传递给模型,然后模型的输出被传递给输出解析器。
参考
[1]. LangChain 快速入门
[2]. LangChain v0.2