← 文章 / AI技术
selcet 13小时前 · 2026-09-18 06:05:52 · 4 阅读

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把这些通用能力全部封装好了,你只需要:   

  1. 选一个大模型
  2. 定义好你的工具
  3. 选一个Agent类型
  4. 跑起来!

🧱 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帮你把重复的循环逻辑封装好了。


✍️ 今日练习题

题目:给上面的天气助手加一个新工具

  1. 新增一个工具get_air_quality(city: str),模拟返回城市空气质量(优/良/轻度污染等)
  2. 提问:"帮我查一下广州的天气和空气质量,如果污染严重我就戴口罩出门"
  3. 观察Agent是否能自动连续调用两个工具,先查天气再查空气质量,最后综合给出建议
  4. (可选)故意把工具描述写得模糊一点,看看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了,赶紧动手把代码跑起来,光看是学不会的!

如果觉得有帮助,欢迎点赞收藏转发,我们明天见。

原始来源: selcet

评论 (0)