《2026 LangChain零基础入门:用AI应用框架快速搭建智能助手》第6课:Tools 与自定义工具 —— 给AI加上搜索、计算、读文件、调用外部API等能力,让代理更强大
大家好,我是链上杯子(CSDN:链上杯子)。
失业一年了,天天想着怎么翻身。上节课让AI自己决定用工具后,我发现:如果能给它加上更多“手脚”,比如实时搜索网页、读本地笔记、调用天气/股票API,它就真的能帮我干活了。LangChain 的 Tools 系统就是为此设计的——你可以无限扩展工具,让Agent变成一个“万能助手”。第一次看到AI自己上网搜资料再回答问题,感觉像给它开了外挂。
本课目标:
学会使用和自定义 LangChain Tools,让Agent拥有外部能力(计算、搜索、文件读写、API调用等)。
学完这节课,你就能为Agent添加任意工具,实现“AI自己去查资料、算数、读笔记”的强大交互。
核心代码实战
1. 内置工具 + 自定义工具(最简单扩展)
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain_classic.prompts import PromptTemplate
from langchain.tools import tool
import datetime
# 初始化模型
llm = ChatOpenAI(
openai_api_key="", # ←←← 这里替换成你的 DeepSeek API Key
openai_api_base="https://api.deepseek.com/v1",
model="deepseek-chat",
temperature=0
)
# 自定义工具1:当前时间
@tool
def get_current_time() -> str:
"""返回当前日期和时间"""
return datetime.datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")
# 自定义工具2:简单计算器(支持加减乘除)
@tool
def calculator(expression: str) -> str:
"""执行简单的数学表达式计算,例如 '2 + 3 * 4'"""
try:
return str(eval(expression))
except Exception as e:
return f"计算错误:{str(e)}"
# 自定义工具3:模拟搜索本地笔记
@tool
def search_local_note(keyword: str) -> str:
"""在本地笔记中搜索关键词,返回匹配内容(模拟)"""
# 实际可以换成读文件或向量搜索
notes = {
"失恋": "上次笔记写:失恋后要多运动、多读书、找朋友聊天。",
"Python": "Python入门建议:先学变量、列表、函数,再学类和模块。"
}
return notes.get(keyword, f"没有找到关于'{keyword}'的笔记。")
tools = [get_current_time, calculator, search_local_note]
# 使用中文 ReAct Prompt(同上节课)
react_prompt = PromptTemplate.from_template(
"""尽可能好地回答以下问题。你可以使用以下工具:
{tools}
请严格按照以下格式回答:
问题:你必须回答的输入问题
思考:你应该始终思考该做什么
行动:要采取的行动,必须是 [{tool_names}] 中的一个
行动输入:行动的输入
观察:行动的结果
...(思考/行动/行动输入/观察 可以重复 N 次)
思考:我现在知道最终答案了
最终答案:对原始输入问题的最终答案
开始!
问题:{input}
思考:{agent_scratchpad}"""
)
# 创建 Agent
agent = create_react_agent(llm, tools, react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 测试各种问题
queries = [
"现在几点了?",
"帮我算一下 456 * 789 - 1234 是多少?",
"我上次笔记里关于失恋写了什么?",
"今天天气如何?如果热的话建议穿什么?"
]
for q in queries:
print(f"\n问题:{q}")
result = agent_executor.invoke({"input": q})
print("AI 回答:", result["output"])
运行后会看到 AI 自己决定:
- 问时间 → 调用 get_current_time
- 问计算 → 调用 calculator
- 问笔记 → 调用 search_local_note
- 问天气 → 可能直接推理或说没工具(你可以再加天气工具)
2. 真实外部API工具 —— 调用免费天气API
import requests
@tool
def real_weather(city: str) -> str:
"""调用真实天气API获取城市当前天气(使用免费接口示例)"""
api_key = "你的和风天气免费Key" # 注册:https://dev.qweather.com/
url = f"https://devapi.qweather.com/v7/weather/now?location={city}&key={api_key}"
try:
resp = requests.get(url).json()
if resp.get("code") == "200":
temp = resp["now"]["temp"]
text = resp["now"]["text"]
return f"{city}当前温度 {temp}°C,天气:{text}。"
else:
return "天气查询失败。"
except Exception as e:
return f"API错误:{str(e)}"
tools.append(real_weather)
# 重新创建 Agent(工具更新)
agent = create_react_agent(llm, tools, react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 测试
result_weather = agent_executor.invoke({"input": "上海现在天气如何?适合穿短袖吗?"})
print("天气查询结果:", result_weather["output"])
提示:注册和风天气(qweather.com)免费Key,替换 api_key。其他免费天气API也可替换。
3. 互动版 —— 命令行多工具 Agent
print("=== 多工具 Agent 开始(输入 'quit' 退出) ===")
while True:
user_input = input("你:").strip()
if user_input.lower() == "quit":
break
result = agent_executor.invoke({"input": user_input})
print("AI:", result["output"])
试试问:“现在几点?帮我算 88 * 99 是多少?再查查北京天气。”
小练习(2 道)
练习1(基础)
复制第1段代码,加一个新工具 @tool def get_date() -> str: return datetime.date.today().strftime("%Y年%m月%d日")。
测试问:“今天是星期几?后天是几号?”
观察AI是否正确调用工具。
练习2(进阶)
加一个“读文件”工具(参考上节课 read_file)。
问:“读取当前目录下 my_notes.txt 的内容,并告诉我里面有没有提到‘目标’这个词。”
让AI自己决定调用工具并分析结果。
本课小结
本课重点学习了 Tools 系统:@tool 定义自定义工具、添加到 Agent、让AI自动调用。
通过真实API、计算、文件读写等工具,Agent 从“只会聊天”升级到“能干活”。这是构建实用AI助手的必备技能。
下节预告
下一课:RAG 入门 —— 让AI读你的本地文档再回答问题,构建个人知识库助手。
欢迎在评论区贴出你的Agent运行截图、工具调用过程、或任何问题~
如果觉得这篇有用,欢迎点赞或关注,一起玩转 LangChain!
更多推荐

所有评论(0)