Notion Blog
技术分享1 分钟阅读

ai工具调用

代码示例 先安装依赖,pip install langchain,langchain_openai
import os
from typing import Optional
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent, AgentExecutor



# 定义工具功能
@tool
def search_web(query: str, max_results: Optional[int] = 3):
    """用于执行网页搜索的工具"""
    # 此处可替换为实际搜索引擎接口
    return [f"结果{i + 1}: {query}" for i in range(max_results)]


@tool
def math_calculator(expression: str):
    """执行数学表达式计算的工具"""
    try:
        return eval(expression)
    except Exception as e:
        return f"计算错误: {str(e)}"


# 初始化大语言模型
llm = ChatOpenAI(model="gpt-4o-mini",
								 openai_api_key='sk-XXXXX',
                 openai_api_base='https://XX.XX.cm/v1', 
                 temperature=0)

# 创建工具列表
tools = [search_web, math_calculator]

# 构建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个智能助手,请根据用户需求选择合适的工具"),
    ("user", "{input}"),
    ("placeholder", "{agent_scratchpad}"),  # 必须加上这一行
])

# 创建智能体
agent = create_tool_calling_agent(llm, tools, prompt)

# 创建执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 示例执行
if __name__ == "__main__":
    print("--- LangChain工具调用演示 ---")
    while True:
        user_input = input("请输入您的需求(输入'exit'退出): ")
        if user_input.lower() == 'exit':
            break

        try:
            result = agent_executor.invoke({"input": user_input})
            print("\n执行结果:")
            print(result['output'])
        except Exception as e:
            print(f"发生错误: {str(e)}")
        print("\n" + "=" * 50 + "\n")

LangChain 工具调用智能体代码解析

这段代码展示了一个使用 LangChain 框架构建的智能体(Agent),它能够根据用户输入选择并调用适当的工具来完成任务。下面我将详细解释代码的各个部分:

1. 导入必要的库

import os
from typing import Optional
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent, AgentExecutor
os: 操作系统接口
typing.Optional: 类型注解,表示可选参数
ChatOpenAI: LangChain 的 OpenAI 聊天模型封装
tool: 装饰器,用于将函数转换为 LangChain 工具
ChatPromptTemplate: 聊天提示模板
create_tool_calling_agent和 AgentExecutor: 用于创建和执行智能体

2. 定义工具功能

网页搜索工具

@tool
def search_web(query: str, max_results: Optional[int] = 3):
    """用于执行网页搜索的工具"""
# 此处可替换为实际搜索引擎接口return [f"结果{i + 1}: {query}" for i in range(max_results)]
@tool装饰器将函数标记为 LangChain 工具
接收查询字符串和可选的最大结果数
目前是模拟实现,实际应用中可替换为真实搜索引擎 API
工具描述文档字符串很重要,LLM 会根据它决定是否使用该工具

数学计算器工具

@tool
def math_calculator(expression: str):
    """执行数学表达式计算的工具"""
    try:
        return eval(expression)
    except Exception as e:
        return f"计算错误: {str(e)}"
接收数学表达式字符串
使用 Python 的 eval()执行计算
包含错误处理,返回错误信息

3. 初始化大语言模型

llm = ChatOpenAI(model="gpt-4o-mini", openai_api_key='sk-bC0cLw1brB4Kvo5s14D6Cd84EeF243B3A3A2373c545067C2',
                 openai_api_base='https://free.v36.cm/v1', temperature=0)
创建 ChatOpenAI实例
指定模型为 "gpt-4o-mini" (注意:这不是 OpenAI 官方模型名称)
提供 API 密钥和自定义 API 基础 URL
temperature=0使输出更确定性

4. 创建工具列表

tools = [search_web, math_calculator]
将定义的两个工具放入列表,供智能体使用

5. 构建提示模板

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个智能助手,请根据用户需求选择合适的工具"),
    ("user", "{input}"),
    ("placeholder", "{agent_scratchpad}"),# 必须加上这一行
])
定义对话提示模板,包含三部分:
系统消息:设定智能体的角色和行为
用户输入:占位符 {input}将被实际输入替换
代理草稿本:{agent_scratchpad}用于记录智能体的思考过程

6. 创建智能体和执行器

agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
create_tool_calling_agent: 创建能调用工具的智能体
参数:LLM 实例、工具列表、提示模板
AgentExecutor: 执行智能体的实际工作
verbose=True显示详细执行过程

7. 主程序交互循环

if __name__ == "__main__":
    print("--- LangChain工具调用演示 ---")
    while True:
        user_input = input("请输入您的需求(输入'exit'退出): ")
        if user_input.lower() == 'exit':
            break

        try:
            result = agent_executor.invoke({"input": user_input})
            print("\n执行结果:")
            print(result['output'])
        except Exception as e:
            print(f"发生错误: {str(e)}")
        print("\n" + "=" * 50 + "\n")
持续接收用户输入
调用 agent_executor.invoke()处理输入
打印结果或错误信息
输入 "exit" 退出循环

工作流程总结

用户输入问题/请求
智能体分析输入,决定是否需要使用工具
如果需要工具,选择最合适的工具并生成调用参数
执行工具并获取结果
智能体整合工具结果生成最终回复
返回给用户

关键概念

工具(Tool): 封装特定功能的可调用对象,LLM 可以决定是否及如何调用
智能体(Agent): 决定何时及如何使用工具的 LLM 系统
执行器(Executor): 实际运行智能体逻辑的组件

这段代码展示了 LangChain 框架构建工具调用智能体的基本模式,理解这个结构后可以扩展出更复杂的功能。

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。