微信扫码
添加专属顾问
我要投稿
探索LangChain智能体如何实现自定义工具集成与应用。 核心内容: 1. LangChain安装与环境配置指南 2. 从Python函数创建自定义工具的步骤 3. 工具链(Chains)的构建与应用实例
在这篇文章中,我们将基于 LangChain 官方文档,详细介绍如何使用 LangChain 创建自定义工具,并在链(Chains)和智能体(Agents)中使用。
首先,通过以下命令安装 LangChain:
pip install --upgrade --quiet langchain
注释:此命令会升级或安装 LangChain 包,--quiet
参数用于抑制不必要的输出。
如果你希望追踪运行过程,可以设置环境变量开启 LangSmith:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass("Enter your API key: ")
注释:这里我们使用了 getpass
库来安全地获取 API 密钥,确保不会在命令行中泄露。
LangChain 允许你从 Python 函数创建自定义工具。以下是一个简单的乘法工具示例:
from langchain_core.tools import tool
def multiply(first: int, second: int) -> int:
"将两个整数相乘。"
return first * second
# 打印工具的名称、描述和参数
print("Tool Name:", multiply.name)
print("Tool Description:", multiply.description)
print("Tool Arguments:", multiply.args)
注释:我们定义了一个 multiply
函数,并使用 @tool
装饰器将其转换为 LangChain 工具。然后,我们打印出工具的相关信息,以便用户了解其用法。
Tool Name: multiplyTool Description: multiply(first: int, second: int) -> int - Multiply two integers together.Tool Arguments: {'first': {'title': 'First', 'type': 'integer'}, 'second': {'title': 'Second', 'type': 'integer'}}
链允许你预定义一系列工具的使用顺序。
下面是一个简单的示例,展示如何创建一个支持乘法计算的链:
使用 LLM 与工具结合的一种方法是通过工具调用 API。这需要模型支持工具调用,具体支持情况可以查看 官方文档。
首先,我们需要定义模型和工具:
import getpass
import os
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
llm = ChatOpenAI(model="gpt-3.5-turbo")
注释:我们设置了 OpenAI API 密钥,并初始化了一个 ChatOpenAI
对象。
我们使用 bind_tools
方法将工具的定义作为模型调用的一部分传递:
llm_with_tools = llm.bind_tools([multiply])
注释:这样,模型就可以在适当的时候调用 multiply
工具了。
当模型调用工具时,相关信息会显示在输出的 AIMessage.tool_calls
属性中:
msg = llm_with_tools.invoke("3 乘以 5 等于多少?")print("Tool Call:", msg)
注释:这里我们调用了模型,并打印出了工具调用的详细信息。
Tool Call: content='' additional_kwargs={'tool_calls': [{'id': 'call_i48IbegPCTX8s2F7dD2G5llX', 'function': {'arguments': '{"first": 3, "second": 5}', 'name': 'multiply'}, 'type': 'function'}, {'id': 'call_qCws40dvjcEXpdcJLq3yZtIX', 'function': {'arguments': '{"first": 5, "second": 3}', 'name': 'multiply'}, 'type': 'function'}]} response_metadata={'token_usage': {'completion_tokens': 49, 'prompt_tokens': 72, 'total_tokens': 121}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_c2295e73ad', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-3ee6b1df-60c5-4c80-8851-621b324937da-0' tool_calls=[{'name': 'multiply', 'args': {'first': 3, 'second': 5}, 'id': 'call_i48IbegPCTX8s2F7dD2G5llX'}, {'name': 'multiply', 'args': {'first': 5, 'second': 3}, 'id': 'call_qCws40dvjcEXpdcJLq3yZtIX'}]
为了实际调用工具,我们需要将生成的工具参数传递给工具。以下是一个提取和使用工具参数的示例:
from operator import itemgetter
chain = llm_with_tools | (lambda x: x.tool_calls[0]["args"]) | multiply
result = chain.invoke("6 乘以 8 等于多少?")
print("Result:", result)
注释:我们创建了一个简单的管道,首先提取工具调用的参数,然后将其传递给 multiply
工具,并打印出最终结果。
Result: 48
智能体允许模型自己决定使用工具的次数和顺序。LangChain 提供了多种内置智能体,适用于不同的用例。
为了测试智能体对多个工具的调用,我们另外创建了两个工具:加法和指数运算。
def add(first_int: int, second_int: int) -> int:
"将两个整数相加。"
return first_int + second_int
def exponentiate(base: int, exponent: int) -> int:
"求底数的幂次方。"
return base**exponent
tools = [multiply, add, exponentiate]
以下是一个使用智能体调用工具的示例:
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
# 获取并打印智能体提示
prompt = hub.pull("hwchase17/openai-tools-agent")
prompt.pretty_print()
# 构建工具调用智能体
agent = create_openai_tools_agent(llm, tools, prompt)
# 创建智能体执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 使用智能体执行复杂计算
output = agent_executor.invoke(
{"input": "3 的五次方乘以 12 加 3 的和,然后对整个结果求平方"}
)
print("Agent Output:", output)
注释:我们首先获取了一个智能体提示:
================================ System Message ================================
You are a helpful assistant
============================= Messages Placeholder =============================
{chat_history}
================================ Human Message =================================
{input}
============================= Messages Placeholder =============================
{agent_scratchpad}
然后,我们创建了一个智能体和智能体执行器,并使用它来执行一个复杂的数学计算。最后,我们打印出了智能体的执行过程和最后的输出结果。
> Entering new AgentExecutor chain...
Invoking: `multiply` with `{'first': 3, 'second': 3}`
9
Invoking: `add` with `{'first_int': 9, 'second_int': 12}`
21
Invoking: `exponentiate` with `{'base': 21, 'exponent': 2}`
441最终结果是 441。
> Finished chain.
Agent Output: {'input': '3 的五次方乘以 12 加 3 的和,然后对整个结果求平方', 'output': '最终结果是 441。'}
在使用 LangChain 时,可能会遇到一些错误。以下是一些常见的错误处理和调试建议:
检查 API 密钥:确保你的 API 密钥是有效的,并且没有过期。
网络问题:如果你的请求失败,检查你的网络连接是否正常。
参数匹配:确保传递给工具的参数与其定义相匹配。
查看日志:LangChain 的日志可以提供有关错误的详细信息,有助于调试。
查看跟踪信息:如果你启用了 LangSmith,可以查看跟踪信息来了解模型的执行过程。
import dotenv
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
def multiply(first: int, second: int) -> int:
"将两个整数相乘。"
return first * second
def add(first_int: int, second_int: int) -> int:
"将两个整数相加。"
return first_int + second_int
def exponentiate(base: int, exponent: int) -> int:
"求底数的幂次方。"
return base**exponent
tools = [multiply, add, exponentiate]
llm = ChatOpenAI(model="gpt-3.5-turbo")
llm_with_tools = llm.bind_tools(tools)
# 1,使用 chain 调用工具
chain = llm_with_tools | (lambda x: x.tool_calls[0]["args"]) | multiply
result = chain.invoke("6 乘以 8 等于多少?")
print("Result:", result)
# 2,使用智能体调用工具
# 获取并打印智能体提示
prompt = hub.pull("hwchase17/openai-tools-agent")
print("Agent Prompt:", prompt)
# 构建工具调用智能体
agent = create_openai_tools_agent(llm, tools, prompt)
# 创建智能体执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 使用智能体执行复杂计算
output = agent_executor.invoke(
{"input": "3 的五次方乘以 12 加 3 的和,然后对整个结果求平方"}
)
print("Agent Output:", output)
希望本文能帮助你更好地理解和使用 LangChain 中的工具。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-13
LangChain + 模型上下文协议(MCP):AI 智能体 Demo
2025-04-10
源码速读 | MaxKB源码QA问答对优化逻辑速读
2025-04-09
AI Agents框架选择指南:仿佛在玩初创公司模拟经营游戏
2025-04-06
LangChain最新指南:高效构建AI应用的全流程解析
2025-04-04
ChatBlog - 个人博客AI互动的尝试
2025-04-03
Langchain与LlamaIndex应该选哪个
2025-04-01
langchain4j+Chroma小试牛刀
2025-03-31
Manus行不行我不知道,但LangManus是真行!
2024-10-10
2024-07-13
2024-04-08
2024-06-03
2024-09-04
2024-08-18
2024-04-08
2024-03-28
2024-06-24
2024-07-10
2025-03-22
2025-03-22
2025-03-15
2025-02-05
2024-12-02
2024-11-25
2024-10-30
2024-10-11