基于 LangChain 和 GPT-4o-mini 的大模型智能体开发实战

近年来,大模型能力的持续突破,使得构建智能代理(Agent)系统成为开发者追逐的热点。

本文将以 LangChain 框架为核心,结合 GPT-4o-mini 模型,通过接入工具与消息修剪策略,实现一个具备记忆、调用搜索、执行函数能力的智能体。

环境准备与模型初始化

使用 LangChain 需要首先初始化语言模型,这里使用的是 GPT-4o-mini,由 OpenAI 提供。

# llm_env.py
from langchain.chat_models import init_chat_model llm = init_chat_model("gpt-4o-mini", model_provider="openai")

我们将其封装在 llm_env.py 中供主程序导入。

主程序结构解析

主逻辑文件为 main_agent_trim.py,功能包括:

  • 工具集成

  • PostgreSQL 持久化配置

  • 消息修剪策略

  • Agent 交互循环

工具函数与搜索工具接入

我们首先定义了一个简单的数学函数 add,以及接入了 TavilySearchResults 搜索工具,用于增强智能体外部知识获取能力。

def add(a: int, b: int) -> int:
return a + b search = TavilySearchResults(max_results=5)
tools = [add, search]

配置 LangGraph 持久化存储

我们使用 PostgresSaver 来记录 agent 的状态与历史会话,以支持多轮对话记忆。

DB_URI = "postgresql://postgres:123456@localhost:5432/langchaindemo?sslmode=disable"
with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
checkpointer.setup()

用户输入 thread_id,我们组合当天日期生成唯一标识符,确保每个会话线程独立可追溯。

消息修剪策略设计

为了控制模型输入 token 上限,我们引入 trim_messages 方法,在每轮对话前进行修剪:

def pre_model_hook(state):
trimmer = trim_messages(
max_tokens=65,
strategy="last",
token_counter=llm_env.llm,
include_system=True,
allow_partial=False,
start_on="human",
)
trimmed_messages = trimmer.invoke(state["messages"])
return {"llm_input_messages": trimmed_messages}

该策略仅保留最近的用户消息,避免长对话历史超出 token 限制,影响模型响应。

构建智能体执行器

借助 create_react_agent 方法创建智能体,传入模型、工具、hook 与 checkpoint。

agent_excuter = create_react_agent(
llm_env.llm,
tools,
pre_model_hook=pre_model_hook,
checkpointer=checkpointer,
)

与智能体交互

程序进入循环模式,接收用户输入,执行智能体推理,并输出响应内容及工具调用情况。

while True:
query = input("你: ")
if query.strip().lower() == "exit":
break
input_messages = [HumanMessage(query)]
response = agent_excuter.invoke({"messages": input_messages}, config=config)
for message in response["messages"]:
if hasattr(message, "content") and message.content:
print(f"{message.type}:{message.content}")
if hasattr(message, "tool_calls") and message.tool_calls:
print(f"{message.type}:{message.tool_calls}")

示例

总结

本文展示了如何基于 LangChain 框架构建一个集搜索、函数执行、消息修剪与状态持久化为一体的智能体系统。通过合理设计 hook 与工具链,我们可以持续扩展其功能边界。

后续你可以进一步:

  • 接入更多插件(如 SQL 查询、文件操作等)

  • 增强多轮对话上下文管理

  • 提升响应质量与控制能力(如 prompt 模版化)

AI大模型应用开发入门-LangChain开发Agent的更多相关文章

  1. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

  2. [嵌入式开发入门]4412开发板从零建立Linux最小系统

    本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...

  3. spring boot + vue + element-ui全栈开发入门——windows开发环境

     一.node.js开发环境 windows系统,去网站https://nodejs.org/en/download/,下载对应的安装程序,并安装Windows Installer (.msi) 接下 ...

  4. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  5. 【转载】Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

    Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...

  6. spring boot + vue + element-ui全栈开发入门——开篇

    最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...

  7. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

     前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...

  8. spring boot + vue + element-ui全栈开发入门

    今天想弄弄element-ui  然后就在网上找了个例子 感觉还是可以用的  第一步是完成了  果断 拿过来  放到我这里这  下面直接是连接  点进去 就可以用啊 本想着不用vue   直接导入连接 ...

  9. Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

    Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...

  10. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

随机推荐

  1. HTTP/1.1 优化

    避免发送 HTTP 请求 对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,通过缓存技术减少请求次数. 客户端会把第一次请求以及响应 ...

  2. Linux SWAP交换分区应该设置多大?

    乾乾君子 2019-02-21 15:21:02 23370 收藏 34分类专栏: 杂记 文章标签: linux centos swap分区版权    Linux SWAP交换分区,就是我们课本说讲过 ...

  3. Docker Swarm 进阶:集群容错

  4. elementui|dropdown|下拉菜单作为模态框使用

    elementui|dropdown|下拉菜单作为模态框使用 背景 场景:下拉菜单作为模态框使用: 操作:下拉菜单设置触发条件点击展示/隐藏:trigger="click" 目的: ...

  5. Delphi Inputbox 输入时显示‘*’号

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. Vite CVE-2025-30208 安全漏洞

    Vite CVE-2025-30208 安全漏洞 一.漏洞概述 CVE-2025-30208 是 Vite(一个前端开发工具提供商)在特定版本中存在的安全漏洞.此漏洞允许攻击者通过特殊的 URL 参数 ...

  7. [源码系列:手写spring] IOC第八节:BeanFactoryPostProcessor和BeanPostProcessor

    内容介绍 BeanFactoryPostProcessor和BeanPostProcessor是spring中具有重量级地位的两个接口,理解了这两个接口的主要作用,基本就理解Spring的核心原理了. ...

  8. OpenGL绘制YUV、OpenGL 实现画质模糊以及 OpenGL ES 实现画质模糊

    本文介绍如何采用 Qt + OpenGL 绘制 YUV 数据,并通过 OpenGL 来实现画质模糊. 前言 我们在开发音视频程序的时候,对于解码后帧的渲染往往有几个操作需要做: 将 YUV420 格式 ...

  9. 手写数字识别实战教程:从零实现MNIST分类器(完整代码示例)

    引言:数字识别的魔法世界 在人工智能的奇妙宇宙中,手写数字识别堪称经典中的经典.这个看似简单的任务--让电脑像人一样"认数字",背后蕴含着模式识别的核心思想.本文将带领你亲手实现一 ...

  10. CocoaPods+Gitee 制作私有库过程以及错误总结

    前言 最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候 ...