AIAgent零基础入门: Day5 LangChain框架入门与最小Agent
前四天我们手写了工具调用、记忆机制、规划循环,把Agent底层逻辑扒了个底朝天。今天我们正式进入框架时代——LangChain,这个几乎所有AI Agent岗位面试必问、工作必用的开发框架。
🎯 面试官想考什么?
LangChain是AI Agent岗位面试超高频考点,常见问法:
- 基础概念题:什么是LangChain?它解决了什么痛点?直接调用OpenAI API不香吗?
- 核心组件题:LangChain的核心抽象有哪些?Chain和Agent是什么关系?
- 实操题:用LangChain写一个最简单的ReAct Agent,30行代码能搞定吗?
- 版本题:LangChain 0.x 和 1.x 版本有什么重大变化?(⚠️ 现在面试如果还在教0.x旧写法,直接扣分!)
核心答题思路:强调LangChain是「大模型应用的编排框架」,它把模型、工具、记忆、检索都做成了可插拔的组件,不用你从零写Agent循环,就像搭积木一样拼出Agent。
🤔 为什么需要LangChain?
如果你从零写过前几天的代码,一定有感受:
- 要自己处理工具调用格式解析
- 要自己管理对话历史
- 要自己实现思考-行动循环
- 要自己处理错误重试、格式解析失败
这些代码写一次两次还行,每个项目都写一遍就是重复造轮子。LangChain把这些通用能力全部封装好了,你只需要:
- 选一个大模型
- 定义好你的工具
- 选一个Agent类型
- 跑起来!
🧱 LangChain四大核心抽象
这四个概念是LangChain的骨架,必须理解:
1. Models(模型)
统一封装所有大模型调用,不管是OpenAI、文心一言、豆包还是开源模型,调用方式几乎完全一致,换模型不用改业务代码。
2. Prompt Templates(提示词模板)
把提示词标准化管理,支持变量注入、Few-shot示例复用,再也不用把提示词散落在代码各个角落。
3. Chains(链)
把多个组件按顺序串联成工作流,这也是LangChain名字的由来——Language + Chain。最经典的链就是「检索→重排→生成」的RAG链。
4. Agents(智能体)
我们的老朋友了:大模型当大脑 + 工具当手脚 + 记忆当经验 + ReAct循环当决策流程。LangChain内置了多种Agent执行策略,最常用的就是ReAct Agent。
💻 最小可运行代码示例(LangChain 1.x最新版本)
下面的代码用LangChain 1.4最新API写的,没有任何过时的0.x写法,复制就能跑:
import os
from dotenv import load_dotenv
from langchain_core.tools
import tool
from langchain_openai import ChatOpenAIfrom langchain_core.messages
import HumanMessage, ToolMessage
load_dotenv()
# =====================1. 定义工具(这部分完全不变,1.4版本完美兼容) =====================
@tool
def get_weather(city: str) -> str:
"""
查询指定城市的当前天气情况。
当用户询问天气、温度、穿衣建议时使用此工具。
Args:
city: 城市名称,比如"北京"、"上海"
"""
weather_data = {
"北京": "晴,25°C,风力3级,空气质量优",
"上海": "多云,28°C,风力2级,空气质量良",
"深圳": "阵雨,30°C,风力4级,空气质量优",
}
return weather_data.get(city, f"暂无{city}的天气数据")
@tool
def calculate(expression: str) -> str:
""" 执行数学计算并返回结果。
当用户需要计算数学表达式、解方程、做算术时使用此工具。
Args:
expression: 数学表达式字符串,比如"2+3*4"、"100/5+3"
"""
try:
result = eval(expression)
return f"计算结果:{expression} = {result}"
except Exception as e:
return f"计算失败:{str(e)}"
tools = [get_weather, calculate]
# 建立工具名到函数的映射,方便后面调用
tool_map = {t.name: t for t in tools}
# ===================== 2. 初始化大模型 + 绑定工具(稳定API,所有1.x版本都支持) =====================
llm = ChatOpenAI(
model="glm-4-flash",
# 换成gpt-3.5-turbo-0125及以上支持工具调用的模型都可以
temperature=0,
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL")
)
# 给大模型绑定工具,这个是langchain-core里的稳定API,永远不会乱改路径
llm_with_tools = llm.bind_tools(tools)
# ===================== 3. 手动实现Agent循环(10行代码,逻辑透明,无任何依赖坑) =====================
def run_agent(user_input: str, max_steps=5):
"""最简单的Agent执行循环,完全不用AgentExecutor,100%不会有版本导入问题"""
# 初始化消息列表
messages = [
{"role": "system", "content": "你是智能助手,可以使用工具回答问题,拿到工具结果后给出最终回答。"},
HumanMessage(content=user_input)
]
for step in range(max_steps):
print(f"\n--- 第{step + 1}步思考 ---")
# 调用大模型
response = llm_with_tools.invoke(messages)
# 如果模型没有要调用的工具,说明已经得到最终答案
if len(response.tool_calls) == 0:
print(f"✅ 最终回答:{response.content}")
return response.content
# 如果模型要调用工具,逐个执行
print(f"⚡ 需要调用工具:{[tc['name'] for tc in response.tool_calls]}")
messages.append(response)
for tool_call in response.tool_calls:
tool_name = tool_call["name"]
tool_args = tool_call["args"]
print(f" 调用{tool_name},参数:{tool_args}")
# 执行工具
tool_result = tool_map[tool_name].invoke(tool_args)
print(f" 工具返回:{tool_result}")
# 把工具结果加入消息列表,传给下一轮大模型
messages.append(ToolMessage(
content=str(tool_result),
tool_call_id=tool_call["id"]
))
return "达到最大步数,任务结束"
# ===================== 4. 运行测试 =====================
if __name__ == "__main__":
print("=" * 60)
print("测试1:查询北京天气")
print("=" * 60)
run_agent("北京今天天气怎么样?")
print("\n" + "=" * 60)
print("测试2:数学计算")
print("=" * 60)
run_agent("帮我算一下 123 * 45 + 67 等于多少")
print("\n" + "=" * 60)
print("测试3:同时调用两个工具")
print("=" * 60)
run_agent("上海天气怎么样?再帮我算99乘以99等于多少")运行结果如下:
============================================================
测试1:查询北京天气
============================================================
--- 第1步思考 ---
⚡ 需要调用工具:['get_weather']
调用get_weather,参数:{'city': '北京'}
工具返回:晴,25°C,风力3级,空气质量优
--- 第2步思考 ---
✅ 最终回答:北京今天的天气是晴天,温度为25°C,风力3级,空气质量优。
============================================================
测试2:数学计算
============================================================
--- 第1步思考 ---
⚡ 需要调用工具:['calculate']
调用calculate,参数:{'expression': '123*45+67'}
工具返回:计算结果:123*45+67 = 5602
--- 第2步思考 ---
✅ 最终回答:分析「帮我算一下 123 * 45 + 67 等于多少」这个问题,我们可以通过请求Python的内置函数eval()来得出答案:123 * 45 + 67 = 5602
============================================================
测试3:同时调用两个工具
============================================================
--- 第1步思考 ---
⚡ 需要调用工具:['get_weather']
调用get_weather,参数:{'city': '上海'}
工具返回:多云,28°C,风力2级,空气质量良
--- 第2步思考 ---
⚡ 需要调用工具:['calculate']
调用calculate,参数:{'expression': '99*99'}
工具返回:计算结果:99*99 = 9801
--- 第3步思考 ---
✅ 最终回答:上海现在的天气是多云,温度为28°C,风力2级,空气质量良好。同时,99乘以99等于9801。开启verbose=True后,你会看到Agent完整的思考-行动-观察循环,和我们前几天手写的ReAct逻辑一模一样——只不过LangChain帮你把重复的循环逻辑封装好了。
✍️ 今日练习题
题目:给上面的天气助手加一个新工具
- 新增一个工具
get_air_quality(city: str),模拟返回城市空气质量(优/良/轻度污染等) - 提问:"帮我查一下广州的天气和空气质量,如果污染严重我就戴口罩出门"
- 观察Agent是否能自动连续调用两个工具,先查天气再查空气质量,最后综合给出建议
- (可选)故意把工具描述写得模糊一点,看看Agent会不会选错工具——你会深刻体会到:工具描述的质量,直接决定Agent的能力上限。
提示:不需要修改Agent主体逻辑,只要用@tool定义新函数,加入tools列表即可,LangChain会自动完成工具选择和调用编排。
💯 面试金句(直接背)
"LangChain不是大模型本身,而是大模型应用的编排框架。它把模型、工具、记忆、检索等组件标准化为可插拔模块,让开发者不用从零实现Agent循环,像搭积木一样快速构建大模型应用。最核心的四个抽象是Model、Prompt Template、Chain、Agent,其中Agent = LLM + Tools + Memory + ReAct循环。"
📅 学习进度
✅ Day1:AI Agent核心概念与本质
✅ Day2:核心组件——工具调用原理
✅ Day3:核心组件——记忆机制设计
✅ Day4:核心组件——规划与推理ReAct模式
✅ Day5:LangChain框架入门与最小Agent(今天)
⏭️ 明天我们进入Day6:LangChain自定义工具与Tool Calling实战,手把手教你写自己的工具。
学完今天的内容,你已经可以用LangChain写出真正能跑的Agent了,赶紧动手把代码跑起来,光看是学不会的!
如果觉得有帮助,欢迎点赞收藏转发,我们明天见。