【大语言模型】LangChain 核心模块介绍(Chains、Retrieval、Tools)

在这里插入图片描述


【大语言模型】LangChain 核心模块

  • 一、LangChain 核心模块 Chains
    • 1、简介
    • 2、应用场景
    • 3、使用技巧
      • 3.1、LCEL Chains
      • 3.2、Legacy Chains
    • 4、实践演练
  • 二、LangChain 核心模块 Retrieval
    • 1、简介
    • 2、应用场景
      • 2.1、需求说明
      • 2.2、实现思路
  • 三、LangChain 核心组件 Tools
    • 1、应用场景
    • 2、使用原理
    • 3、Tools 需要包含的信息
    • 4、实践应用
      • 4.1、Tools 的常见类型
      • 4.2、默认工具
      • 4.3、自定义工具
        • 4.3.1、@TOOL 装饰器使用说明
        • 4.3.2、工具的异常处理
        • 4.3.3、解决的问题:异常忽略

一、LangChain 核心模块 Chains

1、简介

Chains 是指调用的序列,这个序列包含 LLM、工具、数据预处理等多个不同类型的步骤。Chains 的主要实现方式有两种:

  • 1、使用LangChain LCEL 表达式语言,构建 Chains。
  • 2、通过继承旧版 Chain 类的子类而构造的链(不推荐)。

其中主要推荐大家使用 LCEL 进行 Chains 的使用。原因是因为:

  • 1、使用简单。
  • 2、支持多种方式,包含 streaming(流),async(异步),而且开箱即用。
  • 3、非常易于观察每个实现步骤。

2、应用场景

Chains 的应用场景非常广,简直就是 LangChain 最核心的能力,基本上所有的 Retrieval 或则是 RAG 甚至是 ReaAct 都需要结合 Chains 去做实现。

3、使用技巧

3.1、LCEL Chains

官方文档对于不同的 Chain 的使用有非常清晰的表述,而官网还在不断增加不同类型的 Chain。每个 Chain 包含这些信息:

  • Chain 构造器: 主要为这个 Chain 对应的构造函数,以及 api 文档说明,这些构造函数的返回值均为 LCEL 可运行对象。
  • Function Calling:是否支持 OpenAI 的 function calling 功能。function calling 的介绍
  • 其他工具:在这个 Chain 中是否有使用其他工具
  • 何时使用:这个 Chain 的应用场景。

我们在使用不同的 Chain 的过程中,只需要注意根据不同的应用场景以及参数信息去进行使用即可。

3.2、Legacy Chains

由于官方更建议使用 LCEL Chains 而不是 Legacy Chains ,所以关于 Legacy Chains 不作为必须要学习的内容,如果想要了解相关的具体说明可以参考官方文档。

4、实践演练

在前面的案例实践中,就已经有Chains的使用,主要在:

  • LangChain提示词+大语言模型应用

Chains 这块的知识基本在前面的章节都有所应用。在后面的练习中,基本每个模块也都会涉及到Chains的使用,以及LangChain官方提到的其他的构造器的使用,例如LangChain核心模块Retrieval使用到了create_stuff_documents_chain与create_retrieval_chain构造器。

二、LangChain 核心模块 Retrieval

1、简介

许多 LLM 应用程序需要使用用户的数据而这些数据不属于 LLM 的一部分。所以则需要 RAG检索增强生成解决此问题,LangChain 可以很好的提供此能力。
在这里插入图片描述
从图中可以得知,LangChain 在实现 RAG 的时候,主要就是通过以下几个步骤完成:

  • Document loaders:LangChain 提供 100 多种不同的文档加载能力 L 其中包含多个类型的文档加载:HTML、PDF、代码的集成。
  • Text Splitting:检索的关键部分是仅获取文档的相关部分。 这涉及几个转换步骤来准备文档以供检索。这里的主要任务之一是将大文档分割(或分块)为更小的块
  • Text embedding models:嵌入捕获文本的语义,使您能够快速有效地找到文本的其他相似部分
  • Vector stores:向量数据库
  • Retrievers:检索器包含父文档检索器、自查询检索器、集成检索器。
  • Indexing:将其他数据来源的数据同步到向量数据库中

2、应用场景

LangChain 的 Retrieval 就是非常经典的 RAG 的应用场景:

  • 知识库检索。
  • 问答机器人。

等多种与检索相关的应用场景。

2.1、需求说明

加载网页中的内容,然后针对此网页的内容进行检索。

2.2、实现思路

1、数据导入:从第三方的信息源导入数据信息。
2、数据切分:如果数据比较庞大,则可以对数据进行切分处理。
3、创建向量数据库与 embedding。
4、查询检索操作:

  • create_stuff_documents_chain: 获取文档,并将其格式化到提示词中。
  • create_retrieval_chain: 检索 chain。
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# 数据导入
loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
# 数据切分
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
# 创建embedding
embeddings = OpenAIEmbeddings()
# 通过向量数据库存储
vector = FAISS.from_documents(documents, embeddings)
# 查询检索
# 创建 prompt
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input}""")
# 创建模型
llm = ChatOpenAI()
# 创建 document 的chain, 查询
document_chain = create_stuff_documents_chain(llm, prompt)

from langchain_core.documents import Document
document_chain.invoke({"input": "how can langsmith help with testing?",
                       "context":[Document(page_content="langsmith can let you visualize test results")]})



from langchain.chains import create_retrieval_chain
# # 创建搜索chain 返回值为 VectorStoreRetriever
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
# # 执行请求
response = retrieval_chain.invoke({"input": "how can langsmith help with testing?"})
print(response["answer"])

三、LangChain 核心组件 Tools

1、应用场景

在没有 Tools 之前,无论是 Agents、Chains 或 LLM 都只具备生成一些数据或者信息,但是不具备任何的操作能力。比如让大模型直接生成某个文件,让大模型执行某些代码等操作,均无法实现。

而 Tools 完美的填补了这一片空白,如果把 LLM 比喻做大脑,Agents Chains 是中枢神经,那么 Tools 就是一个人的手和脚。

所以 Tools 的学习,是为了后面 Agent 的使用而打基础。

2、使用原理

大语言模型根据当下应用场景进行判断,是否应该使用此工具。所以工具的描述至关重要,如果工具描述不清晰,则可能会导致大语言模型无法很好的将这些工具应用在适用的场景之上。

3、Tools 需要包含的信息

作用对应字段名
工具名称。name
该工具是什么的描述。description
工具输入内容的 JSON 架构。args_schema
工具的结果是否应直接返回给用户。return_direct
要调用的函数。

4、实践应用

4.1、Tools 的常见类型

  • Built-In Tools(默认工具)
  • Custom Tools(自定义工具)
  • Toolkits(工具包)
  • Tools as OpenAI Functions(工具作为 OpenAI 函数)

4.2、默认工具

  • 使用内置的维基百科工具进行搜索操作
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper

api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100)
tool = WikipediaQueryRun(api_wrapper=api_wrapper)
# 工具的名称
# tool.name
# 描述
# tool.description
# 输入参数
# tool.args
# 我们可以看到该工具是否应该直接返回给用户
# tool.return_direct
print(tool.run({"query": "langchain"}))


4.3、自定义工具

定制工具主要的使用方式有 3 种:

工具类型应用场景
@tool 装饰器@tool 装饰器是定义自定义工具的最简单方法
继承 BaseTool使用更为复杂,定制性更强
StructuredTool前两种方法的结合
4.3.1、@TOOL 装饰器使用说明

tools 的定义:

@tool
def search(query: str) -> str:
    """Look up things online."""
    return "LangChain"

print(search.name)
print(search.description)
print(search.args)

通过打印 search 函数的属性,可以了解到:

  • 默认函数名为工具的 name。
  • 默认函数的注释为工具的 description。
  • 默认函数的参数为工具的 args。

如果想修改默认的函数的属性,可以通过如下的方法进行修改:

from langchain_core.tools import tool, ToolException, StructuredTool
from pydantic import BaseModel, Field


class SearchInput(BaseModel):
    # 定义参数的描述
    # 参数名 = Field(description="参数的描述")
    query: str = Field(description="should be a search query")


# return_direct=True 是否直接从工具返回而不是继续Agent的循环。若设为True,则会中断Agent的执行
@tool("search-tool", args_schema=SearchInput, return_direct=True)
def search(query: str) -> str:
    """Look up things online."""
    return "LangChain"


print(search.name)
print(search.description)
print(search.args)
print(search.return_direct)
search-tool
Look up things online.
{'query': {'description': 'should be a search query', 'title': 'Query', 'type': 'string'}}
True

return_direct=True:表示是否直接从工具返回而不是继续Agent的循环。若设为True,则会中断Agent的执行。

4.3.2、工具的异常处理

以下这段代码定义了一个 tools 的构造器,在代码中,我们添加了一个抛出异常的操作:

def search_tool1(s: str):
    raise ToolException("The search tool1 is not available.")


# 效果等同于给 search_tool1 加装饰器
search = StructuredTool.from_function(
    func=search_tool1,
    name="Search_tool1",
    description="A bad tool",
)

print(search.run("test"))
raise ToolException("The search tool1 is not available.")
langchain_core.tools.base.ToolException: The search tool1 is not available.
4.3.3、解决的问题:异常忽略

如果没有加异常处理,那么工具的使用效果为,直接抛出异常。如果在工具构造的时候给它添加了异常处理:

def search_tool1(s: str):
    raise ToolException("The search tool1 is not available.")


# 效果等同于给 search_tool1 加装饰器
search = StructuredTool.from_function(
    func=search_tool1,
    name="Search_tool1",
    description="A bad tool",
    # 捕获异常错误
    handle_tool_error=True,
)

print(search.run("test"))

那么执行之后,则不会抛出异常信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接&#xff1a;Uniapp Tool - IntelliJ IDEs Plugin | Marketplace &#xff08;结合自己的webstorm版本下载&#xff0c;不然解析不了&#xff09; 将下载到的zip文件防在webstorm安装路径下&#xff0c;本文的地址为&#xff1a; 2、安装uniapp插…

实现 RAM 时应该考虑的性能因素

实现 RAM 时应该考虑的性能因素 要高效地推断存储元件&#xff0c;需要考虑下列影响性能的因素&#xff1a; • 使用专用块还是分布式 RAM RAM 可以在专用块 RAM 或使用分布式 RAM 的 LUT 内实现。不同的选择会影响资源选择&#xff0c;同时还会严重地影响性 能和功耗…

【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…

TongWe7.0-东方通TongWeb控制台无法访问 排查

**问题描述&#xff1a;**无法访问TongWeb的控制台 逐项排查&#xff1a; 1、控制台访问地址是否正确&#xff1a;http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在&#xff0c;执行命令&#xff1a;ps -ef|grep tongweb 3、确认TongWeb服务启动…

【Python入门】传输与运算成分

文章一览 前言一、print函数&#xff08;输出&#xff09;1、字符串和数值类型&#xff0c;可以直接输出2、变量&#xff1a;无论什么类型&#xff0c;数值、字符、列表、字典... 可以直接输出3. 格式化输出3.1 str.format() 方法3.2 f-string 方法 二、input 函数1、函数 eval…

Linux内核结构及源码概述

参考&#xff1a;深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) Linux 是一个庞大、高效而复杂的操作系统&#xff0c;虽然它的开发起始于 Linus Torvalds 一个人&#xff0c;但随着时间的推移&#xff0c;越来越多的人加入了 Linux 的开发和对它的不断完善…

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

某名校考研自命题C++程序设计——近10年真题汇总(上)

本帖更新一些某校的编程真题&#xff0c;总体来说不难&#xff0c;考察的都是基本功&#xff0c;92高校大一期末的难度&#xff0c;不过有些细节颇为繁琐&#xff0c;各位还是需要一定程度上注意的~ 目录 一.分数求和 二.大小写字母转换 三.判断当年天序 四.交替合并字符串…

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

R语言的数据结构-向量

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中&#xff0c;数据结构是非常关键的部分&#xff0c;它提…

SpringBoot使用Nacos进行application.yml配置管理

Nacos是阿里巴巴开源的一个微服务配置管理和服务发现的解决方案。它提供了动态服务发现、配置管理和 服务管理平台。Nacos的核心功能包括服务发现、配置管理和动态服务管理&#xff0c;使得微服务架构下的服务治理 变得简单高效。 Nacos的设计基于服务注册与发现、配置管理、动…

【Java学习笔记】Collections 工具类

一、基本介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作 二、排序操作&#xff1a;&#xff08;均为 static 方法) 三、查找、替换

【含开题报告+文档+PPT+源码】基于ssm框架的购物交流圈交流及市场服务平台

开题报告 随着互联网技术的迅猛发展&#xff0c;社交网络和电子商务已成为人们日常生活中不可或缺的一部分。特别是在移动互联网的普及下&#xff0c;人们越来越倾向于通过在线平台进行交流、分享和购物。这种趋势为基于 SSM&#xff08;Spring、SpringMVC、MyBatis&#xff0…

Datawhale AI 冬令营(第一期)定制你的第一个专属模型-学习笔记

最近我报名参加了Datawhale组织的主题为“动手学系列&#xff0c;人人都能应用的AI”的Datawhale AI冬令营&#xff08;第一期&#xff09;。 本次学习一共12天&#xff0c;从12月10日-12月21日&#xff0c;学习会包含【跑通速通手册】&#xff0c;【学习大模型微调&数据集…

GS-SLAM论文阅读--RGBDS-SLAM

前言 最近GS-SLAM领域的工作层出不穷&#xff0c;有很多不错的工作出现。接下来慢慢写一下相关博客。 文章目录 前言1.背景介绍2.关键内容2.1 3D多层次金字塔高斯喷溅2.2 紧密耦合多特征重构优化2.3总体流程 3.文章贡献4.个人思考 1.背景介绍 高保真重建是密集SLAM的关键。最…

使用EventLog Analyzer进行Apache日志监控和日志分析

一、什么是Apache日志分析 Apache日志分析是网站管理和维护的重要部分&#xff0c;通过分析Apache服务器生成的日志文件&#xff0c;可以了解网站的访问情况、识别潜在的安全问题、优化网站性能等。 二、Apache日志类型 Apache日志主要有两种类型&#xff1a;访问日志&a…

[计算机网络]IP地址推行的“书同文,车同轨”

硬件地址无法直接转换的故事 在很久很久以前&#xff0c;网络世界就像一个庞大的帝国&#xff0c;各个村落&#xff08;网络&#xff09;都有自己的语言&#xff08;硬件地址&#xff09;。每个村落都有自己的规则和习惯&#xff0c;村里的每户人家&#xff08;设备&#xff0…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中&#xff0c;九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖&#xff0c;用户可以随机获得不同奖品&#xff0c;增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能&#xff0c;并通过代码解析展示实现细节。 【环境准…

idea 配置 git .gitignore文件配置

.gitignore 内容 .idea/ *.iml target/ *.class *.log .iml在idea项目里面创建一个.gitignore名字的文件&#xff0c;然后把这个文件提交到git上。我一般是放到.idea同级目录。 我遇到了几种情况这个文件配置了但是不生效的情况 第一种 Git的缓存可能会导致配置不生效。尝试…