目录

认识LangChain

架构体系

什么是Agent

快速入门

准备工作

代码示例


认识LangChain

LangChain 由 Harrison Chase 创建于2022年10月,是用于开发智能体工程(Agent Engineering)的平台。

官网文档:https://docs.langchain.com/

架构体系

LangChain并不仅仅是一个框架,而是一整个智能体开发平台,包含很多不同的组件。

其中,包含一系列开源的智能体(Agent)开发框架,而且兼容Python和TypeScript两种语言:

  • LangChain:用于快速构建智能体,可兼容任何模型提供商。

  • LangGraph:从底层一步步控制智能体的构建,包括记忆(Memory)、人机协同(HITL)等

  • Deep Agents:用于构建复杂的、处理多步骤的任务的智能

另外,LangChain还包含一套帮助人工智能团队利用实时生产数据进行持续测试和改进的平台,叫做LangSmith:

总结:

LangChain是智能体开发平台,包含一套各种帮助开发、测试、评估智能体的框架。核心包括:

  • LangChain:用于快速构建智能体,可兼容任何模型提供商。

  • LangGraph:从底层一步步控制智能体的构建,包括记忆(Memory)、人机协同(HITL)等

  • Deep Agents:用于构建复杂的、处理多步骤的任务的智能体

  • LangSmith:用于测试、观察、评估、部署智能体

可以看到,LangChain平台的所有框架都是围绕着构建智能体(Agent)这一目标的,那么问题来了:

什么是智能体(Agent)呢?

什么是Agent

什么是Agent,这其实没有一个标准的答案,每个人都有自己的理解。

对于这个问题,LangChain创始人Harrison Chase有一个偏向技术性的答案:

An AI agent is a system that uses an LLM to decide the control flow of an application.

Agent是一种使用大语言模型(LLM)来决定应用程序控制流的系统。

在人工智能领域,Agent(通常翻译为智能体或代理)是指一种能够感知环境、进行推理、自主决策并采取行动以实现特定目标的智能系统。

特性

传统聊天机器人/LLM

AI Agent

交互模式

被动响应,问一句答一句

主动规划,以目标为导向

执行力

停留在文本生成层面

能操作软件、发送邮件、分析数据

自主性

需要人类给出详细步骤

只需给定最终目标,自主寻找路径

如果说大模型(LLM)是“大脑”,那么 Agent 就是“拥有手脚和思维逻辑的独立个体”。它不再只是被动地回答问题,而是能主动拆解任务并调用各种工具来完成工作。

例如:要开发一个《AI旅游助手》的应用。

如果是传统LLM应用,程序流程是这样的:

  1. 用户提出需求,例如:帮我计划一个5天的北京之旅,预算8000元,我喜欢历史。

  2. 调用LLM,分析用户需求,直接由LLM生成一个简单旅游计划

这个计划基于它训练数据中的通用知识,可能没有考虑当前的天气、景点是否关闭、门票是否可预订等实时信息。

如果是Agent应用,Agent可以自主规划程序流程:

  1. 用户提出需求,例如:帮我计划一个5天的北京之旅,预算8000元,我喜欢历史。

  2. Agent分析用户需求,分步执行:

    1. 规划: 将大目标分解为:查询机票酒店价格 -> 查询天气和景点信息 -> 设计每日行程 -> 计算总预算。

    2. 调用工具:

      1. 调用机票/酒店API,查询用户指定日期范围内的价格和可选酒店。

      2. 调用天气预报API,查询未来5天北京的天气,建议携带的衣物。

      3. 调用搜索引擎/景点API,查询故宫、国博等热门景点的最新开放时间、预约政策和当前展览。

    3. 感知与反馈: 综合感知所有查询到的实时信息,生成一个动态的、可执行的计划。例如:“根据预算和您对历史的兴趣,我推荐入住胡同里的XX酒店。第一天去故宫,但请注意下周一故宫闭馆,所以调整到第二天……总花费预计7500元,还在预算内。需要我现在帮您预订酒店和机票吗?”

Agent通过主动规划任务流程,主动使用工具,整合了实时信息,并进行了动态调整,最终产出的是一个真正可落地的方案。

总结如下:

  • LLM = 聪明的大脑

  • Agent = 聪明的大脑 + 手脚

当然,Agent的模式也是在不断演进的:

  • 阶段一:ReAct + Tool Calling

  • 阶段二:Reflection + Long Memory

  • 阶段三:Multi Agent System,MAS

接下来,我们会从最简单的Agent开始学习,逐渐升级到更复杂的Agent结构。

快速入门

下面,我们通过一个快速入门,了解Agent的定义和工作流程。

准备工作

首先,要使用LangChain必须先安装依赖,命令如下:

uv add langchain

uv add python-dotenv

LangChain支持各种不同的模型,而且提供了对应的兼容SDK,不过也都需要安装对应依赖,你可以按需添加:

# 集成 DeepSeek
uv add langchain-deepseek

# 集成 OpenAI
uv add langchain-openai

# 集成 Anthropic
uv add langchain-anthropic

代码示例

接下来就可以开发Agent了,基本步骤如下:

  1. 加载环境变量

  2. 定义工具

  3. 定义Agent

  4. 调用Agent

Langchain提供了create_agent方法用来快速创建Agent,我们只需要提供好Agent所需的模型(Models)、工具(Tools)即可。

# 1. 加载环境变量
from dotenv import load_dotenv

# 导入工具装饰器
from langchain.tools import tool

# 导入 Agent
from langchain.agents import create_agent

load_dotenv()


# 2. 定义工具
# 通过函数注释描述工具用途、参数和返回值
@tool
def getWeather(location: str) -> str:
    """
    Get the weather in a given location.

    Args:
        location: city name or coordinates
    """
    return f"Current weather in {location} is sunny"


# 3. 定义 Agent
agent = create_agent(
    "deepseek-chat",  # 模型名称
    tools=[getWeather]  # 工具集
)


# 4. 调用模型
print("🚀 正在调用大模型...")

response = agent.invoke({
    "messages": [
        {
            "role": "user",
            "content": "杭州今天天气如何?"
        }
    ]
})


# 5. 打印结果
print(response)

运行结果如下:

🚀 正在调用大模型...
{'messages': [HumanMessage(content='杭州今天天气如何?', additional_kwargs={}, response_metadata={}, id='c88f7b0e-900e-4400-8673-0dc231c750d8'), AIMessage(content="I'll check the weather in Hangzhou for you.", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 47, 'prompt_tokens': 283, 'total_tokens': 330, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cache_write_tokens': None, 'cached_tokens': 0, 'image_tokens': None, 'text_tokens': None}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 283}, 'model_provider': 'deepseek', 'model_name': 'deepseek-flash', 'system_fingerprint': 'aeb56401ca74e127821c4f9126dcb669', 'id': 'be331f48-bd03-4586-ac8c-33117b0687c0', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--01a0d7ae-7c23-76d1-9881-7d9170778f3e-0', tool_calls=[{'name': 'getWeather', 'args': {'location': '杭州'}, 'id': 'call_00_ezMaF9W34hta51BxmaIP3105', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 283, 'output_tokens': 47, 'total_tokens': 330, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}), ToolMessage(content='Current weather in 杭州 is sunny', name='getWeather', id='0f2e5d46-a158-458f-b609-659895fc8a04', tool_call_id='call_00_ezMaF9W34hta51BxmaIP3105'), AIMessage(content='杭州今天是晴天 ☀️\n\n需要我帮你查其他城市,或者了解更详细的信息(比如气温、湿度、风力)吗?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 29, 'prompt_tokens': 349, 'total_tokens': 378, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cache_write_tokens': None, 'cached_tokens': 128, 'image_tokens': None, 'text_tokens': None}, 'prompt_cache_hit_tokens': 128, 'prompt_cache_miss_tokens': 221}, 'model_provider': 'deepseek', 'model_name': 'deepseek-flash', 'system_fingerprint': 'aeb56401ca74e127821c4f9126dcb669', 'id': 'ae31dbca-d1b6-42e0-add9-e924ac119a4f', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--01a0d7ae-7f7e-75a2-9319-7a88d571fee9-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 349, 'output_tokens': 29, 'total_tokens': 378, 'input_token_details': {'cache_read': 128}, 'output_token_details': {}})]}

原本大模型不具备查询天气的能力,所以无法回答天气问题。但是,当我们提供了一个查询添加的Tool以后,它就能自动查询天气来回答问题,是不是很神奇。

那么,Agent是如何做到的呢?

传统的LLM应用都是一问一答的形式,模型只能根据自己的训练数据来回答,流程非常简单:

而智能体则可以调用工具与外界交互,获取实时信息,工作流程则要复杂很多,是这样的:

流程如下:

  1. 用户提问(Input):杭州今天天气如何?

  2. 模型分析(Reasoning):用户询问杭州天气,我不知道,需要调用查询天气的工具get_weather

  3. 调用工具(Action):调用工具,get_weather,传入城市"杭州"

  4. 分析结果(Observation):工具返回结果,模型分析结果,判断是否足以回答用户问题

    1. 是:整理生成响应结果

    2. 否:重复前面步骤

  5. 生成结果(Output):根据工具的结果生成响应给用户

那么,模型是如何知道工具的信息的呢?

其实,在大模型提供的API接口中,有一个tools参数,描述了工具的详细信息:

所以,LangChain会帮助我们把tool的信息封装为此tool参数,与message一起发送给大模型,大模型就了解tool的详细信息,根据用户需求判断是否需要调用tool,需要调用哪个tool.

那么问题来了,当大模型决定调用某个tool时,该如何调用呢?毕竟,tool是我们定义的,模型是没有调用能力的。

模型确实不能直接调用tool,只能返回字符串。但是它可以把要调用的tool信息、参数信息都以Json格式返回:

这样一来,LangChain就会帮我们解析响应结果中的Function信息,也就是tool信息,就知道了要调用哪个函数,以及参数是什么了。LangChain就会执行该函数,再把得到的结果再次发送给大模型。

具体的工作流程如图:

OK,弄明白了Agent的原理,我们不难发现,Agent中最重要的两个部分,就是:

  • Model:负责推理分析、思考,相当于Agent的大脑

  • Tools:负责执行任务,相当于Agent与外界交互的手脚

当然,Agent中肯定不止这两个部分,接下来,我们就逐一解析Agent创建的各个细节。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐