【大模型】百度千帆大模型对接LangChain使用详解

news2025/1/9 7:21:05

目录

一、前言

二、LangChain架构与核心组件

2.1 LangChain 核心架构

2.2 LangChain 核心组件

三、环境准备

3.1 前置准备

3.1.1 创建应用并获取apikey

3.1.2 开通付费功能

3.2 获取LangChain文档

3.3 安装LangChain依赖包

四、百度千帆大模型对接 LangChain

4.1 LLMS 大语言模型能力使用

4.1.1 代码操作演示

4.2 Chat models 能力使用

4.2.1 代码操作演示

4.3 Embedding models 能力使用

4.3.1 代码操作演示

4.4 Chains 能力使用

4.4.1 Chains 介绍

4.4.2 代码操作演示

4.4.3 SimpleSequenceChain用法

4.5 Prompts 组件能力使用

4.5.1 Prompts介绍

4.5.2 代码操作演示

4.6 Agents 组件能力使用

4.6.1 Agents 介绍

4.6.2 为什么需要借助第三方呢?

4.6.3 Agents 核心功能组件

4.6.4 Agents 常见类型

4.6.5 Agents 代码演示

4.7 Memory 组件使用

4.7.1 Memory 介绍

4.7.2 Memory 几种主要类型

4.7.3 代码操作演示

4.8 Indexes 组件使用

4.8.1 indexes 组件介绍

4.8.2 TextLoader 代码操作演示

4.8.3 文档分割器

4.8.4 VectorStores组件使用

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官方文档:

https://python.langchain.com/v0.2/docs/integrations/chat/

以v0.2的版本为例进行说明,从文档来看,里面涉及了关于LangChain的各种能力模型,在下文中进行逐一说明。 

3.3 安装LangChain依赖包

在编码进行API使用之前,先安装下面两个核心依赖包,后面有其他的需求再安装即可

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 代码操作演示

参考下面的代码


"""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 代码操作演示

参考如下代码

"""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 代码操作演示

参考下面的代码

"""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 代码操作演示

参考下面的代码

"""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来解决,参考下面的代码示例

"""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 代码操作操作演示

"""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 代码操作操作演示

"""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无法直接查询出来,因此需要依赖第三方组件,调用第三方组件库的能力协同完成这个问题的回答

安装第三方组件维基百科,执行下面的命令安装

pip install wikipedia
pip install numexpr

代码操作演示

"""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:

"""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使用

"""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长期保存会话记忆

"""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 代码操作演示

参考下面的代码

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类和方法定义进行文本分割;

参考下面的示例代码

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

 pip install chromadb

参考下面的完整代码

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,这个方法接收查询字符串,返回一组文档;

提前安装如下组件

pip install faiss-cpu

参考下面的完整代码

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各个组件的详细使用,并结合代码的操作演示详细说明了各个组件的使用场景,希望对看到的同学有用哦,本篇到此结束感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

Mysql--基础篇--事务(ACID特征及实现原理,事务管理模式,隔离级别,并发问题,锁机制,行级锁,表级锁,意向锁,共享锁,排他锁,死锁,MVCC)

在MySQL中&#xff0c;事务&#xff08;Transaction&#xff09;是一组SQL语句的集合&#xff0c;这些语句一起被视为一个单一的工作单元。事务具有ACID特性&#xff0c;确保数据的一致性和完整性。通过事务&#xff0c;可以保证多个操作要么全部成功执行&#xff0c;要么全部不…

使用VUE3创建个人静态主页

使用VUE3创建个人静态主页 &#x1f31f; 前言&#x1f60e;体验&#x1f528; 具体实现✨ 核心功能&#x1f3d7;️ 项目结构&#x1f680; 用这个项目部署 Git Page &#x1f4d6; 参考 &#x1f31f; 前言 作为开发者或者内容创作者&#xff0c;我们经常需要创建静态网页&a…

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…

【HTML+CSS+JS+VUE】web前端教程-3-标题标签

标题介绍与应用 标题是通过<h1>-<h6>标签进行定义的 <h1>定义最大的标题 <h6>定义最小的标题<h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> <h4>四级标题</h4> <h5>五级标题</h5…

Web应用安全-漏洞扫描器设计与实现

摘 要 随着Web2.0、社交网络、微博等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中各种应用都架设在Web平台上。Web应用的迅速发展也引起黑客们的强烈关注&#xff0c;接踵而至的就是Web安全威胁的凸显&#xff…

SpringBootWeb案例-1(day10)

准备工作 需求 & 环境搭建 需求说明 环境搭建 步骤&#xff1a; 准备数据库表(dept、emp)创建 springboot 工程&#xff0c;引入对应的起步依赖&#xff08;web、mybatis、mysql 驱动、lombok&#xff09;配置文件 application.properties 中引入 mybatis 的配置信息&…

《Spring Framework实战》5:Spring Framework 概述

欢迎观看《Spring Framework实战》视频教程 Spring 使创建 Java 企业应用程序变得容易。它为您提供一切 需要在企业环境中采用 Java 语言&#xff0c;并支持 Groovy 和 Kotlin 作为 JVM 上的替代语言&#xff0c;并且可以灵活地创建许多 类型的架构。从 Spring Framework 6.0 开…

逆向百例3——全国招标公告

所有内容仅供学习交流使用&#xff01; 全国招标公告搜索引擎 解决开发者工具打不开问题接口分析解密数据 本次逆向主要是解决该页面接口返回的数据&#xff0c;但是接口所返回的数据是密文&#xff0c;经过分析用的是标准DES&#xff0c;解密成明文即可。 解决开发者工具打不…

windows10下安装Microsoft SQL Server 2016

一、下载安装包 网站&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 选择需要的版本&#xff0c;点击详细信息&#xff0c;复制ed2k链接&#xff0c;打开eMule或迅雷&#xff0c;新建下载&#xff0c;粘贴链接&#xff0c;开始下载。 下载好的文件是一个.iso镜像文件。 二、…

一、二极管(应用篇)

1.5普通二极管应用 1.5.1钳位电路 利用二极管的固定的导通电压&#xff0c;在二极管处并联用电器&#xff0c;达到用电器的工作电压相对稳定。如果电源处有尖峰电压&#xff0c;则可以通过二极管导入到5v的电源内&#xff0c;防止此尖峰电压干扰用电器 &#xff0c;起到对电路的…

SpringCloud系列教程:微服务的未来(十)服务调用、注册中心原理、Nacos注册中心

本博客将重点介绍服务调用和注册中心的原理&#xff0c;特别是以 Nacos 为例&#xff0c;详细讲解 Nacos 注册中心如何实现服务的注册与发现。同时&#xff0c;分析 Nacos 注册中心在分布式微服务中的应用&#xff0c;帮助开发者更好地理解其工作机制。 目录 前言 微服务拆分…

eNSP之家----ACL实验入门实例详解(Access Control List访问控制列表)(重要重要重要的事说三遍)

ACL实验&#xff08;Access Control List访问控制列表&#xff09;是一种基于包过滤的访问控制技术&#xff0c;它可以根据设定的条件对接口上的数据包进行过滤&#xff0c;允许其通过或丢弃。访问控制列表被广泛地应用于路由器和三层交换机。 准备工作 在eNSP里面部署设备&a…

benchANT 性能榜单技术解读 Part 1:写入吞吐

近期&#xff0c;国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops&#xff08;时序数据库&#xff09;场景排名&#xff0c;KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…

消息队列MQ(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MQ学习笔记 前言一、发送者的可靠性1. 生产者重试机制2. 生产者确认机制3. 实现生产者确认 二、MQ的可靠性1. 数据持久化2. LazyQueue 前言 在用MQ实现异步调用时&#xff0…

HTML基础入门——简单网页页面

目录 一&#xff0c;网上转账电子账单 ​编辑 1&#xff0c;所利用到的标签 2&#xff0c;代码编写 3&#xff0c;运行结果 二&#xff0c;李白诗词 1&#xff0c;所用到的标签 2&#xff0c;照片的编辑 3&#xff0c;代码编写 4&#xff0c;运行结果 一&#xff0c;网…

365天深度学习训练营:第N2周:构建词典

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务: 使用N1周的.txt 文件构建词典&#xff0c;停用词请自定义 1. 导入数据 from torchtext.vocab import build_vocab_from_iterator from collection…

vue2迁移至rsbuild

背景 由于远程机器配置较低&#xff0c;每次运行vue2项目都会非常卡。后期项目文件、路由更多的时候&#xff0c;启动到一半直接会跳出open too many files类似的错误&#xff0c;尝试将路由屏蔽掉只剩下开发所需的一个路由也不行&#xff08;不是说webpack的打包是全部打包&am…

升级 Spring Boot 3 配置讲解 — 新版本的秒杀系统怎么做?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 1. Spring Boot 3 升级指南 在升级 Spring Boot 3 之前&#xff0c;首先需要确保你的项目已经升级到 Java 17&#xff0c;因为 Spring Boot 3 不再支持 Java 8 和 Java 11。接下来&…

Seata的部署与微服务集成

文章目录 Seata的部署与微服务集成1. Seata介绍2. 部署TC服务2.1 数据准备2.2 配置文件2.3 docker 部署2.4 访问 3. 微服务集成Seata3.1 引入服务3.2 改造配置3.3 添加数据库表3.4 注解标记 Seata的部署与微服务集成 1. Seata介绍 Seata 是一款开源的分布式事务解决方案&…