目录
[2.1 LangChain 核心架构](#2.1 LangChain 核心架构)
[2.2 LangChain 核心组件](#2.2 LangChain 核心组件)
[3.1 前置准备](#3.1 前置准备)
[3.1.1 创建应用并获取apikey](#3.1.1 创建应用并获取apikey)
[3.1.2 开通付费功能](#3.1.2 开通付费功能)
[3.2 获取LangChain文档](#3.2 获取LangChain文档)
[3.3 安装LangChain依赖包](#3.3 安装LangChain依赖包)
[四、百度千帆大模型对接 LangChain](#四、百度千帆大模型对接 LangChain)
[4.1 LLMS 大语言模型能力使用](#4.1 LLMS 大语言模型能力使用)
[4.1.1 代码操作演示](#4.1.1 代码操作演示)
[4.2 Chat models 能力使用](#4.2 Chat models 能力使用)
[4.2.1 代码操作演示](#4.2.1 代码操作演示)
[4.3 Embedding models 能力使用](#4.3 Embedding models 能力使用)
[4.3.1 代码操作演示](#4.3.1 代码操作演示)
[4.4 Chains 能力使用](#4.4 Chains 能力使用)
[4.4.1 Chains 介绍](#4.4.1 Chains 介绍)
[4.4.2 代码操作演示](#4.4.2 代码操作演示)
[4.4.3 SimpleSequenceChain用法](#4.4.3 SimpleSequenceChain用法)
[4.5 Prompts 组件能力使用](#4.5 Prompts 组件能力使用)
[4.5.1 Prompts介绍](#4.5.1 Prompts介绍)
[4.5.2 代码操作演示](#4.5.2 代码操作演示)
[4.6 Agents 组件能力使用](#4.6 Agents 组件能力使用)
[4.6.1 Agents 介绍](#4.6.1 Agents 介绍)
[4.6.2 为什么需要借助第三方呢?](#4.6.2 为什么需要借助第三方呢?)
[4.6.3 Agents 核心功能组件](#4.6.3 Agents 核心功能组件)
[4.6.4 Agents 常见类型](#4.6.4 Agents 常见类型)
[4.6.5 Agents 代码演示](#4.6.5 Agents 代码演示)
[4.7 Memory 组件使用](#4.7 Memory 组件使用)
[4.7.1 Memory 介绍](#4.7.1 Memory 介绍)
[4.7.2 Memory 几种主要类型](#4.7.2 Memory 几种主要类型)
[4.7.3 代码操作演示](#4.7.3 代码操作演示)
[4.8 Indexes 组件使用](#4.8 Indexes 组件使用)
[4.8.1 indexes 组件介绍](#4.8.1 indexes 组件介绍)
[4.8.2 TextLoader 代码操作演示](#4.8.2 TextLoader 代码操作演示)
[4.8.3 文档分割器](#4.8.3 文档分割器)
[4.8.4 VectorStores组件使用](#4.8.4 VectorStores组件使用)
[4.8.5 检索器的使用](#4.8.5 检索器的使用)
一、前言
在人工智能领域不断发展过程中,语言模型一直扮演着重要的角色。特别是大型语言模型(LLM),如 ChatGPT,已经成为科技领域的热门话题,并受到广泛认可。在这个背景下,LangChain 作为一个以 LLM 模型为核心的开发框架出现,为自然语言处理开启了一个充满可能性的世界。借助 LangChain,我们可以创建各种应用程序,包括聊天机器人和智能问答工具。
github: https://github.com/langchain-ai/langchain
中文文档:https://www.langchain.asia
官方文档:https://python.langchain.com/docs/get_started/introduction
二、LangChain架构与核心组件
LangChian 作为一个大语言模型开发框架,是 LLM 应用架构的重要一环,LangChian 可以将 LLM 模型、向量数据库、交互层 Prompt、外部知识、外部工具整合到一起,进而可以自由构建 LLM 应用。
2.1 LangChain 核心架构
如下是 langchain 的一张经典架构图
LangChain的核心架构主要包括基础层、能力层和应用层
- 基础层:
- 包括Models、LLM、Index三层。Models层支持各种模型类型和模型集成;LLM层强调对models层能力的封装以及服务化输出能力;Index层则对用户私域文本、图片、PDF等各类文档进行存储和检索。
- 能力层:
- 给基础层的能力安装上手、脚、脑,包括Chains、Memory、Tool三部分。Chains层抽象并定制化不同的执行逻辑,Memory层对Chains的执行过程中的输入、输出进行记忆并结构化存储,Tool层提供搜索、维基百科、天气预报等技能支持。
- 应用层:
- 构建各种各样有价值的服务,主要是Agent层。Agent层可以根据Tool和Chain组合出特定的服务,实现用户特定需求的目标。
2.2 LangChain 核心组件
下图展示了关于LangChain的核心组件
主要包括:
- 模型(models):
- LangChain支持各种模型类型和模型集成,包括Google的LaMDA、Meta的LLaMa、OpenAI的GPT-4等。
- 提示(prompts):
- 包括提示词管理、提示词优化和提示词序列化。提示是模型的输入,一般通过特定的模板组件构建而成,LangChain提供了预先设计好的提示模板,也支持自定义模板。
- 内存(memory):
- 在链/代理调用之间保持状态的概念。LangChain提供了标准的内存接口、内存实现以及使用内存的链/代理示例。
- 索引(indexes):
- 与文本数据结合使用时,语言模型往往更加强大。此模块涵盖了执行此操作的最佳实践。
- 链(chains):
- 不仅仅是单个LLM调用,还包括一系列调用(无论是调用LLM还是不同的实用工具)。LangChain提供了标准的链接口、许多与其他工具的集成,以及用于常见应用程序的端到端的链调用。
- 代理(agents):
- 涉及LLM做出行动决策、执行该行动、查看一个观察结果,并重复该过程直到完成。LangChain提供了标准的代理接口、一系列可供选择的代理,以及端到端代理的示例。
三、环境准备
LangChain框架提供了对市面上多种主流大模型的支持,比如OpenAI,百度千帆大模型,通义大模型等,本文以千帆大模型为例进行详细的说明。
3.1 前置准备
登录百度智能云控制台
https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application/detail/6098890
3.1.1 创建应用并获取apikey
创建成功后,会在个人应用列表中进行展示
点击某个应用,获取API Key和Secret Key的信息,后文在调用中会用到。
3.1.2 开通付费功能
点击左侧在线推理那里,在右侧显示的大模型列表上面,点击开通付费功能,如果你的账户余额充足的话,这里需要进行开通一下,这样才能在后面的代码中进行正常的调用
如果账户余额不足,需要提前进行充值,否则代码中将会调不通,通过右上角的财务那里进行充值,按需充值即可
3.2 获取LangChain文档
接下来演示下如何基于百度千帆大模型对LangChain的各种核心能力进行代码实战演示,LangChain官方文档:
以v0.2的版本为例进行说明,从文档来看,里面涉及了关于LangChain的各种能力模型,在下文中进行逐一说明。
3.3 安装LangChain依赖包
在编码进行API使用之前,先安装下面两个核心依赖包,后面有其他的需求再安装即可
python
pip install langchain
pip install qianfan
四、百度千帆大模型对接 LangChain
接下来对LangChain提供的核心组件能力的使用进行详细的演示和操作。
4.1 LLMS 大语言模型能力使用
LangChain 的 LLMS(Large Language Model Services)模块专注于与大型语言模型(LLM)的交互和服务化,旨在简化开发者在构建基于 LLM 的应用时的工作流程。它提供了一套工具和接口,用于轻松集成、调用和管理各种大型语言模型,如 Qwen(通义千问)、GPT 系列、BERT、T5 等。
4.1.1 代码操作演示
参考下面的代码
python
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#实例化对象
llm = QianfanLLMEndpoint(streaming=True)
#模型进行提问
res=llm("请用中文给我写一篇小学生春游的作文,字数不超过200字")
print(res)
运行上述代码,观察控制台输出效果
4.2 Chat models 能力使用
LangChain 的 Chat Models
是专门为构建对话系统设计的一系列工具和模型,旨在简化聊天机器人和其他基于对话的应用程序的开发过程。通过 LangChain 的 Chat Models,开发者可以获得一个结构化的框架来处理对话逻辑、管理对话状态、优化对话流程,并且可以轻松地集成不同的语言模型(如 Qwen、GPT 系列等)来实现自然流畅的对话体验。
4.2.1 代码操作演示
参考如下代码
python
"""For basic init and call"""
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import HumanMessage
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#实例化对象
chat = QianfanChatEndpoint(
streaming=True,
)
#构建消息内容
messages = [
HumanMessage(content="讲一个三岁儿童睡前的故事")
]
#发起提问
res = chat(messages)
print(res.content)
运行上述代码,观察控制台输出效果
补充说明:
- 在代码中实例化 QianfanChatEndpoint 对象时也可以指定使用的模型,具体可以参考官方文档说明
4.3 Embedding models 能力使用
Embedding Models
模块是 LangChain 框架的一部分,旨在简化文本嵌入的获取和使用过程。它支持多种流行的预训练嵌入模型,并提供了一个统一的接口来加载、调用这些模型。这使得开发者可以在不同的应用场景中轻松地应用最先进的嵌入技术,而无需担心底层实现细节。
4.3.1 代码操作演示
参考下面的代码
python
"""For basic init and call"""
import os
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#实例化对象
embed = QianfanEmbeddingsEndpoint()
#提问内容
res = embed.embed_query("hello langchain")
print(res)
运行上面的代码,可以看到控制台输出了一串浮点数的列表
4.4 Chains 能力使用
4.4.1 Chains 介绍
LangChain 的 Chains 是一个强大的功能模块,它允许开发者通过组合不同的组件来构建复杂的对话流程或任务处理逻辑。这些链条(chains)可以是线性的、分支的,甚至是循环的,具体取决于应用的需求。LangChain 提供了多种类型的链条结构,使得开发者可以根据特定的任务灵活地设计和实现对话系统或其他基于语言模型的应用程序。
Chains
模块的核心理念是将复杂的对话或任务处理过程分解为一系列更小的、可管理的步骤或组件,然后将它们连接起来形成一个完整的链条。每个组件都可以是一个简单的操作,如生成文本、调用 API、执行数据库查询等,也可以是另一个链条。这种方式不仅提高了代码的可读性和维护性,还增强了系统的灵活性和扩展性。
Chains 的核心功能如下:
-
链式调用:支持多个组件按顺序依次执行,前一个组件的输出作为下一个组件的输入。
-
条件分支:根据特定条件选择不同的执行路径,例如基于用户输入或某个外部事件的结果。
-
循环与迭代:可以在满足一定条件下重复执行某些步骤,直到达到预期目标。
-
记忆管理:内置对对话状态和上下文的记忆机制,确保多轮对话中的信息连贯性和一致性。
-
错误处理:提供异常捕获和恢复机制,保证即使在部分失败的情况下也能继续正常运行。
4.4.2 代码操作演示
参考下面的代码
python
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#定义模板
template = "请告诉我{country}这个国家的首都名字"
prompt=PromptTemplate(input_variables=["country"],template=template)
llm=QianfanLLMEndpoint()
chain = LLMChain(llm=llm,prompt=prompt)
result=chain.run("美国")
print(result)
4.4.3 SimpleSequenceChain用法
如果在应用中,有多个Chain需要串联起来使用又该怎么做呢?比如说,我需要将第一个chain的输出结果,作为下一个chain的输入,在这种情况下,就可以使用SimpleSequentialChain来解决,参考下面的代码示例
python
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain , SimpleSequentialChain
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
llm=QianfanLLMEndpoint()
#定义第一个chain
template = "请告诉我{country}这个国家的首都名字"
first_prompt=PromptTemplate(input_variables=["country"],template=template)
first_chain = LLMChain(llm=llm,prompt=first_prompt)
#定义第一个chain
template = "请描述一下{country2}这个国家的首都的主要历史"
second_prompt=PromptTemplate(input_variables=["country2"],template=template)
second_chain = LLMChain(llm=llm,prompt=second_prompt)
#链接两个chain verbose=true 显示模型的推理过程
all_chain=SimpleSequentialChain(chains=[first_chain,second_chain],verbose=True)
#最终执行时只需要传入第一个参数即可
res = all_chain.run("韩国")
print(res)
运行上面的代码,通过控制台可以看到第二个chain的结果是在第一个输出之后,并且给出了推理过程
4.5 Prompts 组件能力使用
4.5.1 Prompts介绍
LangChain 的 Prompts
模块是框架中用于管理和构建提示(prompt)的核心组件之一。在基于语言模型的应用开发中,提示扮演着至关重要的角色,因为它决定了模型接收到的输入形式和内容,进而影响生成输出的质量。通过精心设计的提示,可以显著提升模型的表现,确保其输出更加符合预期。
简单来说,Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是为了让模型理解更复杂的业务场景,以方便解决问题。在实际使用中,以提示词模板的形式使用,如果你有一个相对通用的提示词,可能在后续业务中能够多次复用这个提示词,就可以把这个提示词中的关键参数提取出来从而形成提示词模板,LangChain 就提供了PromptTemplate组件,可以更方便的构建这样的提示词模板。
核心功能:
-
Prompt Templates
- 允许定义可参数化的提示模板,其中包含占位符变量,可以在运行时被具体的值替换。这种灵活性使得同一个模板可以根据不同的场景灵活调整。
-
Few-shot Learning
- 支持少样本学习(few-shot learning),即在提示中加入少量示例,帮助模型理解任务要求并生成更合适的响应。
-
Zero-shot Prompt Template
- 零样本学习,它允许语言模型在没有特定任务训练的情况下执行新任务。与传统的 Few-shot 或者多轮对话不同,zero-shot 方法不依赖于提供示例输入输出对来引导模型理解任务要求。相反,它直接向模型描述任务,并期望模型能够根据其预训练的知识和上下文理解来完成任务。
-
Dynamic Prompting
- 能够根据对话历史或其他上下文信息动态生成提示,保持对话的一致性和连贯性。
-
Optimization Tools
- 提供了一些工具和技术来评估和改进提示的效果,如 A/B 测试、迭代优化等。
PromptTemplate常见类型
-
Simple Prompt Template
- 最基础的提示模板,通常包含一个固定的文本字符串和若干个占位符变量。
-
Few-shot Prompt Template
- 除了固定文本外,还包括一组示例输入输出对,用以指导模型如何处理新的输入。
-
Multi-step Prompt Template
- 适用于需要多轮交互的任务,每个步骤都有独立的提示模板,并且可以根据前序结果调整后续提示的内容。
4.5.2 代码操作演示
Zero-shot Prompt Template 代码操作操作演示
python
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#定义模板
template = "请告诉我{subject}这个国家的首都名字"
prompt=PromptTemplate(input_variables=["subject"],template=template)
prompt_text = prompt.format(subject="韩国")
#实例化对象
llm=QianfanLLMEndpoint()
#将提示词完整数据导入模型
res = llm(prompt_text)
print(res)
运行代码后观察控制台输出效果
Few-shot Prompt Template 代码操作操作演示
python
"""For basic init and call"""
import os
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import FewShotPromptTemplate
from langchain_community.llms import QianfanLLMEndpoint
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
examples=[
{"word":"大","antonym":"小"},
{"word":"上","antonym":"下"},
{"word":"左","antonym":"右"}
]
example_template="""
单词 : {word}
反义词: {antonym}\\n
"""
#实例化PromptTemplate
example_prompt=PromptTemplate(input_variables=["word","antonym"],template=example_template)
#实例化FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="给出每个单词的反义词",
suffix="单词: {input} \\n 反义词: ",
input_variables=["input"],
example_separator="\\n"
)
prompt_text=few_shot_prompt.format(input="远")
#实例化对象
llm=QianfanLLMEndpoint()
res = llm(prompt_text)
print(res)
运行上面的代码,通过控制台输出效果可以看到输入的是远,模型最后预测的结果是近
4.6 Agents 组件能力使用
4.6.1 Agents 介绍
LangChain 的 Agents 模块是框架中用于构建智能代理(agents)的核心组件之一。这些智能代理能够执行特定的任务,如调用 API、查询数据库、解析命令等,并且可以根据上下文信息动态地做出决策。通过集成不同的工具和服务,Agents 可以极大地扩展基于语言模型的应用程序的功能和灵活性。
简单来说,LangChain 中的Agents作用就是根据用户的需求,来访问一些第三方工具,比如搜索引擎,数据库,API接口等,进而解决特定的问题
4.6.2 为什么需要借助第三方呢?
尽管大模型已经很强大了,但是仍然具备一定的局限性,比如资深的模型知识库内容储备不足,不能实时回答问题,信息落后,处理一些数学问题逻辑有限等,在这种情况下,就需要借助第三方工具来辅助大模型完成某些复杂的场景下的任务
4.6.3 Agents 核心功能组件
Agents
模块提供了一种抽象化的方式来定义和管理智能代理。每个代理都是一个独立的实体,具有明确的目标和行为模式。它们可以接收来自用户的输入或系统事件触发的指令,然后根据预定义的逻辑或通过与外部服务交互来完成任务。此外,Agents
还支持多轮对话中的持续互动,保持对话状态的一致性和连贯性。
核心功能涉及的组件主要包括:
-
Tool Integration
- 允许开发者轻松集成各种工具和服务,如搜索引擎、知识库、CRM 系统、API 接口等。这使得代理能够访问更广泛的信息源,增强其解决问题的能力。
-
Task Execution
- 支持定义复杂的任务流,包括顺序执行、条件分支、循环迭代等多种结构。这样可以实现从简单查询到复杂业务流程处理的各种需求。
-
Context Management
- 内置对对话历史和上下文的记忆机制,确保代理在多轮对话中能够记住之前的交互内容,提供更加自然流畅的用户体验。
-
Error Handling and Recovery
- 提供异常捕获和恢复机制,保证即使部分任务失败也能继续正常运行,提高了系统的鲁棒性。
4.6.4 Agents 常见类型
常见的Agents 类型如下:
-
Simple Agent:
- 最基础的一种代理类型,通常用于执行单一任务,如调用某个 API 或查询特定数据源。
-
Multi-tool Agent
- 能够同时集成多个工具和服务,根据任务需求灵活选择合适的资源来完成工作。
-
Conversational Agent
- 专注于对话式交互的代理,支持多轮对话中的持续互动,保持对话状态的一致性和连贯性。
-
Custom Agent
- 允许开发者创建完全定制化的代理,以应对特殊业务场景或复杂任务处理要求。
4.6.5 Agents 代码演示
需求场景描述:
-
通过langchain查询我国的国土面积和美国人口数量;
- 由于直接使用langchain的api无法直接查询出来,因此需要依赖第三方组件,调用第三方组件库的能力协同完成这个问题的回答
安装第三方组件维基百科,执行下面的命令安装
python
pip install wikipedia
pip install numexpr
代码操作演示
python
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
from langchain_core.prompts import PromptTemplate
from langchain.agents import load_tools, initialize_agent , AgentType
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#实例化模型对象
llm=QianfanLLMEndpoint()
#加载第三方工具
tools=load_tools(["llm-math","wikipedia"],llm=llm)
#创建agent
agent=initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
prompt_template="中国的人口目前是多少?"
prompt = PromptTemplate.from_template(prompt_template)
#执行
result=agent.run(prompt)
print(result)
运行上面的代码,通过控制台输出可以看到agent在推理过程中就生效了
4.7 Memory 组件使用
4.7.1 Memory 介绍
LangChain 的 Memory
模块是框架中用于管理对话状态和上下文信息的核心组件之一。在构建对话系统时,保持对话历史记录和相关上下文对于实现连贯且自然的多轮对话至关重要。通过使用 LangChain 的 Memory
,开发者可以轻松地存储、检索和更新对话中的重要信息,确保模型能够根据之前的交互内容做出更准确的响应。
1)大模型本身不具备上下文的概念,并不保存上一次的交互内容,ChatGPT之所以能够和人正常的对话,因为它进行了一层封装,将历史记录回传给了模型;
2)LangChain 也提供了Memory组件,Memory分为2种类型,短期记忆和长期记忆;
3)短期记忆一般指的是单一会话时传递数据,长期记忆则是处理多个会话时获取和更新信息;
4.7.2 Memory 几种主要类型
LangChain 中主要包括下面几种类型的Memory
-
ConversationBufferMemory
- 最基础的一种记忆类型,它简单地将对话历史作为字符串列表保存起来。适用于需要记住最近几轮对话内容但不需要复杂查询能力的场景。
-
VectorStoreRetriever
- 利用向量存储技术(如 FAISS, Pinecone 等)来表示和检索记忆。这种方式特别适合需要根据语义相似度查找相关信息的情况,例如在知识库中搜索答案。
-
RedisMemory
- 基于 Redis 数据库的记忆解决方案,提供高效的键值对存储,并支持持久化和分布式部署。
-
Custom Memory Implementations
- 允许开发者根据特定应用场景自定义记忆逻辑,比如结合 SQL 数据库或其他第三方服务。
4.7.3 代码操作演示
方式1,使用ChatMessageHistory:
python
"""For basic init and call"""
import os
from langchain.memory import ChatMessageHistory
history = ChatMessageHistory()
#模拟添加用户的问问题记录
history.add_user_message("杭州今天的天气怎么样")
#模拟添加ai回答问题的记录
history.add_ai_message("杭州今天是晴天")
#历史记录
print(history.messages)
运行上面的代码,通过控制台输出记录可以看到历史对话信息被存储起来了
方式2,结合千帆大模型ConversationChain使用
python
"""For basic init and call"""
import os
from langchain.chains import ConversationChain
from langchain_community.chat_models import QianfanChatEndpoint
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#实例化模型对象
llm=QianfanChatEndpoint()
conversation=ConversationChain(llm=llm)
result1=conversation.predict(input="杭州昨天是下雨天")
print(result1)
result2=conversation.predict(input="杭州明天是晴天")
print(result2)
result3=conversation.predict(input="杭州今天的天气怎么样")
print(result3)
运行上面的代码,观察控制台的输出效果
方式3,使用messages_to_dict长期保存会话记忆
python
"""For basic init and call"""
import os
from langchain.memory import ChatMessageHistory
from langchain.schema import messages_from_dict,messages_to_dict
history = ChatMessageHistory()
#模拟添加用户的问问题记录
history.add_user_message("杭州今天的天气怎么样")
#模拟添加ai回答问题的记录
history.add_ai_message("杭州今天是晴天")
dicts=messages_to_dict(history.messages)
print(dicts)
history_messages = messages_from_dict(dicts)
print(history_messages)
运行上面的代码,观察输出效果
4.8 Indexes 组件使用
4.8.1 indexes 组件介绍
Indexes
模块提供了多种类型的索引结构和工具,使得用户可以根据具体需求选择最合适的方式来进行文本数据的索引和检索。它不仅支持传统的基于关键词的索引方法,还集成了先进的向量搜索技术,如 FAISS 和 Pinecone,以实现语义级别的相似度匹配。此外,LangChain 还支持与外部数据库和服务的集成,进一步扩展了索引功能的应用范围。
具体来说,indexes 组件目的是让LangChain 具备文档处理的能力,包括:文档加载,检索等,需要注意的是,这里的文档不局限于txt,pdf,html等,还包括邮件、视频等
indexes 主要分下面几个大的类型:
-
文档加载器
-
基于TextLoader包下的API;
-
使用的时候只需要引入相应的loader工具;
-
-
文本分割器
-
VectorStores
-
检索器
4.8.2 TextLoader 代码操作演示
参考下面的代码
python
import os
from langchain_community.document_loaders import TextLoader
loader1 = TextLoader("./data.txt",encoding="utf-8")
doc1=loader1.load()
print(doc1)
运行一下代码观察控制台输出效果
4.8.3 文档分割器
由于模型对输入的字符长度有限制,如果在碰到很长的文本时,需要把从长文本分割成多个小的文本片段。
-
文本分割最简单的方式是按照字符长度进行分割,这样会带来很多问题,比如当文本是一段代码的时候,这段代码分割之后就成了两段没有意义的字符,所以整体的原则是把语义相关的文本片段尽可能放在一起;
-
LangChain 中最基本的文本分割器是CharacterTextSplitter,它按照指定的分隔符(默认为 \n\n)进行分割,并且考虑文本片段的最大长度;
常用的文档分割器有:
-
LatexTextSplitter
- 沿着Latex标题、枚举等分割文本;
-
MarkdownTextSplitter
- 沿着Markdown的标题,代码块或水平规则进行文本分割;
-
TokenTextSplitter
- 根据OpenAI的token数进行分割;
-
PythonCodeTextSplitter
- 沿着Python类和方法定义进行文本分割;
参考下面的示例代码
python
import os
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter (
separator=" ", #使用空格分割,空格也是字符
chunk_size=5, #指定每个分割文本块的大小
chunk_overlap=1, #每块之间重叠的字符,有重复的内容可以更好的进行衔接上下文
)
#单个文本切割的情况
res1 = text_splitter.split_text("a b c d e f")
print(res1)
#多段文本进行切割
res2 = text_splitter.create_documents(["a b c d e f","e f g h"])
print(res2)
运行上面的代码,观察文本分割后的效果
4.8.4 VectorStores组件使用
VectorStores是一种特殊类型的数据库,它的作用是存储嵌入创建的向量数据,提供类似于文档检索的功能,VectorStores可以选择的开源组件有很多,比如Redis、FAISS、Weaviate、Chroma、Milvus等
LangChain 的
VectorStores
模块是框架中用于高效管理和检索向量数据的核心组件之一。它特别适用于那些需要基于语义相似度来查找相关信息的应用场景,如智能客服、问答系统、推荐引擎等。通过将文本或其他类型的数据转换为高维向量表示,并存储在优化过的向量数据库中,VectorStores
可以显著提高查询速度和准确性。
下面我们使用Chroma这款轻量级数据库作为VectorStores存储向量数据的数据库进行演示,安装Chroma
bash
pip install chromadb
参考下面的完整代码
python
import os
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_community.vectorstores import Chroma
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#1、读取文档内容
with open("./data.txt",encoding="utf-8") as f:
str=f.read()
#2、切分文档
text_splitter=CharacterTextSplitter(chunk_size=100,chunk_overlap=5)
texts_res=text_splitter.split_text(str)
print(len(texts_res))
#3、将切分后的文档向量化存储
embed = QianfanEmbeddingsEndpoint()
search_doc=Chroma.from_texts(texts_res,embed)
query = "2023年中国新能源汽车销量有多少"
query_res=search_doc.similarity_search(query)
print(query_res)
运行上面的代码,观察控制台的输出效果
4.8.5 检索器的使用
检索器是一种便于模型查询的存储数据的方式,LangChain 约定检索器组件至少有一个方法 get_relevant_texts,这个方法接收查询字符串,返回一组文档;
提前安装如下组件
bash
pip install faiss-cpu
参考下面的完整代码
python
import os
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
os.environ["QIANFAN_AK"] = "你的AK"
os.environ["QIANFAN_SK"] = "你的SK"
#1、加载文档
loader1 = TextLoader("./data.txt",encoding="utf-8")
docments=loader1.load()
#2、切分文档
text_splitter=CharacterTextSplitter(chunk_size=100,chunk_overlap=5)
texts=text_splitter.split_documents(docments)
#实例化embeddings模型
embed = QianfanEmbeddingsEndpoint()
#使用FAISS创建一个数据库
db=FAISS.from_documents(texts,embed)
#{"k":1} , 表示每次检索返回1个最相关的文档
retriever=db.as_retriever(search_kwargs={"k":1})
#使用上面的检索器进行数据查询获取
result=retriever.get_relevant_documents("电池技术的作用")
print(result)
运行上面的代码,观察控制台输出,在全部的文档中将会查找最符合要求的一个
五、写在文末
本文通过较大的篇幅详细介绍了LangChain以及LangChain各个组件的详细使用,并结合代码的操作演示详细说明了各个组件的使用场景,希望对看到的同学有用哦,本篇到此结束感谢观看。