你好,我是方可乐。
一个正在深耕AI编程的30+的AI应用开发工程师。
用AI编程开发过Web应用网站,浏览器插件,微信小程序,AI智能体,RAG系统。
关注公众号&添加微信:ThinkFun666
领取【AI编程资料包】
去年6月份,我做了一个连自己都觉得疯狂的决定:裸辞,All in AI。
现在已经换赛道成功,继续在工作中探索。
上一节课我们讲了 Tool,学会了把业务函数包装成工具,让 Agent 可以调用。
但是那时我们只加了一个「密码生成器」,AI很容易就能调到,这不算什么本事。
这节课我们来看考验一下AI,让他在多个工具里面,找到真正适用我们需求的那个。
接下来,我们会在「密码生成器」的基础上,加上 Base64 编码 和 Base64 解码 两个工具。
让 AI 根据用户的需求,自主选择调用哪个工具,甚至能组合调用。
老规矩,上代码。
新建文件 11_multi_tools.py
import os
import random
import base64
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langchain.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent, AgentExecutor
load_dotenv()
# 1. 初始化 LLM(DeepSeek OpenAI 兼容接口)
base_url = os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1")
llm = ChatOpenAI(model="deepseek-chat", base_url=base_url, api_key=os.getenv("DEEPSEEK_API_KEY"), temperature=0)
# 2. 工具定义
@tool("password_generator", return_direct=True)
def generate_password(level: str) -> str:
"""根据复杂度生成密码,复杂度可选:low / medium / high"""
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
special = "!@#$%^&*()_+-=[]{}|;:,.<>?"
length = {"low": 6, "medium": 10, "high": 16}.get(level, 8)
pool = chars + special if level == "high" else chars
return "".join(random.choice(pool) for _ in range(length))
@tool("base64_encode", return_direct=True)
def base64_encode(text: str) -> str:
"""将输入字符串进行 Base64 编码"""
return base64.b64encode(text.encode()).decode()
@tool("base64_decode", return_direct=True)
def base64_decode(text: str) -> str:
"""将 Base64 字符串解码为原始字符串"""
return base64.b64decode(text.encode()).decode()
# 3. 构造支持工具调用的 Agent(让模型“会用工具”)
tools = [generate_password, base64_encode, base64_decode]
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个密码/加密助手。根据用户的自然语言需求,决定是否调用工具来完成任务。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
print("=== 密码 & 加密助手(支持密码生成 + Base64 编解码)===\n")
print("试试输入:'帮我生成一个 high 强度密码','encode abc123' 或 '解码 YWJjMTIz',输入 quit 退出。\n")
while True:
user_input = input("你:")
if user_input.lower() in ["quit", "exit", "退出"]:
print("退出。")
break
result = agent_executor.invoke({"input": user_input})
print("AI:", result["output"], "\n")
这是运行效果,是不是很聪明?
我们真实的业务场景,不同的函数相当于不同的工具,当AI 可以自由在多个工具间切换,就像是灵活用手去抓合适的工具一样。这就是 Agent 的真正价值。
不需要我们的强逻辑编排,不需要一堆if/else,直接交给AI判断,走哪条路,用哪个工具。
我们只要把业务函数封装成 Tool,AI 就能学会调用,帮我们自动完成任务。
对AI应用开发感兴趣的同学,欢迎加微信申请入群交流学习。
想要学习AI应用开发的同学,可以参照我的代码跑起来,举一反三,一天一个脚印的进步,我相信,会足够坚实。
接下来100天,我会记录从Java程序员到AI应用开发工程师的完整转型路:每一个困惑、每一次突破、每一个真实瞬间。
当前是29/100。
如果你也想了解AI应用开发到底是什么,如果你也在考虑转型但还在犹豫,那就跟着我的记录,一起探索。
继续折腾中,有问题随时交流 🤝
微信号:ThinkFun666
我的免费AI编程交流群,欢迎加入讨论AI编程玩法(加我微信,说明需求和来意,申请入群)
推荐阅读:
我就喜欢干这种傻事!为什么转型AI应用开发,我不建议你直接从看书开始学起?

