前言
AI 智能体正在重塑各行各业,显著提升效率和生产力。研究表明,超过 60% 的企业主预期 AI 的实施将提升生产力,其中 64% 认为 AI 将提升整体业务生产力,42% 预计工作流程将得到简化。这些数据凸显了 AI 智能体在优化工作流程和推动行业增长方面的变革性作用。
LangChain 以其革命性的模块化框架简化了 AI 驱动的语言应用的创建。该框架提供了一个与语言模型交互的标准化接口,并可无缝集成外部数据源。LangChain 降低了操作大型语言模型(LLM)的复杂性,即使缺乏机器学习或 AI 专业知识的用户也能轻松上手。
01、LangChain 中的链
LangChain 的初衷是提供一个无缝的接口,用于集成大型语言模型(LLM)和外部数据源,弥合强大的 AI 模型与海量数据之间的鸿沟。开发者可以利用该框架创建高级应用,借助 LLM 的能力访问和处理各种来源的数据。
LangChain 的核心概念是“链”。链代表了一系列将输入转换为预期输出的操作。LangChain 的模块化和灵活性使其能够根据特定需求定制工作流程。
LangChain 中的链是由一系列步骤或操作组成的,用于处理输入数据并生成输出。每个步骤执行特定功能,例如数据检索、转换或与 LLM 交互。链的复杂度各不相同,可以是简单的几个步骤,也可以是包含多个数据处理和模型交互阶段的复杂流程。
例如,一个链可以首先从 API 检索数据,然后对数据进行一系列转换,最后将转换后的数据输入 LLM 生成响应。这种模块化设计便于设计、测试和复用工作流程的各个组件。
然而,链的线性结构限制了其处理动态或自适应任务的能力。LangChain 智能体通过提供更高的灵活性和智能性解决了链的局限性。
02、LangChain 智能体
LangChain 智能体是增强 LLM 能力的强大组件,使其能够进行决策并基于决策采取行动。与遵循预定义操作序列的链不同,智能体利用 LLM 作为推理引擎,动态地确定要执行的操作序列。
LangChain 智能体的核心功能是根据输入数据和先前操作的结果选择并执行操作。这使得它们能够以最少的人工干预处理复杂任务。例如,智能体可以与各种工具和数据源交互,处理信息,并迭代地优化其操作以实现特定目标。
链中的操作序列是硬编码的,而智能体中的操作序列并非预先确定。智能体使用语言模型作为推理引擎,动态决定采取哪些操作以及操作的顺序。
智能体具有以下几个关键特性:
- 自适应性: 智能体可以根据遇到的数据和上下文调整其行为,而不受预定义步骤序列的限制,这与链不同。
- 自主性: 智能体可以独立运行,自主决策,无需持续监督。
- 交互性: 智能体可以与多个数据源、工具和 LLM 交互,使其能够处理各种任务。
通过集成智能体,系统可以管理需要动态响应和自适应行为的更复杂工作流程,克服了简单链的局限性。
03、LangChain 智能体的核心组件
在 LangChain 中构建高效的智能体需要以下几个核心组件:
1. 工具
工具是智能体执行任务的基础构件。它们涵盖与 API、数据库和数据处理功能的交互。每个工具都为智能体提供特定功能,使其能够完成各种任务。
LangChain 提供多种使用工具的方式,包括预定义工具、检索器作为工具以及自定义工具。
2. 预定义工具
LangChain 提供了一系列预定义工具,可以直接导入并集成到智能体中。
from langchain_community.tools import DuckDuckGoSearchRun
search = DuckDuckGoSearchRun()
在这个例子中,我们从`langchain_community.tools`模块导入了`DuckDuckGoSearchRun` 工具并进行了初始化。初始化后,这个工具可以通过工具包在智能体中使用,我们稍后会看到。
3. 将检索器用作工具
在需要根据用户查询从向量数据库中获取数据的场景中,LangChain 允许用户将数据检索器转换为工具并在智能体中使用它们。
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"name_of_the_tool",
"Description of the tool",
)
通过使用 LangChain 的 `create_retriever_tool`,用户可以将任何检索器转换为 LangChain 工具。这个方法需要三个参数:你之前创建的 retriever、tool 的名称,以及工具的描述。描述可以帮助 LLM 决定何时使用此工具以及它持有什么类型的数据。
4. 自定义工具
LangChain 还赋予开发者定义针对其应用程序或用例的定制工具的能力。定义自定义工具的最简单方法是使用 `@tool`装饰器与任何 Python 方法一起使用。比如:
from langchain.agents import tool
@tool
def get_word_length(word: str) -> int:
"""返回一个单词的长度。"""
return len(word)
get_word_length.invoke("abc")
在这个例子中,方法名被用作工具名,`docstring` 充当工具的描述。这样智能体就能够理解并有效地使用该工具。
对于更复杂的工具,你也可以扩展 LangChain 提供的 `BaseTool` 类来创建满足特定需求的复杂自定义工具。
5. 工具包
工具包是智能体可访问的工具集合,定义了智能体可执行的操作范围和可利用的资源。它实质上是一个已定义的工具列表,供智能体使用:
tool_kit = [retriever_tool, get_word_length]
工具包中的所有工具都以相同的方式运行,无论其定义方式如何。
6. 大型语言模型(LLM)
LLM 是智能体的智能核心,负责处理自然语言输入、生成响应和驱动决策过程。LangChain 与各种先进的 LLM(如 GPT-4、BERT 和 T5)无缝集成,确保智能体能够访问尖端的 AI 功能。
这种集成增强了自然语言理解能力,支持复杂决策,并促进特定领域的定制,使 LangChain 智能体在执行复杂任务时兼具多功能性和强大性能。
7. 提示
提示是指导 LLM 行为的初始指令或查询。清晰有效的提示对于确保智能体准确高效地执行任务至关重要。
- LangChain Hub
LangChain Hub 是一个用于发现、共享和管理提示、链、智能体等的中央存储库。它帮助开发者和团队获取高质量的提示,加速开发进程。
- 使用 LangChain Hub
通过 LangChain Hub,您可以轻松地将公共提示引入代码库,利用针对特定用例和所用语言模型定制的精心设计的提示。以下是导入预编写提示的方法:
from langchain import hub
prompt = hub.pull("hwchase17/openai-functions-agent")
hub.pull("hwchase17/openai-functions-agent")
从 LangChain Hub 获取预定义的提示,该提示专为与 OpenAI 函数协同工作而设计。此提示旨在增强使用 OpenAI 强大语言模型的智能体的功能。
8. Agent Executor
Agent Executor 是 LangChain 生态系统的关键元素。它协调智能体的活动,管理操作流程,并确保各个组件的协同工作。
LangChain 文档中描述的智能体执行器的工作流程如下:
next_action = agent.get_action(...)
while next_action != AgentFinish:
observation = run(next_action)
next_action = agent.get_action(..., next_action, observation)
return next_action
Agent Executor 本质上是一个 while
循环,不断调用智能体的 get_action
方法,直到智能体返回最终响应。执行器的职责包括:
- 启动任务: 根据给定的提示和上下文启动智能体的活动。
- 管理工作流: 协调工具、工具包和 LLM 之间的交互,确保工作流程的顺利执行。
- 处理错误: 管理智能体操作过程中发生的任何错误或异常,提供稳健可靠的性能。
这些组件在智能体的功能中至关重要。LangChain 提供了高度的灵活性来处理这些组件,允许开发者根据需求定制和优化每个部分。
03、创建智能体
到目前为止,我们已经探讨了构建智能体所需的重要组成部分。现在,让我们使用 MyScaleDB 和 DuckDuckGo 创建一个智能体。这个智能体将有两个工具:
- 检索器:此工具将获取与MyScaleDB遥测相关的信息。
- DuckDuckGo工具:此工具将从互联网获取数据。
1. 设置环境
开始构建智能体之前,先来安装必要的工具包。
pip install langchain langchain_openai duckduckgo-search
2. 加载检索器工具的数据
使用 LangChain 的 WebBaseLoader 加载检索器工具的数据:
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
3. 从互联网加载数据
loader = WebBaseLoader("https://myscale.com/blog/zh/myscale-telemetry-llm-app-observability/")
docs = loader.load()
# 将文本分割成更小的块
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
4. 设置 MyScaleDB 认证信息
在初始化检索器之前,我们需要设置 MyScale 的认证信息:
import os
# MyScaleDB的认证信息
os.environ["MYSCALE_HOST"] = "your-hostname-here"
os.environ["MYSCALE_PORT"] = "443"
os.environ["MYSCALE_USERNAME"] = "your-username-here"
os.environ["MYSCALE_PASSWORD"] = "your-password-here"
# 设置OpenAI LLM的OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "api-key-here"
我们将在这个项目中使用 OpenAI embedding 和ChatGPT,因此需要设置OpenAI API 密钥。
5. 初始化检索器
接下来初始化检索器并将数据放入 MyScaleDB 检索器中。
from langchain_community.vectorstores import MyScale
from langchain_openai import OpenAIEmbeddings
vector = MyScale.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
下一步使用 `create_retriever_tool` 将检索器转换为 langchain 工具。
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"MyScale_telemetry",
"Search for information about MyScale Telemetry. For any questions about Telemetry, you must use this tool!",
)
定义的工具将在查询有关 MyScale Telemetry 时使用。如前面所述,工具的描述非常重要,它将帮助 LLM选择基于查询的适当工具。
6. 定义搜索工具
让我们为智能体定义第二个工具。这是一个预定义的工具,旨在搜索当前事件或从互联网获取最新信息。
from langchain_community.tools import DuckDuckGoSearchRun
search = DuckDuckGoSearchRun()
7. 创建工具包
我们的智能体将使用两个工具:检索器和网络搜索。先来创建工具包:
tools = [search, retriever_tool]
8. 初始化 LLM
我们使用 OpenAI 的 GPT-3.5-turbo 模型:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
9. 获取提示
我们将使用与 OpenAI 模型一起使用的 LangChain Hub 的相同预定义提示,因为我们正在使用 OpenAI 模型为我们的智能体。
from langchain import hub
# 拉取提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
prompt.messages
10. 创建智能体和 Agent Executor
LangChain 提供了几种类型的智能体,每种都具有独特的推理能力和功能。对于这个项目,我们将使用最先进和最稳固的智能体:OpenAI Tools agent。这个 agent 利用了来自 OpenAI 的最新模型,性能更强且提供了广泛的功能。
from langchain.agents import create_tool_calling_agent
agent = create_tool_calling_agent(llm, tools, prompt)
现在,AgentExecutor 将处理定义智能体所有功能。
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
在 `AgentExecutor` 中设置 `verbose=True`,启用智能体操作的详细日志记录。这为调试和理解智能体如何与不同工具互动提供了更大的透明度和洞察力。
11. 为智能体添加内存
为智能体添加内存对策目的是保留以前交互的上下文,增强其在持续对话中提供相关和连贯响应的能力。添加的内存可以使智能体能够随时间学习和适应,从而提高其性能并使互动更加个性化和智能化。
from langchain.memory import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
memory = ChatMessageHistory(session_id="test-session")
agent_with_chat_history = RunnableWithMessageHistory(
agent_executor,
lambda session_id: memory,
input_messages_key="input",
history_messages_key="chat_history",
)
使用会话 ID 有助于维护和组织个人用户的会话,确保智能体可以准确跟踪和回忆每个会话的互动。
12. 调用智能体
最后,我们可以调用智能体来检索信息。
# 获取有关MyScale遥测的信息
agent_executor.invoke({"input": "What's MyScale telemetry?"}, config={"configurable": {"session_id": "<foo>"}})
结果将类似于此:
可以看到,查询与 MyScale Telemetry相关,智能体正在调用`MyScale_telemetry` 智能体。
我们再来执行另一个查询并从互联网获取最新数据。
# 从网络获取信息
agent_executor.invoke({"input": "How's the weather in California?"}, config={"configurable": {"session_id": "<foo>"}})
结果将类似于此:
这个实际示例展示了如何使 MyScaleDB 和DuckDuckGo工具基于 LangChain创建智能体。每个组件对智能体的功能至关重要,正确设置环境确保了操作的顺畅。
结论
LangChain 智能体通过赋予 LLM 决策和行动能力,显著增强了其功能。相比于遵循固定流程的传统链式结构,智能体利用 LLM 动态地确定行动序列,使其能够更有效地应对复杂多变的任务。LangChain 智能体的模块化设计方便集成各种工具和自定义功能,开发者可以根据特定需求定制工作流程。
MyScaleDB 作为一款高性能、可扩展的向量数据库,凭借其优越的 MSTG(多阶段树图)算法,在数据检索速度和准确性方面表现出色,这对于 AI 驱动型任务至关重要。MyScaleDB 能够高效处理大规模数据负载,确保操作的可靠性和高速性,使其成为开发者构建需要高效数据管理和检索的强大 AI 应用的理想选择。LangChain 智能体与 MyScaleDB 的结合,为构建更灵活、高效的 AI 应用提供了坚实的基础。