文章目录
- LangChain
- 一、背景
- 二、什么是langchain
- 三、Components 组件
- Prompt templates 提示模板
- Chat models 聊天模型
- Messages 消息
- Document loaders
- Text Spltters 文本分割
- Vectorstores 向量数据库
- 四、langchain基础概念
- Tool calling 工具调用
- (1) 工具创建
- (2) 工具绑定
- (3) 工具调用
- (4) 工具执行
- tool-calling最佳实践
- 五、langchain使用环境的搭建、安装
- 参考资料
- 视频学习资料整理
LangChain
一、背景
2024年12月20日,美国人工智能公司LangChain日前发布了《2024年人工智能全景报告》(State of AI Report 2024)。自2018年开始,LangChain团队已连续七年发布当年的《人工智能全景报告》,成为人工智能行业流行的风向标。在今年的报告中,通过深入探究大模型应用开发平台LangSmith产品的使用模式,LangChain团队揭示出人工智能生态系统以及人们构建大型语言模型应用的方式是如何演变的。
LangChain团队在报告中指出,随着用户在LangSmith中进行追踪、评估和迭代,他们观察到了几个显著的变化,其中包括开源模型采用率的急剧上升,以及从以检索工作流程为主转向具有多步骤、代理性工作流程的智能体应用。
二、什么是langchain
LangChain是一个开源的Python库,它提供了构建基于大模型的AI应用所需的模块和工具。它可以帮助开发者轻松地与大型语言模型(LLM)集成,实现文本生成、问答、翻译、对话等任务。LangChain的出现大大降低了AI应用开发的门槛,使得任何人都可以基于LLM构建自己的创意应用。
目前,它提供了 Python 和 JavaScript(确切地说是 TypeScript)的软件包。
如果您是一个 构建生产级应用的开发者,并且需要一个 灵活、以代码为中心的解决方案,LangChain 是您的最佳选择。它非常适合那些希望控制应用架构并且能舒适地编写代码来定义工作流程的开发者。
三、Components 组件
Prompt templates 提示模板
官方文档:https://python.langchain.com/docs/concepts/prompt_templates/
提示模板负责将用户输入的格式格式化为可传递给语言模型的格式。
Prompt Templates 将字典作为输入,其中每个键代表 Prompt 模板中要填写的变量。
PromptTemplate 的常用方法如下所示:
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")
prompt_template.invoke({"topic": "cats"})
Chat models 聊天模型
官方文档:https://python.langchain.com/docs/integrations/chat/
聊天模型是较新的语言模型形式,用于接收消息并输出消息。
聊天模型是使用一系列消息作为输入并返回消息作为输出(而不是使用纯文本)的语言模型。这些通常是较新的型号。
Messages 消息
官方文档:https://python.langchain.com/docs/concepts/messages/
Messages are the input and output of chat models. They have some content and a role, which describes the source of the message.
消息是聊天模型的输入和输出。它们具有一些内容和一个角色,用于描述消息的来源。
Each message has a role (e.g., “user”, “assistant”) and content (e.g., text, multimodal data) with additional metadata that varies depending on the chat model provider.
每条消息都有一个角色(例如,“用户”、“助手”)和内容(例如,文本、多模态数据),以及根据聊天模型提供商而有所不同的附加元数据。
LangChain 提供了可以跨聊天模型使用的统一消息格式,允许用户使用不同的聊天模型,而无需担心每个模型提供商使用的消息格式的具体细节。
Document loaders
官方文档:https://python.langchain.com/docs/integrations/document_loaders/
Document 文档
当使用loader加载器读取到数据源后,数据源需要转换成 Document 对象后,后续才能进行使用。
DocumentLoaders load data into the standard LangChain Document format.
DocumentLoader 将数据加载为标准的 LangChain Document 格式。
官方提供了超级的多的加载器供你使用
Text Spltters 文本分割
顾名思义,文本分割就是用来分割文本的。为什么需要分割文本?因为我们每次不管是做把文本当作 prompt 发给 openai api ,还是还是使用 openai api embedding 功能都是有字符限制的。
比如我们将一份300页的 pdf 发给 openai api,让他进行总结,他肯定会报超过最大 Token 错。所以这里就需要使用文本分割器去分割我们 loader 进来的 Document。
Vectorstores 向量数据库
因为数据相关性搜索其实是向量运算。所以,不管我们是使用 openai api embedding 功能还是直接通过向量数据库直接查询,都需要将我们的加载进来的数据 Document 进行向量化,才能进行向量运算搜索。转换成向量也很简单,只需要我们把数据存储到对应的向量数据库中即可完成向量的转换。
官方也提供了很多的向量数据库供我们使用。
四、langchain基础概念
Tool calling 工具调用
官方文档:https://python.langchain.com/docs/concepts/tool_calling/
工具调用允许模型自主调用函数或外部资源,标志着更多的智能体行为,即模型决定何时采取行动。增加工具调用的使用可以增强智能体与外部系统交互的能力,并执行如写入数据库等任务。
您有时会听到术语 function calling。我们将此术语与工具调用互换使用。
请记住,虽然名称“工具调用”意味着模型正在直接执行某些操作,但实际上并非如此!该模型仅生成工具的参数,实际运行(或不运行)取决于用户。
工具调用是一种从模型生成结构化输出的通用技术,即使您不打算调用任何工具,也可以使用它。一个示例用例是从非结构化文本中提取。
如果您想了解如何使用模型生成的工具调用来实际运行工具,请查看本指南。
Tool calling is not universal, but is supported by many popular LLM providers. You can find a list of all models that support tool calling here.
工具调用不是通用的,但许多流行的 LLM。您可以在此处找到支持工具调用的所有型号的列表。
(1) 工具创建:使用 @tool
装饰器创建工具。工具是函数与其架构之间的关联。
(2) 工具绑定:工具需要连接到支持工具调用的模型。这使模型能够识别工具以及工具所需的关联输入方案。
(3) 工具调用:在适当的时候,模型可以决定调用工具并确保其响应符合工具的输入模式。
(4) 工具执行:可以使用模型提供的参数执行工具。
(1) 工具创建
创建工具的推荐方法是使用 @tool
装饰器。
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply a and b."""
return a * b
延伸阅读
See our conceptual guide on tools for more details.
有关更多详细信息,请参阅我们的工具概念指南。
See our model integrations that support tool calling.
请参阅支持工具调用的模型集成。
(2) 工具绑定
许多模型提供程序都支持工具调用。
需要理解的核心概念是 LangChain 提供了一个标准化的接口,用于将工具连接到模型。.bind_tools()
方法可用于指定模型可以调用哪些工具。
model_with_tools = model.bind_tools(tools_list)
As a specific example, let’s take a function multiply and bind it as a tool to a model that supports tool calling.
作为一个具体的例子,让我们以一个函数 multiply 为例,将其作为工具绑定到支持工具调用的模型。
(3) 工具调用
工具调用的一个关键原则是,模型根据输入的相关性决定何时使用工具。模型并不总是需要调用工具。例如,给定一个不相关的输入,模型不会调用该工具:
result = llm_with_tools.invoke("Hello world!")
结果将是一个 AIMessage,其中包含模型以自然语言的响应(例如,“Hello!”)。
但是,如果我们传递与工具相关的输入,模型应选择调用它:
result = llm_with_tools.invoke("What is 2 multiplied by 3?")
如果调用了该工具,则 result 将具有 tool_calls 属性。此属性包括执行工具所需的一切,包括工具名称和输入参数:
result.tool_calls
{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'xxx', 'type': 'tool_call'}
(4) 工具执行
工具实现了 Runnable 接口,这意味着它们可以直接调用(例如 tool.invoke(args))。
LangGraph 提供预构建的组件(例如 ToolNode),这些组件通常会代表用户调用该工具。
tool-calling最佳实践
Models that have explicit tool-calling APIs will be better at tool calling than non-fine-tuned models.
具有显式工具调用 API 的模型将比非微调模型更擅长工具调用。
Models will perform better if the tools have well-chosen names and descriptions.
如果工具具有精心选择的名称和描述,则模型的性能会更好。
Simple, narrowly scoped tools are easier for models to use than complex tools.
简单、范围狭窄的工具比复杂的工具更容易被模型使用。
Asking the model to select from a large list of tools poses challenges for the model.
要求模型从大量工具中进行选择会给模型带来挑战。
我的一些理解:
Models that have explicit tool-calling APIs will be better at tool calling than non-fine-tuned models. tool-calling 其实是模型的能力
大模型能tool call / function call,是因为在SFT阶段加入了function call的数据集对大模型进行微调。
五、langchain使用环境的搭建、安装
-
Python环境
-
Jupyter Notebook的安装与使用
建议可以vscode 安装 jupyter插件,方便编码
另外vscode配置默认python解释器
Ctrl + Shift + p 打开命令行面板
输入 Python:Select Interpreter 命令,配置默认的解释器 -
LangChain安装
pip install langchain
参考资料
视频学习资料整理
IBM技术团队:LangChain vs LangGraph,两个框架的故事
参考URL: https://www.bilibili.com/video/BV1MqmfYzEeT/
(超爽中英!) 2024公认最好的【吴恩达LangChain+RAG】教程!
视频链接: https://www.bilibili.com/video/BV1TJ4zemETf/
AI Agent智能体开发,一步步教你搭建agent开发环境
视频链接: https://www.bilibili.com/video/BV1Pyy6Y3EP3