【自学Agent开发之路】第二篇—从.NET到Python:Agent开发的本质就是投喂上下文

引言:一个 .NET 老兵的困惑

写这篇文章之前,我先说结论,因为我不想让读者猜:AI Agent 开发的本质,就是用工程化编码去约束和组装上下文,然后投喂给大模型,让模型在这个上下文范围内规范地输出行为。 就这么简单。

我是一名从业五年的 .NET 后端开发,两个月前开始转型做 AI Agent。刚接触的时候,我被铺天盖地的术语吓到了------LangChain、LangGraph、RAG、向量数据库、Embedding、Function Calling、Prompt Engineering、上下文工程......每个名词都像是一座山。但当我真正动手写代码、拆框架源码、读 Anthropic 和 LangChain 官方文档之后,我发现了一个被行业刻意模糊的事实:Agent 开发的核心机制极其简单,复杂度在于工程化落地,而不在于概念本身。

这篇文章会用数据、源码和权威文献来论证这个结论,同时回答一个 .NET 开发者最关心的问题:转到 Python 技术栈做 Agent,到底有多难?


一、权威定义怎么说:Agent 的本质是"LLM + 工具 + 循环"

在动手之前,我先做了一件事:去读官方定义。不是二手博客,不是培训机构的营销文,是 Anthropic(Claude 的开发公司)和 LangChain(最流行的 Agent 框架)的官方技术文档。

Anthropic 在《Building Effective Agents》一文中直接写道:

"Agents can handle sophisticated tasks, but their implementation is often straightforward. They are typically just LLMs using tools based on environmental feedback in a loop."

(Agent 能处理复杂任务,但实现通常很直接。本质上就是 LLM 根据环境反馈在循环中使用工具。)

注意用词------"often straightforward"(通常很直接)。Anthropic 自己都不觉得 Agent 的核心循环复杂。他们给出的 Agent 循环是这样的:接收任务 → 模型规划并调用工具 → 从环境获取结果 → 评估进度 → 继续或结束。如果遇到阻塞,暂停等待人类反馈。加上一个最大迭代次数作为停止条件。整个核心循环用伪代码写出来不超过 20 行。

LangChain 的 CEO Harrison Chase 的定义更精炼:

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

(AI Agent 就是一个用 LLM 来决定应用程序控制流的系统。)

他进一步解释,系统越"Agentic",意味着 LLM 对系统行为的控制权越大。从最简单的路由器(LLM 决定把请求分发到哪个下游流程),到最复杂的自主 Agent(LLM 自己创建工具、记住工具、在后续步骤中复用工具),这是一个连续的光谱。

把这两段定义翻译成后端开发者的语言:Agent 就是一个用自然语言写的业务规则引擎,只不过规则的执行者从 if-else 换成了大模型,规则的输入从硬编码参数换成了上下文。


二、拆解 LangChain 源码:核心循环只有 20 行

光看定义不够,我直接去读了 LangChain 和 LangGraph 的源码。因为我需要用代码来验证------Agent 框架到底在做什么?

LangChain 的 create_agent() 函数(位于 langchain/agents/factory.py)是构建 Agent 的入口。它做的事情本质上是:

第一步:组装消息列表。 把 System Prompt(系统指令)、对话历史、工具返回结果拼成一个消息数组,发给大模型。这就是所谓的"上下文投喂"。

第二步:调用大模型 API。 通过 BaseChatModel.invoke().ainvoke() 发送 HTTP 请求到 OpenAI、Anthropic、智谱等服务商。模型返回的不是普通文本,而是一组 tool_calls------告诉框架"我要调用哪个工具,传什么参数"。

第三步:执行工具。 LangGraph 的 ToolNode 接收这些工具调用,并行执行 对应的 Python 函数,把结果包装成 ToolMessage 放回消息列表。

第四步:循环。 把工具结果追加到消息列表,回到第一步,再次发给模型。模型看到工具结果后决定是继续调工具还是直接回复用户。

这就是 Agent 的全部。 四步循环,核心逻辑不超过 20 行 Python。

那剩下的代码在干什么?我统计了一下 LangGraph 的源码------大约 10,000+ 行代码,做的事情是:

  • 状态管理 :用 TypedDict 定义共享状态,用 Channel 机制(LastValueBinaryOperatorAggregateEphemeralValue)管理数据流的合并和覆盖。
  • 图引擎Pregel 执行引擎(命名来自 Google 的 Pregel 图处理系统)负责按拓扑顺序执行节点、处理条件分支、管理循环终止。
  • 中间件管道 :14 个中间件模块,包括工具重试(tool_retry.py)、模型降级(model_fallback.py)、人工介入(human_in_the_loop.py)、上下文编辑(context_editing.py)、对话摘要压缩(summarization.py)、PII 脱敏(pii.py)。
  • 检查点:暂停和恢复 Agent 执行的能力,支持长任务中断后继续。
  • 可观测性:与 LangSmith 的集成,追踪每一步的输入输出和耗时。

用 .NET 开发者熟悉的话说:Agent 的核心循环就像 Main() 方法里的 while 循环;LangChain/LangGraph 的 10,000 行代码就像 ASP.NET Core 的中间件管道、依赖注入容器、日志框架、异常处理过滤器------你写业务逻辑用不到 1% 的框架代码,但框架帮你处理了 99% 的边缘情况。

这就是为什么我说 Agent 开发的本质是"投喂上下文"------核心循环就是组装上下文、调 API、拿到结果、继续组装。但"工程化"的部分------并发控制、错误处理、状态管理、可观测性------才是一个有经验的后端开发者真正的价值所在。


三、.NET 到 Python:技术栈迁移到底有多难?

如果 Agent 的核心机制这么简单,那技术栈迁移的难度就成了关键问题。一个写了五年 C# 的后端开发者,转到 Python + LangChain 技术栈,需要多长时间?

我用自己的经历来回答:两周能写代码,一个月能独立搭项目,两个月能做工程化落地。

这不是因为我聪明,而是因为后端开发的核心能力------架构设计、数据库操作、API 设计、并发控制、错误处理------这些在 Python 世界里完全通用。变的只是语法,不变的是思维方式。

以下是一张 .NET 和 Python 技术栈的对照表,这是我在搭建 ShopAgent 项目过程中实际使用的映射关系:

.NET 生态 Python 生态 功能对照
ASP.NET Core FastAPI Web 框架,路由、中间件、依赖注入
Entity Framework / EF Core SQLAlchemy ORM,数据库映射和查询
SQL Server MySQL / PostgreSQL 关系型数据库
IDistributedCache (Redis) redis-py 缓存和会话存储
Swagger / OpenAPI FastAPI 自动生成 API 文档
NuGet pip / pyproject.toml 包管理
async/await async/await(语法几乎一样) 异步编程
LINQ 列表推导式 + filter/map 集合操作
依赖注入容器 FastAPI 的 Depends() 依赖注入
Model Validation Pydantic v2 数据校验和序列化
SignalR SSE / WebSocket 实时推送
Middleware Pipeline LangGraph 的 StateGraph 请求处理管道

你会发现,几乎没有一个 .NET 概念在 Python 里找不到对应物 。async/await 的写法几乎一模一样;FastAPI 的依赖注入用 Depends() 就像 ASP.NET Core 的 [FromServices];Pydantic 的数据校验和 Data Annotation 异曲同工。

最大的差异在语法层面:Python 用缩进而不是花括号定义代码块,没有显式的类型声明(但可以用 Type Hints),变量命名用下划线而不是驼峰。这些差异对于一个写了五年代码的人来说,一周之内就能适应。

真正需要学习的新东西是 AI 领域特有的概念:Embedding(文本转向量)、向量数据库(Milvus/Qdrant)、Prompt 设计、工具定义(@tool 装饰器)。但正如前面分析的,这些概念的实现复杂度远低于它们的名字给人的印象------Embedding 就是调一个 API 把文本变成数字数组,向量数据库就是存数字数组的数据库,Prompt 设计就是写一段结构化的自然语言指令。


四、用代码证明:RAG 和 Agent 的核心逻辑有多简单

空口无凭,我用实际代码来展示 Agent 开发中最核心的两个能力------RAG 检索和工具调用------到底有多简单。

RAG 检索的核心逻辑(简化版):

python 复制代码
# 1. 把文档切成小段,转成向量存到数据库
for doc in documents:
    chunks = split_text(doc, chunk_size=500, overlap=50)
    for chunk in chunks:
        vector = embedding_model.encode(chunk)  # 调 API 转成向量
        milvus.insert(collection="products", vector=vector, text=chunk)

# 2. 用户提问时,先检索再拼入 prompt
query_vector = embedding_model.encode(user_question)
relevant_chunks = milvus.search(collection="products", vector=query_vector, top_k=5)
context = "\n".join(relevant_chunks)

prompt = f"根据以下资料回答用户问题:\n{context}\n\n用户问题:{user_question}"
answer = llm.invoke(prompt)

核心逻辑?10 行代码。 切片、转向量、存库、检索、拼 Prompt、调模型。剩下的 chunk 策略优化、embedding 模型选择、检索结果重排序、相关性阈值------这些是"调优",不是"核心"。

工具调用的核心逻辑(简化版):

python 复制代码
# 定义一个工具
@tool
def search_products(query: str) -> str:
    """根据关键词搜索商品"""
    results = product_db.search(query)
    return json.dumps(results, ensure_ascii=False)

# 让模型决定是否调用工具
tools = [search_products]
response = llm.invoke(messages, tools=tools)

# 如果模型决定调用工具
if response.tool_calls:
    for tool_call in response.tool_calls:
        result = execute_tool(tool_call)  # 执行对应的 Python 函数
        messages.append(ToolMessage(content=result))
    # 带着工具结果再次调用模型
    final_response = llm.invoke(messages)

核心逻辑?还是 10 行代码。 告诉模型有哪些工具,模型决定调哪个,执行工具,把结果喂回去,再让模型组织回复。LangChain 的 @tool 装饰器做的事情就是帮你把 Python 函数的签名和文档字符串转成 JSON Schema 发给模型------本质上就是一个自动化的接口文档生成器

这就是为什么我认为"投喂上下文"是对 Agent 开发最精确的概括------不管你的 Agent 有多复杂,最终都是在做同一件事:组装上下文 → 发给模型 → 拿到输出 → 执行动作 → 组装新的上下文 → 循环。


五、那 10,000 行框架代码在干什么?工程化的真正价值

如果核心逻辑只有 20 行,为什么企业愿意给 Agent 开发者开 2-5 万月薪?为什么这个岗位供不应比达到 1:7.5?

答案在于:从 demo 到生产级,差的不是核心逻辑,而是工程化基础设施。

Anthropic 在同一篇文档中强调了三个原则:保持简洁、优先透明性、精心设计工具接口。他们特别指出,在构建 SWE-bench 编码 Agent 时,"我们花在优化工具上的时间比花在整体 Prompt 上的时间还多"。 这说明什么?说明 Agent 的难点不在于"怎么调 API",而在于"怎么设计让模型能正确使用的工具"。

用后端开发者的经验来类比:

demo 级别的 Agent: 用户问一句话,模型回复一句。就像一个只写了 Hello World 的 Web API。

能用级别的 Agent: 能调工具、能查数据库、能多轮对话。就像一个能跑 CRUD 的 Web API。

生产级别的 Agent: 并发控制(多用户同时对话怎么排队)、错误处理(模型超时怎么办、API 挂了怎么办)、降级策略(主模型挂了自动切换备用模型)、可观测性(每一步的输入输出和耗时可追踪)、评测体系(量化检索准确率和生成质量)、上下文窗口管理(长对话的摘要压缩和滑动窗口)、安全过滤(敏感信息脱敏、输出内容校验)。

这就是 10,000 行框架代码做的事情,也是企业真正愿意付钱的能力。

对于有五年后端经验的开发者来说,这些东西并不陌生------并发控制、错误处理、降级策略、日志追踪、限流、数据校验------这些在微服务架构里每天都在做的事情,换到 Agent 领域只是换了个名字和实现方式。这就是后端开发者转型 Agent 开发的真正优势:不是"会调 LLM API"(这个谁都能一周学会),而是"能让一个 AI 系统在真实业务里稳定跑起来"。


六、市场数据验证:窗口期真实存在

理论分析完了,用数据说话。

根据 2026 年春招数据和行业报告:

  • 岗位需求增长 :Agent 工程师岗位需求同比增长 310%,全国仅 6-8 万人具备相关经验,其中资深人才不足 1.5 万。
  • 供需比:AI 研发岗供需比约 1:7(7 个岗位抢 1 个人),Agent 岗位的供需比更高。
  • 薪资区间:入门 Agent 开发(能调 API、搭 RAG)20-30K/月;中级(多 Agent 编排、工程化落地)30-50K/月;高级架构(多模型路由、Agent Runtime、容错降级)50-70K+/月。
  • 学历门槛:与算法研究岗不同,Agent 应用开发岗更看重落地能力。知乎上有多个案例显示双非本科甚至大专背景的开发者拿到了 20K+ 的 Agent 岗位 offer,核心竞争力是"能干活、能交付、能解决真实问题"。

这意味着什么?意味着一个有五年后端经验的 .NET 开发者,花一到两个月搭建一个完整的 Agent 项目(RAG + 多 Agent 协作 + 工程化落地),在当前市场环境下是有真实竞争力的。不是因为 Agent 技术有多难,而是因为这个岗位去年才出现,有经验的人太少了。

但窗口期不会永远存在。随着工具链成熟、教程泛滥、更多开发者涌入,稀缺性溢价会逐渐消退。就像 2014 年的移动端开发、2017 年的小程序开发------初期技术栈不复杂,但会的人少,所以溢价高。一到两年后,30K 的 Agent 岗可能会变成 20K。


七、结论:简单不等于容易,但简单意味着可学

回到开头的结论:AI Agent 开发的本质,就是用工程化编码去约束和组装上下文,然后投喂给大模型,让模型在这个上下文范围内规范地输出行为。

Anthropic 用"often straightforward"(通常很直接)来形容 Agent 的实现。LangChain 的 CEO 用一句话定义 Agent------"用 LLM 决定应用控制流的系统"。我拆解了 LangChain 的源码,核心循环确实只有 20 行左右。我把 .NET 和 Python 的技术栈做了全量对照,发现几乎没有一个概念找不到对应物。

但这不意味着"容易"。简单的是核心机制,复杂的是工程化落地。一个能在 demo 里跑通的 Agent 和一个能在生产环境稳定运行的 Agent,差距是十倍的工作量------并发控制、错误处理、降级策略、可观测性、评测体系、安全过滤。这些东西对于有经验的后端开发者来说并不陌生,只是换了个技术栈和业务场景。

对于正在考虑转型的 .NET 后端开发者,我的建议是:不要被术语吓到,不要被培训营销忽悠,直接动手写代码。 你的五年后端经验是你最大的资产------你会设计架构、你会处理并发、你会做错误处理、你会写测试、你会部署运维。这些能力在 Agent 领域不是"加分项",而是"必需品"。

Agent 开发的核心是"投喂上下文",工程化是后端开发者的主场。窗口期就在眼前,上不上车,自己决定。


本文基于 Anthropic《Building Effective Agents》、LangChain 官方文档、LangGraph 源码分析以及 2026 年春招市场数据撰写。作者是一名从 .NET 转型 Agent 开发的五年后端工程师,文中代码示例均来自实际项目实践。

相关推荐
牵牛花主人1 小时前
【无标题】
python·pandas
abcy0712131 小时前
sqlalchemy 原生sql判断条件是否为空,为空则跳过
开发语言·python
知识分享小能手1 小时前
数据预处理入门学习教程,从入门到精通, 实战演练——数据分析师岗位分析知识点详解(8)
python·学习·信息可视化
Wonderful U1 小时前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django
yuhuofei20211 小时前
【Python入门】Python中的集合set
python
大雨淅淅1 小时前
【机器人】ROS2 机械臂控制(MoveIt2)从入门到实战
人工智能·python·神经网络·学习·算法·机器学习·机器人
张哈大2 小时前
MCP:重塑AI工具调用的统一标准,告别重复造轮子的时代
人工智能·python·ai·prompt
极光代码工作室2 小时前
基于深度学习的智能图像识别平台
python·深度学习·机器学习·ai·系统设计
copyer_xyf2 小时前
Python 文件基本操作
前端·后端·python