本文详细介绍了如何使用LangChain构建智能体,解释了“大模型+工具+记忆”的核心概念,并提供了环境搭建、安全配置、分步搭建智能体的完整指南。文章涵盖了初始化大模型、开发工具模块、组装智能体以及实现对话记忆修剪等关键步骤,并补充了常见问题解决方案和进阶优化方向,适合想要学习大模型应用开发的程序员和小白。


一、先搞懂:什么是LangChain智能体?

在聊搭建之前,我们先理清核心概念——别被“智能体”这三个字吓住,它本质就是「大模型+工具+记忆」的组合体,用通俗的话讲:

  • 大模型(比如ChatOpenAI):智能体的“大脑”,负责理解用户需求、判断该做什么;
  • 工具(比如API查询):智能体的“手脚”,负责执行大脑的指令,获取外部数据(比如查空气质量、查航班);
  • 对话记忆:智能体的“记事本”,负责记录多轮对话内容,避免“转头就忘”,同时控制记忆长度,防止信息过载。

而LangChain,就是帮我们把“大脑、手脚、记事本”快速组装起来的工具包——它不用我们从零开发,只需要几行代码,就能把大模型和各种工具、记忆模块联动起来。

补充知识点:LangChain生态里有两个核心工具常被混淆——LangChain Agents和LangGraph。简单说,LangChain Agents是“预制房屋”,几行代码就能快速搭建基础智能体,适合新手;LangGraph是“建筑材料”,是底层编排框架,能自定义复杂工作流,我们今天用的create_agent,本质就是基于LangGraph封装的简化版本,兼顾易用性和可控性。

先看一张智能体的核心架构图,帮大家建立直观认知:

graph TD    A[用户输入] --> B[对话记忆模块]    B --> C[大模型大脑(ChatOpenAI)]    C -->|判断是否需要工具| D{工具调用判断}    D -->|是| E[工具模块(空气质量查询)]    E --> F[工具返回结果]    F --> C    D -->|否| G[直接生成响应]    C --> H[流式输出给用户]    H --> I[更新对话记忆]    I --> B

二、前期准备:环境搭建+安全配置(避坑关键)

搭建智能体前,我们先做好准备工作——重点解决两个问题:环境安装(避免版本冲突)、敏感信息保护(比如API密钥,绝对不能直接写在代码里)。

2.1 正确安装依赖(修正常见错误)

很多新手会犯“重复安装”的错误(比如多次安装langchain),这里给出精简且正确的安装命令,复制到终端执行即可:

# 安装核心依赖:LangChain、大模型对接、工具编排pip install langchain-deepseek openai langchain langgraph langchain-openai# 安装环境变量管理、网络请求依赖pip install python-dotenv requests

2.2 敏感信息加密:用.env文件保护密钥

这是最容易被忽略但最关键的一步!如果把API密钥直接写在代码里,一旦分享代码,密钥就会泄露,可能造成财产损失。

正确做法是用.env文件存储敏感信息,步骤如下:

  1. 在项目文件夹里,新建一个名为「.env」的文件(注意前面有个小数点);
  2. 在.env文件里,按以下格式填写信息(不用加引号,替换成自己的内容):
# .env文件内容(仅自己可见,不提交、不分享)BASE_URL=你的大模型基础地址MODEL_NAME=你的大模型名称(比如gpt-3.5-turbo)API_KEY=你的大模型API密钥AQI_KEY=你的空气质量API密钥(后面会用到)

之后在代码里,我们用python-dotenv库读取这些信息,就能避免密钥泄露——这也是企业开发中的标准做法。

三、分步搭建:从基础模型到可交互智能体

我们按“先搭大脑→再装手脚→最后加记忆”的顺序,一步步搭建智能体,每一步都有详细代码和解释,跟着做就能成功。

3.1 第一步:搭建“大脑”——初始化大模型

首先,我们初始化大模型(ChatOpenAI),作为智能体的“大脑”。这里会用到.env文件里的配置,同时解释几个关键参数的作用(新手必看):

from dotenv import load_dotenvimport os# 加载.env文件中的环境变量(核心:避免密钥泄露)load_dotenv(override=True)# 从环境变量中读取配置(不直接写死在代码里)BASE_URL = os.getenv("BASE_URL")API_KEY = os.getenv("API_KEY")MODEL = os.getenv("MODEL_NAME")# 初始化大模型(智能体的"大脑")from langchain_openai import ChatOpenAImodel = ChatOpenAI(    base_url=BASE_URL,    model=MODEL,    api_key=API_KEY,    temperature=0.01,  # 控制随机性:数值越低,回答越严谨(0~2)    frequency_penalty=0.01,  # 避免重复内容:数值越高,越不重复    presence_penalty=0.01  # 鼓励新内容:数值越高,越容易产生新话题)

关键参数解释:temperature设为0.01,是因为我们做的是“查询类智能体”,需要回答准确、严谨,不能太随机;如果是创作类智能体(比如写文案),可以调到0.7左右。

3.2 第二步:装上“手脚”——开发工具模块

用户原代码中的天气查询工具,我们替换为「城市空气质量查询工具」(规避版权风险),同时优化代码逻辑,增加异常处理,让工具更稳定。

这里我们用公开的空气质量API逻辑(模拟真实请求,实际使用时可替换为高德、百度等免费API),代码如下:

from langchain_core.tools import toolimport requests# 定义工具:城市空气质量查询(智能体的"手脚")@tooldef get_air_quality(loc: str) -> str:    """查询指定城市的即时空气质量信息,包括AQI指数、首要污染物、空气质量等级"""    # 替换为公开的空气质量API(示例逻辑,可直接复用)    url = "https://api.example.com/v1/air/quality.json"  # 模拟公开API地址    params = {        "key": os.getenv("AQI_KEY"),  # 从环境变量读取密钥        "location": loc,        "language": "zh-Hans",        "unit": "cn"    }        try:        # 发送请求,获取空气质量数据        response = requests.get(url, params=params)        response.raise_for_status()  # 自动捕获HTTP请求错误        air_data = response.json()                # 提取关键信息,整理成易懂的格式        result = f"城市: {loc}\n"        result += f"空气质量等级: {air_data['results'][0]['level']}\n"        result += f"AQI指数: {air_data['results'][0]['aqi']}(数值越低越好)\n"        result += f"首要污染物: {air_data['results'][0]['primary_pollutant']}\n"        result += f"建议: {air_data['results'][0]['suggestion']}"                return result    except Exception as e:        # 异常处理:避免工具崩溃导致整个智能体失效        return f"空气质量查询失败,请检查城市名称是否正确,或稍后再试:{str(e)}"# 将工具放入工具列表(智能体可调用的所有工具)tools = [get_air_quality]

核心优化点:① 替换工具场景(天气→空气质量),规避版权;② 完善异常处理,即使API请求失败,智能体也不会崩溃;③ 所有密钥都从.env读取,保持安全。

3.3 第三步:组装智能体——关联大脑和手脚

有了大脑(大模型)和手脚(工具),我们用LangChain的create_agent方法,将两者组装起来,让智能体具备“理解需求→调用工具”的能力:

from langchain.agents import create_agent# 组装智能体:将大脑(model)和手脚(tools)关联起来agent = create_agent(    llm=model,  # 传入大模型(大脑)    tools=tools  # 传入工具列表(手脚))

这一步非常简单,LangChain已经帮我们封装好了核心逻辑——智能体收到用户需求后,会自动判断:是否需要调用工具?如果需要,调用哪个工具?不需要的话,直接生成回答。

3.4 第四步:加上“记忆”——控制多轮对话历史

这是本文的重点!如果没有记忆模块,智能体聊几轮就会忘事;但记忆太长,又会导致大模型卡顿、消耗过多token(费用增加)。

我们实现两个核心功能:① 记录多轮对话历史;② 自动修剪历史,只保留最近3轮对话(可自定义)。同时补充LangChain官方推荐的修剪方案,供大家进阶使用。

4.1 实现对话记忆修剪函数
from langchain_core.messages import HumanMessage, SystemMessage, AIMessagedef trim_history(history, max_turns=3):    """修剪对话历史,只保留最近max_turns轮,避免信息过载        Args:        history: 对话历史列表(存储用户消息、AI消息、系统消息)        max_turns: 最大保留轮数(默认3轮,可根据需求调整)    Returns:        修剪后的对话历史,保留系统消息和最近max_turns轮对话    """    if not history:        return history        # 找到所有用户消息(HumanMessage)的位置,每一条用户消息对应一轮对话    human_indices = []    for i, msg in enumerate(history):        if isinstance(msg, HumanMessage):            human_indices.append(i)        # 如果对话轮数≤max_turns,不需要修剪    if len(human_indices) <= max_turns:        return history        # 保留最后max_turns轮对话,同时保留系统消息(如果有)    start_index = human_indices[-max_turns]    trimmed_history = []        # 保留第一条系统消息(智能体的角色设定,不能删)    if history and isinstance(history[0], SystemMessage):        trimmed_history.append(history[0])        # 保留最近max_turns轮对话    trimmed_history.extend(history[start_index:])        return trimmed_history

进阶补充:除了手动实现修剪逻辑,LangChain还提供了trim_messages函数,支持按token数精细控制,更适合生产环境。它就像“对话历史的策展人”,能优雅保留关键消息(比如系统消息),避免无差别删除。 示例代码如下(可直接替换手动修剪函数):

`from langchain_core.messages import trim_messages

按token数修剪,保留系统消息,不截断单条消息

trimmer = trim_messages( max_tokens=1000, # 最大token数,超过则修剪 token_counter=model, # 用大模型计算token数 include_system=True, # 保留系统消息 allow_partial=False # 不截断单条消息,避免语义断裂 )`

4.2 实现交互式对话(支持流式输出)

最后,我们实现交互式对话函数,支持流式输出(像聊天一样,边生成边显示)、手动清空历史、查看历史对话,同时自动修剪记忆,完整代码如下:

def interactive_chat_stream(agent, system_message=None, max_turns=3):    """交互式对话函数(原生流式输出,自动修剪历史)    Args:        agent: 组装好的智能体        system_message: 智能体的角色设定(比如"你是空气质量助手")        max_turns: 最大保留对话轮数    """    history = []  # 存储对话历史        # 加入系统消息(设定智能体的角色,全程生效)    if system_message:        history.append(SystemMessage(content=system_message))        # 启动提示    print("\n" + "=" * 60)    print("🤖 空气质量智能体已启动(流式输出模式)")    print("=" * 60)    print(f"💡 输入 'quit' 退出,'clear' 清空历史,'history' 查看历史")    print(f"💡 历史对话最多保留 {max_turns} 轮,超过会自动清理")    print("=" * 60 + "\n")        while True:        try:            user_input = input("👤 你: ").strip()                        # 退出对话            if user_input.lower() in ['quit', 'exit', '退出', 'q']:                print("\n👋 对话结束,再见!")                break                        # 清空历史对话            if user_input.lower() in ['clear', '清空', 'c']:                history = []                if system_message:                    history.append(SystemMessage(content=system_message))                print("✅ 对话历史已清空\n")                continue                        # 查看历史对话            if user_input.lower() in ['history', '历史', 'h']:                human_count = sum(1 for msg in history if isinstance(msg, HumanMessage))                print(f"\n📜 对话历史 (共 {len(history)} 条消息,{human_count} 轮对话)\n")                for i, msg in enumerate(history, 1):                    msg_type = type(msg).__name__                    content = msg.content[:80] if hasattr(msg, 'content') else str(msg)[:80]                    print(f"{i:3d}. [{msg_type:15s}] {content}...")                print()                continue                        # 避免空输入            if not user_input:                print("⚠️  请输入有效的问题(比如:查询北京的空气质量)\n")                continue                        # 新增用户消息到历史            history.append(HumanMessage(content=user_input))                        # 流式输出AI响应(边生成边显示,提升体验)            print(f"\n🔄 正在处理请求...\n")            print("🤖 AI: ", end="", flush=True)            last_ai_content = ""            new_messages = []  # 存储新增的AI消息            seen_msg_ids = set()  # 去重:避免重复添加同一条消息                        # 遍历智能体的流式输出结果            for event in agent.stream({"messages": history}):                for node_name, node_state in event.items():                    if "messages" in node_state:                        for msg in node_state["messages"]:                            # 用消息ID判断是否为新消息                            msg_id = msg.id if hasattr(msg, 'id') else id(msg)                            if msg_id not in seen_msg_ids:                                new_messages.append(msg)                                seen_msg_ids.add(msg_id)                                                                # 流式输出AI内容(只输出新增部分)                                if isinstance(msg, AIMessage) and hasattr(msg, 'content'):                                    current_content = msg.content                                    if len(current_content) > len(last_ai_content):                                        new_text = current_content[len(last_ai_content):]                                        print(new_text, end="", flush=True)                                        last_ai_content = current_content                        print()  # 换行            history.extend(new_messages)  # 更新对话历史                        # 自动修剪历史对话(超过max_turns轮则清理)            human_count = sum(1 for msg in history if isinstance(msg, HumanMessage))            if human_count > max_turns:                print(f"\n⚠️  对话轮数已超过 {max_turns} 轮,正在清理旧历史...")                old_count = len(history)                history = trim_history(history, max_turns)                print(f"✅ 已清理 {old_count - len(history)} 条旧消息,保留最近 {max_turns} 轮\n")                        print()                        except KeyboardInterrupt:            print("\n\n⚠️  检测到中断信号,对话结束!")            break        except Exception as e:            print(f"\n❌ 发生错误: {str(e)}\n")

3.5 第五步:启动智能体,测试效果

所有模块都搭建完成后,我们启动智能体,测试一下实际效果(复制代码到末尾即可):

if __name__ == "__main__":    try:        # 启动交互式对话,设定智能体角色        interactive_chat_stream(            agent=agent,            system_message="你是友好的空气质量助手,擅长用通俗的语言回答用户关于空气质量的问题,查询结果要准确、清晰,同时给出实用建议。",            max_turns=3  # 最多保留3轮对话        )    except Exception as e:        print(f"程序启动失败: {str(e)}")

测试示例(模拟效果):

============================================================🤖 空气质量智能体已启动(流式输出模式)============================================================💡 输入 'quit' 退出,'clear' 清空历史,'history' 查看历史💡 历史对话最多保留 3 轮,超过会自动清理============================================================👤 你: 查询上海的空气质量🔄 正在处理请求...🤖 AI: 城市: 上海空气质量等级: 良AQI指数: 65(数值越低越好)首要污染物: PM2.5建议: 空气质量良好,适合户外活动,敏感人群可适当减少长时间户外停留。👤 你: 那北京呢🔄 正在处理请求...🤖 AI: 城市: 北京空气质量等级: 轻度污染AQI指数: 112(数值越低越好)首要污染物: PM10建议: 空气质量一般,敏感人群减少户外活动,外出请佩戴口罩。

四、关键知识点补充+避坑指南

搭建完成后,我们补充几个关键知识点和常见坑,帮大家避免踩雷,同时提升智能体的稳定性。

4.1 对话记忆修剪的核心逻辑(新手必懂)

为什么要修剪对话历史?主要有两个原因:① 大模型的上下文窗口是有限的(比如GPT-3.5的上下文窗口是4k token),历史太长会导致无法处理新需求;② 减少token消耗,降低使用成本。

我们的修剪逻辑遵循两个原则:① 保留系统消息(智能体的角色设定,删了会“失忆”);② 保留最近的对话轮数,确保上下文连贯。

附上对话记忆修剪的流程图,一看就懂:

flowchart LR    A[对话历史] --> B{对话轮数>max_turns?}    B -->|否| C[直接返回原历史]    B -->|是| D[找到倒数第max_turns条用户消息]    D --> E[保留系统消息(如果有)]    E --> F[保留该用户消息及之后的所有消息]    F --> G[返回修剪后的历史]

4.2 常见坑及解决方案

  • 坑1:API密钥泄露 → 解决方案:必须用.env文件存储,绝对不能直接写在代码里,也不要提交.env文件到代码仓库;
  • 坑2:对话流式输出卡顿 → 解决方案:确保代码中“flush=True”(强制刷新输出),避免缓存导致卡顿;
  • 坑3:修剪历史后,智能体“忘记”角色 → 解决方案:修剪时必须保留第一条系统消息,这是智能体的角色设定;
  • 坑4:工具调用失败 → 解决方案:完善异常处理(try-except),同时检查API密钥和请求参数是否正确。

4.3 进阶方向:让智能体更强大

如果想进一步优化智能体,可以尝试以下方向(结合LangChain生态的高级功能):

  1. 增加多工具支持:比如同时加入“空气质量查询”“未来3天预报”“污染物解读”三个工具,让智能体能处理更复杂的需求;
  2. 用LangGraph自定义工作流:如果需要复杂的条件分支(比如“查询失败后重试”“需要人工确认后再执行”),可以用LangGraph底层框架,完全控制智能体的每一步行动;
  3. 加入LangSmith监控:实时查看智能体的运行轨迹、工具调用情况,方便调试和优化;
  4. 优化记忆模块:用LangChain的“对话记忆缓冲区”,自动判断哪些历史消息是关键的,无需固定轮数修剪。

工业级应用参考:LangChain智能体已广泛应用于智能客服、自动驾驶决策等场景。比如智能客服系统,通过智能体的工具调用(检索知识库、生成工单)和记忆管理,能将问题解决率从92%提升到97%,平均响应时间从12秒缩短到3.2秒。

​最后

我在一线科技企业深耕十二载,见证过太多因技术更迭而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。

我整理出这套 AI 大模型突围资料包:

  • ✅AI大模型学习路线图
  • ✅Agent行业报告
  • ✅100集大模型视频教程
  • ✅大模型书籍PDF
  • ✅DeepSeek教程
  • ✅AI产品经理入门资料

完整的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
​​
在这里插入图片描述

为什么说现在普通人就业/升职加薪的首选是AI大模型?

人工智能技术的爆发式增长,正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议,到全国两会关于AI产业发展的政策聚焦,再到招聘会上排起的长队,AI的热度已从技术领域渗透到就业市场的每一个角落。

img
智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200% ,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。

AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。

在这里插入图片描述

​​
在这里插入图片描述

资料包有什么?

①从入门到精通的全套视频教程⑤⑥

包含提示词工程、RAG、Agent等技术点
在这里插入图片描述

② AI大模型学习路线图(还有视频解说)

全过程AI大模型学习路线

在这里插入图片描述

③学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

在这里插入图片描述

④各大厂大模型面试题目详解

在这里插入图片描述

⑤ 这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

所有的视频教程由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌,构建起"前沿课程+智能实训+精准就业"的高效培养体系。

课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

​​​​在这里插入图片描述
在这里插入图片描述

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓**

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐