尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI Agent开发实战:从LangGraph、RAG到工程化部署的求职学习路线

AI Agent开发实战:从LangGraph、RAG到工程化部署的求职学习路线 最近在后台收到不少同学的私信尤其是来自双非院校或想转行的朋友普遍焦虑一个问题现在AI Agent这么火到底要学到什么程度才能找到一份相关的工作网上的资料要么是零散的概念科普要么是顶会论文复现对于想快速入行、构建求职竞争力的同学来说缺乏一条清晰、可执行、能落地的学习路径。本文将为你拆解一条从零到一的Agent开发实战学习路线。我们不谈空泛的理论而是聚焦于企业招聘时实际考察的技术栈和项目经验涵盖从核心概念LangGraph、RAG、到工程化部署私有化再到性能调优与对齐的完整闭环。无论你是学生还是希望转型的开发者跟着这条路线扎实学习都能构建出能写进简历的硬核项目。1. Agent开发全景与求职能力地图在盲目学习之前我们必须先搞清楚企业招聘AI Agent方向的工程师到底在考察什么这决定了我们学习的深度和广度。AI Agent智能体是什么你可以把它理解为一个能感知环境、自主决策、执行动作并达成目标的智能程序。它不同于简单的聊天机器人核心在于其自主性和目标导向性。一个典型的Agent系统通常包含以下模块规划模块拆解目标制定步骤Think。记忆模块保存对话、知识、执行历史Remember。工具使用模块调用API、查询数据库、执行代码Act。学习模块从结果中反思并优化策略Learn。当前市场上的岗位主要分为两大方向Agent应用开发工程师侧重使用现有框架如LangChain, LangGraph快速构建业务Agent要求对框架熟、工程落地能力强。Agent核心算法/框架工程师侧重研究Agent架构、规划算法、记忆机制等要求算法功底深通常门槛更高。对于大多数希望入行的同学第一条路是更现实的选择。我们的学习路线也将围绕“应用开发”展开目标是让你能独立完成一个功能完整、可部署的Agent系统。求职能力模型拆解基础能力Python熟练数据结构与算法面向对象编程基础软件工程知识。核心框架深入掌握至少一个主流Agent框架如LangGraph理解其设计理念和核心组件。关键技术栈必须掌握RAG检索增强生成技术这是让Agent拥有“专业知识”的关键。工程化能力Docker容器化、私有化部署、API服务化、日志监控。这是从“玩具”到“项目”的关键一跃。进阶能力Prompt工程与调优、Agent评估与对齐、简单的工作流编排。这能极大提升你的面试竞争力。下面我们就沿着“基础 → 核心 → 工程 → 进阶”这条主线展开具体的学习内容。2. 第一阶段夯实Python与AI基础无论框架如何变化扎实的编程基础是的地基。这一阶段的目标是能流畅地编写、调试Python程序并对现代AI应用开发有基本认知。2.1 Python编程核心不要停留在“会用”要追求“理解”。重点学习面向对象编程OOPAgent开发中Tool、Memory、Chain等都是以类的形式存在。深刻理解类、对象、继承、多态。异步编程asyncio现代Agent框架大量使用异步来提高I/O效率如并发调用多个工具。必须掌握async/await。装饰器与上下文管理器框架中随处可见用于注册工具、管理资源。常用内置库json,logging,pathlib,typing类型注解非常重要。实战练习用面向对象思想设计一个简单的“计算器工具CalculatorTool类”它能够被一个模拟的Agent框架调用。# 示例一个简单的工具类抽象 from typing import Any, Dict from abc import ABC, abstractmethod class BaseTool(ABC): 工具基类 name: str description: str abstractmethod def _run(self, *args, **kwargs) - Any: 工具的执行逻辑 pass def run(self, *args, **kwargs) - Dict[str, Any]: 对外暴露的run方法可加入日志、异常处理等通用逻辑 try: result self._run(*args, **kwargs) return {success: True, result: result} except Exception as e: return {success: False, error: str(e)} class CalculatorTool(BaseTool): 一个简单的计算器工具 name calculator description Performs basic arithmetic operations. Input: a mathematical expression string. def _run(self, expression: str) - float: # 警告实际项目中切勿使用eval此处仅为演示 # 应使用更安全的表达式解析库如 asteval return eval(expression) # 使用示例 if __name__ __main__: tool CalculatorTool() print(tool.run(3 5 * 2)) # 输出: {success: True, result: 13.0} print(tool.run(10 / 0)) # 输出: {success: False, error: division by zero}2.2 AI应用开发入门大模型API调用熟悉OpenAI API或国内如文心、通义千问的API的调用方式。重点掌握Chat Completion格式。环境管理与依赖隔离必须会用conda或venv创建独立的Python环境。项目依赖必须记录在requirements.txt中。基础概念了解Token、Temperature、Top-p等核心参数的含义。实战练习编写一个函数调用大模型API完成一次简单的对话并妥善处理网络异常和API限流。import os from openai import OpenAI from tenacity import retry, stop_after_attempt, wait_exponential # 使用tenacity实现重试机制这是生产级代码的常见做法 retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def chat_with_llm(client: OpenAI, messages: list, model: str gpt-3.5-turbo): 带重试机制的大模型调用 try: response client.chat.completions.create( modelmodel, messagesmessages, temperature0.7, max_tokens500, ) return response.choices[0].message.content except Exception as e: # 这里可以更精细地分类异常如认证错误、额度不足等 print(fAPI调用失败: {e}) raise # 重新抛出异常让tenacity捕获并重试 if __name__ __main__: # 从环境变量读取API Key保证安全 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) messages [{role: user, content: 请用Python写一个Hello World程序。}] try: answer chat_with_llm(client, messages) print(模型回复, answer) except Exception as e: print(f所有重试均失败: {e})3. 第二阶段深入Agent核心框架以LangGraph为例掌握一个主流框架是找工作的“敲门砖”。LangChain曾是首选但LangGraph因其更清晰的状态机模型和可视化支持正成为构建复杂Agent的新宠。建议重点学习LangGraph。3.1 LangGraph核心概念State状态一个贯穿整个工作流的共享数据结构通常是一个TypedDict。它记录了Agent运行过程中的所有信息如用户输入、模型回复、工具调用结果。Node节点代表一个执行步骤的函数。它读取State执行逻辑如调用LLM、运行工具并更新State。Edge边决定工作流走向的条件。通常根据State中的某个字段值决定下一个执行哪个Node。Graph图由Nodes和Edges组成的工作流蓝图。3.2 构建你的第一个Agent工作流我们来构建一个具有“思考-行动”循环的简单Agent它可以使用搜索工具和计算器工具。步骤1定义状态和工具from typing import TypedDict, Annotated, List from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain_community.tools import DuckDuckGoSearchRun from langchain_core.tools import tool import operator # 1. 定义状态结构 class AgentState(TypedDict): question: str # 用户问题 scratchpad: List[str] # 思考过程记录 answer: str # 最终答案 # 2. 定义工具这里使用LangChain社区工具和自定义工具 search DuckDuckGoSearchRun() tool def calculator(expression: str) - str: 计算数学表达式。使用安全的ast.literal_eval。 import ast try: result ast.literal_eval(expression) return str(result) except Exception as e: return f计算错误: {e} tools [search, calculator] llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 将工具绑定给LLM让其知道可以调用什么 llm_with_tools llm.bind_tools(tools)步骤2创建节点Nodesfrom langchain_core.messages import HumanMessage, AIMessage, ToolMessage import json def agent_node(state: AgentState): Agent节点分析问题决定是回答还是调用工具 messages [ HumanMessage(contentstate[question]), AIMessage(content, additional_kwargs{tool_calls: []}) # 初始化 ] # 调用LLMLLM可能会返回工具调用请求 ai_msg llm_with_tools.invoke(messages) # 初始化新的思考记录 new_scratchpad state.get(scratchpad, []) [ai_msg.content] # 准备返回的新状态 new_state {scratchpad: new_scratchpad} # 如果LLM决定调用工具 if hasattr(ai_msg, tool_calls) and ai_msg.tool_calls: # 记录工具调用信息到状态中供下一个节点使用 new_state[tool_calls] ai_msg.tool_calls # 下一个节点应该是“执行工具” return new_state else: # LLM直接给出了答案 new_state[answer] ai_msg.content new_state[tool_calls] None return new_state def tool_node(state: AgentState): 工具执行节点运行Agent请求的工具 tool_calls state[tool_calls] results [] for tc in tool_calls: tool_name tc[name] args json.loads(tc[args]) # 根据工具名找到对应的工具函数并执行 if tool_name DuckDuckGoSearchRun: result search.run(args.get(query, )) elif tool_name calculator: result calculator.invoke(args.get(expression, )) else: result f未知工具: {tool_name} results.append(result) # 将工具执行结果添加到思考记录中 new_scratchpad state[scratchpad] [f工具执行结果: {results}] return {scratchpad: new_scratchpad, tool_results: results}步骤3组装工作流Graph并设置路由# 创建图 workflow StateGraph(AgentState) # 添加节点 workflow.add_node(agent, agent_node) workflow.add_node(tools, tool_node) # 设置入口 workflow.set_entry_point(agent) # 设置边路由逻辑 def route_after_agent(state: AgentState): 根据Agent节点的输出决定下一步 if state.get(tool_calls): return tools # 有工具调用去执行工具 else: return END # 没有工具调用直接结束 def route_after_tools(state: AgentState): 工具执行完后总是回到Agent节点进行下一步思考 return agent workflow.add_conditional_edges( agent, route_after_agent, {tools: tools, END: END} ) workflow.add_edge(tools, agent) # 编译图 app workflow.compile() # 可视化需要安装pygraphviz try: from IPython.display import Image, display display(Image(app.get_graph().draw_mermaid_png())) except: print(可视化依赖未安装但图已构建成功。)步骤4运行与测试# 初始化状态 initial_state: AgentState { question: 2024年奥运会举办城市的当前天气怎么样然后用摄氏度转华氏度的公式计算85华氏度是多少摄氏度。, scratchpad: [], answer: } # 运行工作流 final_state app.invoke(initial_state, config{recursion_limit: 10}) print(最终答案, final_state.get(answer, 未生成答案)) print(思考过程, final_state.get(scratchpad))通过这个实战你不仅学会了LangGraph的基本用法更重要的是理解了Agent“思考-行动”循环的代码级实现。这是面试中展示你理解深度的绝佳素材。4. 第三阶段掌握RAG检索增强生成技术一个没有知识的Agent是“无知”的。RAG技术让Agent能够从专属知识库如公司文档、产品手册中检索信息来回答问题这是企业级Agent的刚需。4.1 RAG核心流程与组件一个标准的RAG系统包含以下步骤文档加载与切分从PDF、Word、网页等源加载文本并按语义切分成片段Chunks。向量化与存储将文本片段转换为向量Embedding存入向量数据库。检索将用户问题也转换为向量在数据库中查找最相似的文本片段。增强生成将检索到的片段作为上下文连同问题一起提交给LLM生成答案。4.2 构建一个本地知识库问答Agent我们将使用Chroma轻量级向量数据库和LangChain的文档处理工具链来构建。环境准备# requirements.txt 关键依赖 langchain langchain-openai langchain-community chromadb sentence-transformers # 用于本地embedding模型 pypdf # 用于读取PDF unstructured # 解析多种文档格式完整代码示例import os from langchain_community.document_loaders import PyPDFLoader, TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, END from typing import TypedDict, List # --- 第1步知识库构建持久化只需运行一次--- def build_knowledge_base(pdf_path: str, persist_directory: str ./chroma_db): 从PDF构建向量知识库 # 1. 加载文档 loader PyPDFLoader(pdf_path) documents loader.load() # 2. 切分文档 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个片段大小 chunk_overlap50, # 片段间重叠避免语义割裂 separators[\n\n, \n, 。, , , , , , ] ) splits text_splitter.split_documents(documents) print(f原始页数{len(documents)} 切分后片段数{len(splits)}) # 3. 使用本地Embedding模型避免调用API节省成本且可离线 embedding_model HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, # 优秀的中文模型 model_kwargs{device: cpu}, # 使用GPU可改为 cuda encode_kwargs{normalize_embeddings: True} ) # 4. 存入向量数据库 vectordb Chroma.from_documents( documentssplits, embeddingembedding_model, persist_directorypersist_directory ) vectordb.persist() print(f知识库已构建并保存至{persist_directory}) return vectordb # --- 第2步定义RAG增强的Agent状态和节点--- class RAGAgentState(TypedDict): question: str context: List[str] # 检索到的相关文档片段 answer: str def retrieve_node(state: RAGAgentState): 检索节点从知识库中查找相关信息 # 加载已存在的知识库 embedding_model HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5) vectordb Chroma( persist_directory./chroma_db, embedding_functionembedding_model ) # 执行相似度检索 retriever vectordb.as_retriever(search_kwargs{k: 3}) # 返回最相关的3个片段 docs retriever.invoke(state[question]) context [doc.page_content for doc in docs] return {context: context} def generate_answer_node(state: RAGAgentState): 生成节点结合上下文回答问题 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.1) # 低temperature保证答案稳定 # 构建Prompt将上下文和问题结合 context_str \n\n.join(state[context]) prompt f请基于以下提供的上下文信息回答问题。如果上下文不包含答案请直接说“根据已知信息无法回答”不要编造。 上下文 {context_str} 问题{state[question]} 答案 response llm.invoke(prompt) return {answer: response.content} # --- 第3步组装RAG Agent工作流--- rag_workflow StateGraph(RAGAgentState) rag_workflow.add_node(retrieve, retrieve_node) rag_workflow.add_node(generate, generate_answer_node) rag_workflow.set_entry_point(retrieve) rag_workflow.add_edge(retrieve, generate) rag_workflow.add_edge(generate, END) rag_app rag_workflow.compile() # --- 第4步使用--- if __name__ __main__: # 首次运行需要构建知识库假设有一个product_manual.pdf # build_knowledge_base(product_manual.pdf) # 提问 question 你们的产品支持哪些支付方式 initial_state {question: question, context: [], answer: } result rag_app.invoke(initial_state) print(f问题{question}) print(f答案{result[answer]}) print(f参考上下文{result[context]})这个项目完整展示了RAG的流水线你可以替换PDF源将其改造成一个公司内部知识问答助手。这是简历上极具含金量的项目。5. 第四阶段工程化部署与私有化一个只能在你的笔记本上运行的Agent毫无价值。企业需要的是可以集成、可以服务化、可以稳定运行的系统。5.1 使用FastAPI封装Agent为HTTP服务将我们之前构建的LangGraph Agent暴露成API是集成到其他系统的标准做法。# main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional import uvicorn from your_agent_module import app as agent_app # 导入之前编译好的LangGraph app app FastAPI(titleAI Agent Service) class AgentRequest(BaseModel): question: str max_steps: Optional[int] 10 # 限制循环步数防止死循环 class AgentResponse(BaseModel): answer: str steps: list # 可选的返回执行步骤用于调试 app.post(/chat, response_modelAgentResponse) async def chat_with_agent(request: AgentRequest): 与Agent对话的端点 try: # 调用LangGraph工作流 config {recursion_limit: request.max_steps} result agent_app.invoke( {question: request.question, scratchpad: [], answer: }, configconfig ) return AgentResponse(answerresult.get(answer, ), stepsresult.get(scratchpad, [])) except Exception as e: raise HTTPException(status_code500, detailfAgent执行失败: {str(e)}) app.get(/health) async def health_check(): 健康检查端点用于K8s探针 return {status: healthy} if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)5.2 使用Docker容器化创建Dockerfile确保环境一致性。# Dockerfile FROM python:3.10-slim WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]构建并运行docker build -t my-agent-service .和docker run -p 8000:8000 my-agent-service。5.3 关键工程化考量配置管理将API Keys、模型地址、数据库连接等敏感信息通过环境变量或配置中心如Apollo管理切勿硬编码。日志与监控集成logging模块记录Agent的决策过程、工具调用和异常。考虑接入Prometheus Grafana监控QPS、延迟和错误率。超时与重试为LLM调用和工具调用设置合理的超时和重试机制。版本管理对Agent的工作流定义、Prompt模板进行版本控制如Git。6. 第五阶段调优、评估与对齐这是区分普通开发者和优秀开发者的分水岭。一个可用的Agent和一个好用的Agent之间隔着巨大的调优工作。6.1 Prompt工程与迭代Prompt是Agent的“指挥棒”。不要指望一次写好。结构化Prompt使用清晰的指令、角色设定、上下文、示例和输出格式要求。少样本学习Few-shot在Prompt中提供几个输入输出的例子能极大提升模型在特定任务上的表现。思维链Chain-of-Thought鼓励模型“一步一步思考”对于复杂推理任务效果显著。工具描述为每个工具编写清晰、无歧义的名称和描述这是Agent能否正确调用工具的关键。示例一个优化后的规划Agent Promptfrom langchain_core.prompts import ChatPromptTemplate planner_prompt ChatPromptTemplate.from_messages([ (system, 你是一个任务规划专家。你的目标是将用户的复杂请求分解为一系列清晰的、可执行的步骤。 每个步骤应该对应一个可用的工具。请严格按照以下格式输出 思考你的推理过程 计划 1. 第一步步骤描述 工具工具名 2. 第二步步骤描述 工具工具名 ... 如果任务无法分解或无需使用工具请输出“直接回答”。 可用的工具列表{tool_descriptions} ), (human, 用户请求{query}) ])6.2 评估Agent性能如何判断你的Agent变好了还是变差了需要建立评估体系。单元测试为每个工具函数编写测试。端到端测试构建一个测试集QA对定期运行计算准确率、召回率。人工评估对于关键场景必须加入人工评审环节。自动化评估进阶使用LLM-as-a-Judge让一个更强的模型如GPT-4来评估你Agent的输出质量。6.3 对齐与安全确保Agent的行为符合预期避免危险操作。工具权限控制为工具分级如读取、写入、删除。Agent在调用高风险工具如删除文件、发送邮件前必须通过“人工确认节点”。输出过滤与审查对Agent生成的最终答案进行内容安全过滤。构建“安全层”在LangGraph中可以添加一个safety_check_node在关键动作执行前进行校验。def safety_check_node(state: AgentState): 安全检查节点审查将要执行的动作 planned_action state.get(planned_action) if is_high_risk_action(planned_action): # 如果是高风险动作转入人工审核流程或直接终止 state[need_human_approval] True state[status] blocked return state else: state[status] approved return state # 在你的工作流中在执行节点前插入安全检查节点 workflow.add_node(safety_check, safety_check_node) workflow.add_edge(planner, safety_check) # 计划完成后检查 workflow.add_conditional_edges( safety_check, lambda s: human_review if s.get(need_human_approval) else executor, {human_review: human_review_node, executor: executor_node} )7. 学习路线总结与项目组合建议回顾一下我们的五阶段学习路线基础Python高级特性 AI API调用。核心掌握LangGraph理解状态、节点、图的概念能构建多步骤Agent。赋能掌握RAG为Agent注入领域知识构建知识库问答系统。工程FastAPI服务化、Docker容器化、配置与日志让Agent能上线。进阶Prompt调优、性能评估、安全对齐让Agent变得更聪明、更可靠。给求职者的项目组合建议打造一个“一主多辅”的项目组合深度展示你的全栈能力。核心项目主一个基于LangGraph和RAG的垂直领域智能客服/知识助手。完整实现从文档处理、向量检索、Agent推理到Web服务部署的全流程。这是你的“王牌”。辅助项目1一个自动化工作流Agent。例如一个能自动分析GitHub Issue、检索相关文档、生成初步解决方案的Agent。辅助项目2一个展示你调优能力的项目。例如对某个开源Agent项目进行Prompt优化或架构改进并通过评估数据集证明效果提升。面试准备要点清晰阐述项目能用一句话说清你的项目解决了什么问题用什么技术栈你负责的部分。深入细节能说清LangGraph状态流转、RAG检索精度优化、Dockerfile每一行的作用。思考与复盘能说出你在项目中遇到的最大挑战是什么如何解决的如果重来会怎么做。关注行业了解LangChain vs LangGraph的区别了解当前主流的Agent框架如AutoGen, CrewAI和向量数据库如Pinecone, Weaviate。这条路并不轻松但每一步都目标明确且能积累出实实在在的、可演示的成果。双非背景从来不是限制清晰的学习路径、扎实的项目经验和解决实际问题的能力才是你拿到Offer的最强筹码。现在就从搭建第一个LangGraph工作流开始吧。
返回列表