大数跨境

LangChain 实战第11课:把业务代码包装成工具后,如何让 AI 自动选择正确的“工具”?

LangChain 实战第11课:把业务代码包装成工具后,如何让 AI 自动选择正确的“工具”? 玩AI的方可乐
2025-09-28
2
导读:手把手教学,10 分钟见结果

 

你好,我是方可乐。
一个正在深耕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应用开发,我不建议你直接从看书开始学起?

猛然醒悟:原来 AI 编程这件事情,是有门槛的,90%的新手卡在这些地方

30岁转行 AI 应用开发:多久能学会?答案出乎意料

30岁,我放弃写了7年的Java,成功转型AI应用开发

30岁,转型AI应用开发,需要会什么技术?

30岁,空窗期一年,靠什么成功转型AI应用开发?

30岁,没报课,如何从0自学转型AI应用开发?

【声明】内容源于网络
0
0
玩AI的方可乐
1234
内容 502
粉丝 0
玩AI的方可乐 1234
总阅读204
粉丝0
内容502