LLM AI应用开发快速入门

如果你有其他开发经验但不熟悉LLM应用,这篇文章会帮你理解这个领域的基础概念。

传统应用遵循确定性逻辑:输入 → 处理 → 输出。LLM应用引入了概率性推理,模型基于上下文和提示词做决策。这需要新的架构模式。

内容包括:

  • LLM应用的基本架构
  • Function Calling、RAG等能力
  • LangGraph vs Pydantic AI框架对比
  • 技术选型建议

一、LLM应用基本架构

1.1 从传统应用到LLM应用

传统应用:代码定义业务逻辑,数据驱动流程,输出是确定性的。LLM应用不同:

1
2
传统应用: 代码逻辑 → 确定性执行
LLM应用: 提示词 + 上下文 → 概率性推理

需要新的架构模式来管理这种不确定性。

1.2 LLM应用的分层架构

LLM应用通常分为四层:



graph TB
    Input[用户输入] --> Pre[预处理层<br/>提示词构建]
    Pre --> |系统提示词<br/>用户消息<br/>上下文注入| LLM[LLM推理<br/>模型决策]
    LLM --> |理解意图<br/>工具调用决策<br/>生成响应| Post[后处理层<br/>结果验证 & 执行]
    Post --> |结构化输出验证<br/>工具执行<br/>多轮迭代| Output[返回结果]

预处理层:将用户输入转换为模型可理解的提示词,包括系统提示词、用户消息、上下文注入。

LLM推理层:模型基于提示词推理,决定直接回答、调用工具或继续交互。

后处理层:验证输出格式、执行工具调用、决定是否继续对话。

1.3 主要架构模式

RAG(检索增强生成)

LLM的知识是静态的,无法访问私有数据或最新信息。RAG通过在推理时注入相关文档解决这个限制。



graph LR
    A[知识库] --> B[切片]
    B --> C[向量化]
    C --> D[向量数据库]

    E[用户查询] --> F[向量化]
    F --> G[相似检索]
    D --> G
    G --> H[注入提示词]
    H --> I[LLM生成答案]

生产级RAG需要考虑:

  • 切片策略:如何分割文档
  • 向量数据库:Pinecone、Weaviate、pgvector等
  • 检索优化:混合检索、重排序
  • 评估:检索准确率、答案质量

Function Calling(工具调用)

Function Calling让LLM调用外部工具。模型不直接执行函数,而是返回调用指令,应用层执行。



sequenceDiagram
    participant U as 用户
    participant L as LLM
    participant A as 应用层
    participant T as 工具

    U->>L: "帮我查北京的天气"

    Note over L: 传统LLM<br/>可能幻觉
    L-->>U: "今天北京天气晴朗..."

    U->>L: "帮我查北京的天气"
    Note over L: Function Calling

    L->>A: 返回调用指令<br/>{"name": "get_weather", "args": {"city": "北京"}}
    A->>T: 执行 get_weather("北京")
    T-->>A: 返回 {"temp": 25, "condition": "晴"}
    A-->>L: 返回结果
    L-->>U: "根据查询结果,北京今天晴天,气温25°C"

要点:

  • 可靠性:GPT-4/Claude达95%+,开源模型60-75%
  • 并行调用:降低2-3倍延迟
  • 成本:增加15-30% token开销

二、LLM能力详解

2.1 Function Calling / Tool Use

Function Calling的本质:模型作为路由器,将自然语言转换为函数调用。

工作原理

  1. 定义工具:向模型描述工具名称、参数和用途
  2. 模型决策:分析用户意图,决定是否调用工具
  3. 返回调用指令:返回函数名和参数(不执行)
  4. 应用执行:执行函数,返回结果
  5. 生成答案:基于工具结果生成回复

应用场景

场景 示例
数据查询 “查用户123的订单” → 查询数据库
API集成 “发邮件给团队” → 调用邮件API
计算 “算CSV平均值” → 执行Python代码
系统操作 “部署到测试环境” → 调用CI/CD

可靠性

不同模型差异显著:

  • GPT-4 / Claude:95%+准确率
  • 开源模型(Llama 3.1+, Mistral):60-75%

建议:

  1. 使用Pydantic验证参数
  2. 实现重试机制
  3. 提供降级方案

2.2 Structured Output(结构化输出)

强制模型返回符合Schema的JSON数据,适用于数据提取、分类、表单填充等场景。

实现方式:

  • OpenAI:zodResponseFormat + Zod schema
  • Pydantic AI:原生Pydantic模型验证
  • LangGraph:通过工具和状态管理实现

2.3 RAG架构演进

Level 1: Naive RAG

1
2
文档 → 固定切片 → Embedding → 向量库
查询 → Embedding → Top-K检索 → 生成答案

问题:检索质量不稳定,容易遗漏信息。

Level 2: Advanced RAG

  • 查询重写:优化查询,提高检索准确率
  • 混合检索:向量 + BM25关键词
  • 重排序:Cross-Encoder重新排序
  • 多查询:生成多个查询变体

Level 3: Agentic RAG
Agent动态决定检索策略:

  • 分析问题类型,选择数据源
  • 迭代检索,完善答案
  • 自我验证

2.4 多轮对话与状态管理

LLM应用需要管理对话历史和中间状态:



sequenceDiagram
    participant U as 用户
    participant A as Agent

    U->>A: "分析这家公司的财报"
    A->>A: 检索财报
    A-->>U: "找到了腾讯2024年财报..."

    U->>A: "营收增长了多少?"
    Note over A: 需要记住上下文
    A-->>U: 基于财报回答

    U->>A: "和阿里对比呢?"
    Note over A: 需要记住之前的财报
    A->>A: 检索阿里财报
    A-->>U: 对比分析

需要:

  • 会话管理:关联对话历史
  • 状态持久化:跨会话保存信息
  • 上下文窗口管理:压缩或总结历史

三、Agent开发框架对比

开发LLM应用时,需要决定是否使用框架,选择哪个框架。

3.1 为什么需要Agent框架?

直接使用LLM API可行,但会遇到这些问题:

问题 手动实现成本 框架支持
工具调用循环 高 内置
对话历史管理 中 内置
错误处理 高 内置
状态持久化 高 内置
多Agent协作 极高 内置
可观测性 中 内置

框架封装了这些能力,让你聚焦业务逻辑。

3.2 LangGraph vs Pydantic AI

主流Agent框架LangGraph和Pydantic AI,设计哲学不同。

核心能力对比

能力维度 LangGraph Pydantic AI
核心定位 工作流编排平台 类型安全Agent框架
工作流编排 ✅ 核心,显式状态机 🟡 pydantic-graph(基础)
并行执行 ✅ 静态+动态 ❌ 无
条件路由 ✅ 条件edges ❌ 需手动实现
Memory ✅ 短期+长期,多后端 ⚠️ 需集成外部工具
时间旅行 ✅ 重放/分支/调试 ❌ 无
错误处理 ✅ 4层容错 ⚠️ 需手动实现
人机协作 ✅ 原生支持 ❌ 需自行实现
Skill系统 ✅ 官方11个skills ❌ 无官方支持
MCP支持 ✅ 通过适配器 ✅ 原生支持
可视化调试 ✅ LangGraph Studio ❌ 无官方工具
部署选项 ✅ Cloud/Hybrid/Self-hosted ⚠️ 需自行部署
类型安全 ⚠️ TypedDict,无输出验证 ✅ Pydantic原生验证
生态成熟度 ✅ 大型社区,生产验证 🟡 新兴框架

设计哲学差异

LangGraph = 工作流操作系统

设计灵感来自Google Pregel和Apache Beam,用显式图结构编排工作流。

1
2
3
4
5
6
7
LangGraph工作流示例:

[路由器]
├─ 简单问题? → [快速响应]
├─ 需要查询? → [搜索] → [验证]
├─ 需要计算? → [计算器] → [格式化]
└─ 需要审批? → [人工审核] → [执行]

特性:

  • 状态机模型:清晰的节点和边
  • Checkpoint机制:状态持久化,崩溃恢复
  • 循环支持:重试、自纠正
  • 并行执行:fan-out/fan-in
  • 人机协作:暂停等待审批

Pydantic AI = 类型安全Agent SDK

将FastAPI的理念带入AI:类型安全优先。

1
2
3
4
5
6
7
8
9
10
# Pydantic AI示例
class MyAgent(Agent[DatabaseDeps, ResultType]):
@tool
async def query_data(
self,
ctx: RunContext[DatabaseDeps]
) -> Result:
# 编译时类型检查
# 运行时Pydantic验证
...

特性:

  • 编译时类型检查:IDE自动补全
  • 运行时验证:Pydantic验证输入输出
  • 依赖注入:类似FastAPI
  • 代码量少:相同功能约160行 vs LangGraph 280行

适用场景

选择LangGraph:

  • 复杂多步骤工作流
  • 状态持久化和崩溃恢复
  • 人工审批环节
  • 多Agent协作
  • 时间旅行调试
  • 企业级生产环境

选择Pydantic AI:

  • 单Agent应用
  • 类型安全核心需求
  • 团队熟悉Pydantic和FastAPI
  • 快速原型开发
  • 数据质量要求高

3.3 Memory支持

Memory是LLM应用的需求,两个框架支持程度差异显著。

LangGraph Memory架构

LangGraph提供三层Memory:



graph TB
    subgraph M1[1. 短期记忆 Checkpointer]
        A1[线程内对话历史]
        A2[自动保存每个节点后的状态]
        A3[支持: InMemory/SQLite/PostgreSQL]
    end

    subgraph M2[2. 长期记忆 Store]
        B1[跨线程持久化]
        B2[Key-Value存储]
        B3[用户偏好、学习到的知识]
    end

    subgraph M3[3. 上下文管理]
        C1[自动压缩历史对话]
        C2[控制token使用]
    end

效果:

1
2
3
4
5
6
用户A (第1次对话): "我是产品经理"
→ LangGraph自动保存到长期记忆

用户A (第50次对话): "推荐一些工具"
→ Agent从长期记忆读取用户职业
→ 推荐产品经理相关工具

Pydantic AI Memory现状

Pydantic AI提供基础的message_history,但仅限于单次会话。要实现跨会话记忆,需要:

  1. 集成外部工具:Mem0、MongoDB等
  2. 自行设计memory schema
  3. 实现记忆读写逻辑

开发成本和维护负担更高。

3.4 Skill系统

Skill系统决定了Agent能力的可扩展性。

LangGraph Skills

LangGraph提供官方Skill生态系统,包含11个预构建skills:

Skill类别 Skills
LangChain fundamentals, middleware, RAG
LangGraph fundamentals, persistence, human-in-the-loop
Deep Agents core, memory, orchestration

工作原理:

1
2
3
4
5
6
7
8
9
10
11
12
传统方式:
提示词 = 系统指令 + 所有工具说明 + 所有知识
→ Token浪费,性能下降

Skill方式 (Progressive Disclosure):
1. Agent看到技能目录 (轻量级,约500 tokens)
2. 按需加载详细技能文档
3. 动态执行

效果:
• 性能提升: 25% → 95%
• Token节省: 60-70%

Skill动态加载,不会一次性塞满系统提示词。

Pydantic AI现状

Pydantic AI没有官方Skill系统,需要开发者自行设计存储、加载、发现机制。

3.5 生产级能力对比

时间旅行调试

LangGraph提供时间旅行功能,基于checkpoint机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
应用场景:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 生产调试:
用户报告第8步失败
→ 加载第7步checkpoint
→ 检查状态
→ 从第7步重新执行
→ 无需重跑1-7步

2. What-If分析:
原始执行失败
→ 修改工具返回值
→ 从失败点分支继续
→ 探索不同路径

3. 审计和回溯:
可视化每一步的状态
→ 定位问题根源

Pydantic AI无此功能,需要开发者自己实现状态追踪。

错误处理

LangGraph提供4层容错机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Layer 1: Retry Policies
API返回503?
→ 自动重试3次
→ 指数退避 (1s → 4s → 10s)
→ 成功率: 90%

Layer 2: Fallback Edges
工具A失败?
→ 条件路由到工具B
→ 降级策略

Layer 3: Error Classification
分类错误:
• 暂时性错误 → 重试
• LLM可恢复 → 换个提示词
• 需要人工 → human-in-the-loop

Layer 4: Checkpoint Recovery
进程崩溃?
→ 从最后checkpoint恢复
→ 不丢失进度

Pydantic AI需要开发者手动实现这些容错逻辑。

部署选项

LangGraph (LangSmith Deployment) 提供3种部署模式:

  1. Cloud:完全托管,git push即部署
  2. Hybrid:运行在你的云上,LangSmith控制平面管理
  3. Self-hosted:完全自托管,Kubernetes部署

所有模式都支持自动扩缩容、状态持久化、人机协作API、版本管理。

Pydantic AI需要开发者自己搭建部署方案,选择基础设施,实现扩容和监控。

可视化调试

LangGraph Studio提供可视化IDE:实时可视化执行流程、点击节点查看状态、编辑中间状态、从任意节点重放、查看token消耗、性能分析。

Pydantic AI无官方可视化工具,需要依赖第三方或自己搭建。

四、企业级应用:为什么推荐LangGraph

4.1 复杂工作流

企业级应用往往涉及:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
多步骤任务:
用户请求 → 意图识别 → 数据检索 → 分析计算 → 结果验证 → 人工审批 → 执行

失败处理:
步骤5验证失败?
→ 重试3次
→ 仍失败?
→ 降级方案
→ 记录日志
→ 通知人工

长时间运行:
任务可能持续数小时甚至数天
→ 需要checkpoint机制
→ 支持崩溃恢复

LangGraph的设计为这些场景而生:显式状态机、checkpoint持久化、条件路由、循环重试。

4.2 Memory需求

企业级应用需要跨会话记忆:

1
2
3
4
5
6
7
8
9
10
11
12
13
客服机器人:
第1次对话: 用户反映产品问题
第3次对话: 询问问题解决进度
→ 需要记住第1次的上下文

研究助手:
第1次对话: "分析腾讯财报"
第5次对话: "和阿里对比"
→ 需要记住之前分析的财报

个性化推荐:
长期记忆用户的偏好、职业、兴趣
→ 提供个性化服务

LangGraph内置Memory支持。Pydantic AI需要大量开发工作。

4.3 生产可靠性

企业级应用对可靠性要求高:

需求 LangGraph支持 自建成本
状态持久化 ✅ 多后端支持 中
崩溃恢复 ✅ Checkpoint机制 高
人机协作 ✅ 原生支持 中
错误处理 ✅ 4层容错 高
可观测性 ✅ LangSmith集成 中
部署扩容 ✅ LangSmith Deployment 高

使用LangGraph,这些能力开箱即用。使用Pydantic AI,需要投入开发资源。

4.4 实际案例

LangGraph已被多家大公司采用:

  • Klarna:客服助手,每日处理百万级对话,多步骤意图识别,集成多个后端系统
  • Uber:复杂工作流编排
  • LinkedIn:多Agent协作场景
  • GitLab:AI辅助开发工具

这些案例验证了LangGraph在生产环境的可靠性。

4.5 开发效率对比

假设要构建一个需要以下能力的Agent应用:

能力 LangGraph Pydantic AI + 自建
工作流编排 内置,1天 需开发,3-5天
Memory 内置,0.5天 需集成,2-3天
错误处理 内置,0.5天 需开发,2-3天
人机协作 内置,0.5天 需开发,1-2天
可观测性 内置,0.5天 需集成,1-2天
总计 3天 9-15天

使用LangGraph,开发效率提升3-5倍。

4.6 何时选择Pydantic AI

LangGraph在企业级场景优势明显,但Pydantic AI在以下场景更合适:

  • 单Agent应用:无需复杂编排
  • 类型安全核心需求:数据验证至关重要
  • 团队Pydantic经验:已有Pydantic/FastAPI经验
  • 快速原型:快速验证想法

例如:

  • 数据提取API:从文本中提取结构化数据
  • 内容分类服务:将文章分类到预定义类别
  • 表单填充助手:解析用户描述,生成结构化表单

这些场景不需要复杂工作流,Pydantic AI的类型安全优势更突出。

五、总结与建议

5.1 决策框架

选择Agent框架时,问自己这些问题:



graph TD
    Start[开始选择] --> Q1{应用复杂度?}
    Q1 -->|单Agent,简单流程| A1[Pydantic AI]
    Q1 -->|多步骤,复杂工作流| A2[LangGraph]

    A1 --> Q2{是否需要Memory?}
    A2 --> Q2

    Q2 -->|仅会话内记忆| A3[Pydantic AI够用]
    Q2 -->|跨会话长期记忆| A4[LangGraph]

    A3 --> Q3{是否需要人工审批?}
    A4 --> Q3

    Q3 -->|不需要| A5[Pydantic AI]
    Q3 -->|需要| A6[LangGraph]

    A5 --> Q4{是否需要多Agent协作?}
    A6 --> Q4

    Q4 -->|不需要| A7[Pydantic AI]
    Q4 -->|需要| A8[LangGraph]

    A7 --> Q5{生产环境要求?}
    A8 --> Q5

    Q5 -->|快速原型,容忍故障| A9[Pydantic AI]
    Q5 -->|企业级,高可靠性| A10[LangGraph]

5.2 学习路径

新手:

  1. 先用原生LLM API实现简单聊天机器人
  2. 理解Function Calling
  3. 尝试实现RAG(使用Pinecone或pgvector)
  4. 根据项目需求选择框架

有经验开发者:

  1. 直接上手LangGraph或Pydantic AI
  2. 构建中等复杂度的Agent应用
  3. 深入理解状态管理和错误处理
  4. 探索高级特性(时间旅行、并行执行等)

5.3 实战建议

不要过度设计

很多LLM应用不需要复杂的Agent框架。如果只是简单的问答或内容生成,直接调用API可能更合适。

从简单开始

先用最简单的方式实现功能,验证价值后再引入框架。过早使用框架可能增加不必要的复杂度。

重视可观测性

LLM应用的黑盒特性使得调试困难。从一开始就集成追踪工具(LangSmith、Langfuse等),记录每次LLM调用和工具执行。

测试驱动

LLM输出的不确定性要求更严格的测试:

  • 单元测试:测试各个工具函数
  • 集成测试:测试完整工作流
  • 回归测试:确保修改后输出质量不下降
  • A/B测试:比较不同提示词的效果

5.4 未来展望

LLM应用开发还在快速演进:

  • 模型能力提升:更可靠的Function Calling,更长的上下文窗口
  • 框架成熟:更多生产级能力内置
  • 标准化:MCP等协议标准化工具集成
  • 多模态:图像、音频、视频处理能力

保持学习,关注最新进展,但不要追逐每个新框架。理解核心原理比掌握具体工具更重要。

结语

LLM应用开发正在改变软件的构建方式。选择合适的框架是成功的一步。

没有最好的框架,只有最适合的框架。根据项目需求、团队能力和业务目标做出选择。

希望这篇文章能帮你快速入门LLM应用开发。有问题欢迎留言讨论。