跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

LangChain Agent 智能应用构建指南

综述由AI生成LangChain 框架及其核心组件 Agent 的实现与应用。LangChain 解决了大模型无法获取最新信息、幻觉等问题。Agent 基于 ReAct 框架,通过思考、行动、观察的循环流程,使大模型能够调用外部工具解决问题。文章详细讲解了工具定义、结果解析类编写、Agent 初始化及调用的完整流程,并分析了 Agent 模式的优缺点及优化方向。通过 Agent 模式,开发者可以在无需微调大模型的情况下扩展其能力,实现复杂的智能应用构建。

心动瞬间发布于 2025/2/6更新于 2026/5/3117 浏览
LangChain Agent 智能应用构建指南

LangChain Agent 智能应用构建指南

LangChain 介绍

随着各种开源大模型的发布,越来越多的人开始尝试接触和使用大模型。在感叹大模型带来的惊人表现的同时,也发现一些问题,比如没法查询到最新的信息,有时候问一些数学问题时候会出现错误答案,还有一些专业领域类问题甚至编造回答等等。有没有什么办法能解决这些问题呢?答案是 LangChain。

LangChain 是一个开源的语言模型集成框架,旨在简化使用大型语言模型(LLM)创建应用程序的过程。利用它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人、调用特定的 SaaS 服务等等。随着 ChatGPT、Midjourney 等 AI 技术的爆火,LangChain 在短时间内获得了大量关注,版本迭代异常快,社区十分活跃。

LangChain 的核心架构主要包含如下模块:

  • Model I/O:大模型的输入输出,包含提示词(Prompt)、任何大模型接口、结果解析器。
  • Retrieval:涉及到数据集相关,主要包含文档提取器、文档转换器、向量数据库等,用于实现 RAG(检索增强生成)。
  • Chains:允许将多个不同组件组合在一起使用,形成链条式调用,处理特定工作流。
  • Memory:在大模型调用期间提供存储能力,保存对话历史或上下文状态。
  • Agents:链式调用是硬编码的,而代理是由大模型根据实时情况来决定如何调用工具,具有更高的灵活性。
  • Callbacks:大模型各个阶段的回调系统,对于日志记录、监控、流传输和其他任务非常有用。

Agent 核心原理

大模型一般只拥有他们被训练的知识,这种知识可能很快就会过时了,所以在推理的时候大模型与外界是处于'断开'状态的。为了克服这一限制,LangChain 在 Yao 等人于 2022 年 11 月提出的「推理和行动(ReAct)」框架上提出了'代理 (Agent)'的解决方案。此方案可以获取最新的数据,并将其作为上下文插入到提示中。Agent 也可以用来采取行动(例如,运行代码,修改文件等),然后该行动的结果可以被 LLM 观察到,并被纳入他们关于下一步行动的决定。

运行流程

运行大体流程为:1. 用户给出一个任务 (Prompt) -> 2. 思考 (Thought) -> 3. 行动 (Action) -> 4. 观察 (Observation),然后循环执行上述 2-4 的流程,直到大模型认为找到最终答案为止。

Agent 内部具体拆解逻辑如下:

  1. Thought: 模型分析当前状态,决定下一步做什么。
  2. Action: 选择具体的工具并生成参数。
  3. Observation: 工具执行后返回结果,作为新的上下文输入给模型。
  4. Final Answer: 当模型认为信息足够时,输出最终结论。

实现步骤详解

使用 Agent 有两个必备条件:相关能力工具和对这些工具的正确描述。工具的命名和描述直接决定了大模型能否准确理解何时调用该工具。

定义工具

工具的定义只需要集成 BaseTool 类,然后在 _run 方法中编写你的逻辑就行,大模型会把合适的参数传进来。需要定义类变量有:

  • name: 工具名称,很重要,大模型内部会使用到,需简洁明确。
  • description: 工具描述,很重要,告知大模型在什么情况下来使用这个工具,描述越详细效果越好。
  • return_direct: 这个字段默认为 false,如果设置为 true,工具返回结果后,大模型就不再循环思考了会直接将这个结果当做答案。

LangChain 已经内置了 duckduckgo 搜索引擎,pip install duckduckgo-search 安装一下依赖包即可使用。下面是我定义的两个工具,一个用于电影搜索,一个用于数学计算:

import re
from langchain.tools import BaseTool, DuckDuckGoSearchRun

# 搜索工具
class SearchTool(BaseTool):
    name = "Search"
    description = "当问电影相关问题时候,使用这个工具来搜索最新信息"
    return_direct = False  # 直接返回结果

    def _run(self, query: str) -> str:
        print("\n正在调用搜索引擎执行查询:" + query)
        search = DuckDuckGoSearchRun()
        return search.run(query)

# 计算工具
class CalculatorTool(BaseTool):
    name = "Calculator"
    description = "如果问数学相关问题时,使用这个工具进行精确计算"
    return_direct = False  # 直接返回结果

    def _run(self, query: str) -> str:
        try:
            return eval(query)
        except Exception as e:
            return f"计算出错:{str(e)}"

定义结果解析类

每次大模型输出之后,都会对结果进行解析,如果找到 action 就会去调用。但是默认的解析类在某些情况下可能会报错,因此建议改写自定义解析器以确保稳定性。

from typing import Dict, Union, Any, List

from langchain.output_parsers.json import parse_json_markdown
from langchain.agents.conversational_chat.prompt import FORMAT_INSTRUCTIONS
from langchain.agents import AgentExecutor, AgentOutputParser
from langchain.schema import AgentAction, AgentFinish

class CustomOutputParser(AgentOutputParser):

    def get_format_instructions(self) -> str:
        return FORMAT_INSTRUCTIONS

    def parse(self, text: str) -> Union[AgentAction, AgentFinish]:
        print(text)
        cleaned_output = text.strip()
        # 定义匹配正则
        action_pattern = r'"action":\s*"([^"]*)"'
        action_input_pattern = r'"action_input":\s*"([^"]*)"'
        # 提取出匹配到的 action 值
        action = re.search(action_pattern, cleaned_output)
        action_input = re.search(action_input_pattern, cleaned_output)
        
        action_value = None
        action_input_value = None
        if action:
            action_value = action.group(1)
        if action_input:
            action_input_value = action_input.group(1)
        
        # 如果遇到'Final Answer',则判断为本次提问的最终答案了
        if action_value and action_input_value:
            if action_value == "Final Answer":
                return AgentFinish({"output": action_input_value}, text)
            else:
                return AgentAction(action_value, action_input_value, text)

        # 如果声明的正则未匹配到,则用 json 格式进行匹配
        response = parse_json_markdown(text)
        
        action_value = response.get("action")
        action_input_value = response.get("action_input")
        if action_value == "Final Answer":
            return AgentFinish({"output": action_input_value}, text)
        else:
            return AgentAction(action_value, action_input_value, text)

output_parser = CustomOutputParser()

初始化 Agent

如果你使用 ChatGPT 的话,这里需要配置 ChatGPT 的 api-key。也可以配置一些本地的开源大模型,比如 ChatGLM2-6B、Baichuan-13B 等,但是效果确实要比 ChatGPT 差很多,尤其是在复杂推理任务上。

from langchain.memory import ConversationBufferMemory
from langchain.agents.conversational_chat.base import ConversationalChatAgent 
from langchain.agents import AgentExecutor, AgentOutputParser
from langchain.chat_models import ChatOpenAI

SYSTEM_MESSAGE_PREFIX = """尽可能用中文回答以下问题。您可以使用以下工具"""

# 初始化大模型实例,可以是本地部署的,也可是是 ChatGPT
# llm = ChatGLM(endpoint_url="http://你本地的实例地址")
llm = ChatOpenAI(openai_api_key="sk-xxx", model_name='gpt-3.5-turbo', request_timeout=60)
# 初始化工具
tools = [CalculatorTool(), SearchTool()]
# 初始化对话存储,保存上下文
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 配置 agent
chat_agent = ConversationalChatAgent.from_llm_and_tools(
    system_message=SYSTEM_MESSAGE_PREFIX, # 指定提示词前缀
    llm=llm, tools=tools, memory=memory, 
    verbose=True, # 是否打印调试日志,方便查看每个环节执行情况
    output_parser=output_parser
)
agent = AgentExecutor.from_agent_and_tools(
    agent=chat_agent, tools=tools, memory=memory, verbose=True,
    max_iterations=3 # 设置大模型循环最大次数,防止无限循环
)

调用 Agent

调用就很简单了,执行 agent.run(prompt) 即可。日志已经完整的体现出了整个流程,大模型的确每次都匹配到了正确的 tool。如果还觉得日志不详细,可以设置 langchain.debug = True,这样会打印更详细日志。

总结与优化方向

可以这么理解 Agent,它让大模型变成了一个决策者。用户的问题首先由它去理解和拆分,它来从工具列表中找到觉得合适的工具,然后将用户的提问信息转化成结构化的数据,当成参数传递给工具函数。工具函数返回结果又交还给了大模型去观察分析,如果它觉得不是正确答案,那么继续这个循环直到得出它认为的正确答案。

它就像是一个优秀的项目经理,分解用户的问题,可能他不擅长完成某一项任务,但是他能找到合适专业的外部的人去完成子任务,最后他再汇总任务结果交付给用户。

后期大模型能力越来越强之后,还需要高成本的训练和微调大模型吗?Agent 模式提供了一种无需微调即可扩展能力的途径。

优点

  • 框架层干预:对大模型的有更系统化的干预机制,方便集成外部工具和数据源。
  • 能力拓展:拓展了大模型更多的能力,而且是不需要经过复杂且昂贵的训练过程。
  • 规则自动化:不用再去写那些匹配场景的规则了,大模型已经帮你做了,前提是这个模型参数要够大,能理解用户的意思。
  • 可观测性:整个流程都有详细的记录日志,方便调试和排查问题。

不足

  • 响应延迟:大模型会被多次调用,响应用户的时间可能会比较久,因此相应产品也就会限制在一些特定领域。
  • 黑盒逻辑:虽然不用写工具匹配规则,但是这也让这一块逻辑变成一个黑盒了,很难去精准的匹配或者调试。
  • 模型依赖:对大模型本身能力要求很高,如果使用低参数大模型,很有可能无法识别问题并正确的分发给对应工具。

优化方向

当然还是有优化的方向的:比如可以考虑去使用语料专门往解析 action 方面训练,让模型能更好的解析出 action。此外,还可以引入缓存机制减少重复调用,或者设计更精细的工具描述模板来提升准确率。在实际生产环境中,建议结合人类反馈强化学习(RLHF)来持续优化 Agent 的行为策略。

通过合理设计和调优,LangChain Agent 能够显著提升智能应用的交互能力和实用性,是构建下一代 AI 应用的重要基石。

目录

  1. LangChain Agent 智能应用构建指南
  2. LangChain 介绍
  3. Agent 核心原理
  4. 运行流程
  5. 实现步骤详解
  6. 定义工具
  7. 搜索工具
  8. 计算工具
  9. 定义结果解析类
  10. 初始化 Agent
  11. 初始化大模型实例,可以是本地部署的,也可是是 ChatGPT
  12. llm = ChatGLM(endpoint_url="http://你本地的实例地址")
  13. 初始化工具
  14. 初始化对话存储,保存上下文
  15. 配置 agent
  16. 调用 Agent
  17. 总结与优化方向
  18. 优点
  19. 不足
  20. 优化方向
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 汉诺塔综合演示项目实现指南
  • CTFshow Web25:php_mt_seed 伪随机数种子爆破实战
  • 低代码/无代码平台通用安全缺陷与利用模式深度剖析
  • 基于 NVIDIA DGX Spark 部署 Stable Diffusion 3.5 及 ComfyUI
  • Go、Rust、Zig、C++ 与 C# 系统编程语言全面对比
  • Linux System V 共享内存:原理、实操与避坑指南
  • Clawdbot 部署 Qwen3:32B 避坑指南:解决 Token 过期及前端提示问题
  • C++ 入门进阶:输入输出流、缺省参数与函数重载
  • Spring Web 模块核心概念与 RESTful API 调用实践
  • 2026 国内 AI 编程套餐(Coding Plan)全量横评:选型指南与避坑手册
  • AI 应用开发的技术深度:从 API 调用到系统工程实践
  • C 语言 Web 开发:CGI、FastCGI 与 Nginx 实战解析
  • Python Web 框架 Django 实战:模型、视图与模板应用
  • 深入理解前端防抖与节流:原理、区别与实战示例
  • 无人机群三维环境碰撞与静态避障仿真及 Matlab 实现
  • Java 数据类型、运算符与方法核心总结
  • HarmonyOS NEXT 分布式软总线技术架构
  • Windows 下使用 nvm-windows 管理 Node.js 版本及 npm 配置
  • Spring AI 系列:AI 大模型原理与平台接入
  • Python 实现 Markdown 转 Word 文档(markdown+python-docx 方案)

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online