基于LangChain的RAG AI Agent开发实战:从原理到生产部署
随着AI技术的快速发展,AI Agent开发已成为当前最热门的技术方向之一。很多开发者在学习过程中面临资料零散、环境配置复杂、实战案例缺乏等痛点。本文将基于LangChain框架,从零开始构建一个完整的RAG(检索增强生成)AI Agent,涵盖Python基础、Transformer原理、向量数据库集成到生产级部署的全流程。
无论你是零基础的编程新手,还是有一定经验的开发者,通过本文的实战教程,都能在短时间内掌握AI Agent开发的核心技能。我们将通过一个具体的文档问答项目,带你体验从环境搭建到模型部署的完整开发周期。
1. AI Agent开发基础与环境准备
1.1 什么是AI Agent及其应用场景
AI Agent(人工智能代理)是一种能够感知环境、进行决策并执行动作的智能系统。与传统的聊天机器人不同,AI Agent具备自主性、反应性和目标导向性,能够通过工具使用、环境交互和持续学习来完成复杂任务。
核心特性:
- 自主决策 :基于当前状态和目标自主选择行动方案
- 工具使用 :调用外部API、数据库、文件系统等资源
- 持续学习 :从交互中积累经验并优化策略
- 多步推理 :将复杂问题分解为可执行的子任务
典型应用场景:
- 智能客服系统:处理用户咨询、故障排查、产品推荐
- 数据分析助手:自动收集、清洗、分析业务数据
- 代码开发助手:生成代码、调试程序、优化性能
- 文档智能问答:基于企业知识库的精准问答系统
1.2 开发环境搭建与工具选型
Python环境配置(Windows/macOS/Linux):
# 检查Python版本(需要3.8+)
python --version
pip --version
# 创建虚拟环境
python -m venv ai_agent_env
source ai_agent_env/bin/activate # Linux/macOS
ai_agent_env\Scripts\activate # Windows
# 安装核心依赖
pip install langchain-core langchain-community langchain-openai
pip install sentence-transformers chromadb
pip install jupyter notebook # 可选,用于代码调试
VS Code开发环境配置: 安装必要的扩展:Python、Pylance、Jupyter、GitLens等。创建 .vscode/settings.json 文件:
{
"python.defaultInterpreterPath": "./ai_agent_env/bin/python",
"python.analysis.extraPaths": ["./src"],
"editor.formatOnSave": true
}
关键工具说明:
- LangChain :AI应用开发框架,提供组件化的工作流
- ChromaDB :轻量级向量数据库,适合本地开发
- OpenAI API :大语言模型服务,也可替换为本地模型
2. Transformer架构深度解析
2.1 Transformer的核心组件与工作原理
Transformer模型彻底改变了自然语言处理领域,其核心创新在于自注意力机制(Self-Attention),能够并行处理序列数据并捕获长距离依赖关系。
自注意力机制数学原理:
import torch
import torch.nn as nn
import math
class SelfAttention(nn.Module):
def __init__(self, d_model, heads):
super().__init__()
self.d_model = d_model
self.heads = heads
self.head_dim = d_model // heads
self.query = nn.Linear(d_model, d_model)
self.key = nn.Linear(d_model, d_model)
self.value = nn.Linear(d_model, d_model)
self.fc_out = nn.Linear(d_model, d_model)
def forward(self, x, mask=None):
batch_size, seq_length, d_model = x.shape
# 线性变换得到Q、K、V
Q = self.query(x).view(batch_size, seq_length, self.heads, self.head_dim)
K = self.key(x).view(batch_size, seq_length, self.heads, self.head_dim)
V = self.value(x).view(batch_size, seq_length, self.heads, self.head_dim)
# 计算注意力分数
energy = torch.einsum("bqhd,bkhd->bhqk", [Q, K]) / math.sqrt(self.head_dim)
if mask is not None:
energy = energy.masked_fill(mask == 0, -1e20)
attention = torch.softmax(energy, dim=-1)
out = torch.einsum("bhql,blhd->bqhd", [attention, V])
out = out.reshape(batch_size, seq_length, d_model)
return self.fc_out(out)
Transformer编码器结构:
class TransformerEncoderLayer(nn.Module):
def __init__(self, d_model, heads, dropout, forward_expansion):
super().__init__()
self.attention = SelfAttention(d_model, heads)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.feed_forward = nn.Sequential(
nn.Linear(d_model, forward_expansion * d_model),
nn.ReLU(),
nn.Linear(forward_expansion * d_model, d_model)
)
self.dropout = nn.Dropout(dropout)
def forward(self, x, mask):
attention = self.attention(x, mask)
x = self.norm1(attention + x)
x = self.dropout(x)
forward = self.feed_forward(x)
x = self.norm2(forward + x)
x = self.dropout(x)
return x
2.2 Transformer在AI Agent中的关键作用
在AI Agent开发中,Transformer模型承担着核心的推理和决策功能:
1. 理解用户意图:
- 将自然语言查询转换为结构化表示
- 识别查询中的关键实体和关系
- 判断查询类型(问答、操作、分析等)
2. 上下文管理:
- 维护多轮对话的历史记录
- 跟踪任务执行状态和进度
- 管理短期和长期记忆
3. 工具选择与调用:
- 根据任务需求选择合适的工具
- 生成工具调用的参数格式
- 解析工具执行结果并整合到响应中
3. RAG框架原理与实战应用
3.1 RAG技术架构详解
RAG(Retrieval-Augmented Generation)通过结合检索器和生成器,让模型能够访问外部知识库,生成更准确、更具事实性的回答。
RAG工作流程:
- 文档处理 :将原始文档分割为可管理的块(chunk)
- 向量化 :使用嵌入模型将文本转换为向量表示
- 检索 :根据查询找到最相关的文档块
- 生成 :将检索到的上下文与原始查询结合生成回答
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
class RAGSystem:
def __init__(self, documents, chunk_size=1000, chunk_overlap=200):
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)
self.embeddings = OpenAIEmbeddings()
self.vector_store = None
self.setup_vector_store(documents)
def setup_vector_store(self, documents):
# 文档分割
chunks = self.text_splitter.split_documents(documents)
print(f"将文档分割为 {len(chunks)} 个块")
# 创建向量数据库
self.vector_store = Chroma.from_documents(
chunks,
self.embeddings,
persist_directory="./chroma_db"
)
def retrieve_documents(self, query, k=4):
"""检索相关文档"""
return self.vector_store.similarity_search(query, k=k)
def generate_answer(self, query, retrieved_docs, model):
"""基于检索结果生成回答"""
context = "\n\n".join([doc.page_content for doc in retrieved_docs])
prompt = f"""基于以下上下文信息回答问题:
上下文:
{context}
问题:{query}
请根据上下文提供准确、详细的回答:"""
return model.generate(prompt)
3.2 文档分块策略与向量化技术
智能分块策略:
from langchain.text_splitter import (
RecursiveCharacterTextSplitter,
TokenTextSplitter,
MarkdownHeaderTextSplitter
)
class AdvancedTextSplitter:
def __init__(self):
self.recursive_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " "]
)
def smart_split(self, document, content_type="general"):
"""根据内容类型智能分块"""
if content_type == "markdown":
headers_to_split_on = [
("#", "Header 1"),
("##", "Header 2"),
("###", "Header 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(
headers_to_split_on=headers_to_split_on
)
return markdown_splitter.split_text(document)
else:
return self.recursive_splitter.split_text(document)
多模态嵌入模型:
from sentence_transformers import SentenceTransformer
import numpy as np
class MultiModalEmbeddings:
def __init__(self, model_name='all-MiniLM-L6-v2'):
self.model = SentenceTransformer(model_name)
def encode_text(self, texts):
"""文本向量化"""
return self.model.encode(texts, convert_to_tensor=True)
def calculate_similarity(self, query_embedding, doc_embeddings):
"""计算相似度"""
from sklearn.metrics.pairwise import cosine_similarity
return cosine_similarity(
query_embedding.cpu().numpy().reshape(1, -1),
doc_embeddings.cpu().numpy()
)[0]
4. LangChain框架深度实战
4.1 LangChain核心组件详解
LangChain提供了模块化的组件来构建复杂的AI应用,主要包括以下几个核心模块:
工具(Tools)系统:
from langchain.tools import BaseTool
from typing import Type
class DocumentationSearchTool(BaseTool):
name = "search_documentation"
description = "搜索技术文档并返回相关片段"
def _run(self, query: str) -> str:
"""执行文档搜索"""
# 实现搜索逻辑
return f"找到关于 {query} 的文档内容"
async def _arun(self, query: str) -> str:
"""异步执行搜索"""
raise NotImplementedError("不支持异步执行")
class CalculatorTool(BaseTool):
name = "calculator"
description = "执行数学计算"
def _run(self, expression: str) -> str:
"""执行计算"""
try:
result = eval(expression)
return f"{expression} = {result}"
except Exception as e:
return f"计算错误: {str(e)}"
智能体(Agents)架构:
from langchain.agents import AgentType, initialize_agent
from langchain.llms import OpenAI
class AdvancedAgent:
def __init__(self, tools, llm_model):
self.tools = tools
self.llm = llm_model
self.agent = self.setup_agent()
def setup_agent(self):
"""初始化智能体"""
return initialize_agent(
tools=self.tools,
llm=self.llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
handle_parsing_errors=True
)
def run_task(self, task_description):
"""执行任务"""
try:
result = self.agent.run(task_description)
return {
"status": "success",
"result": result,
"steps": self.agent.agent.llm_chain.verbose
}
except Exception as e:
return {
"status": "error",
"error": str(e),
"suggestion": "请重新表述您的问题"
}
4.2 记忆(Memory)管理系统
对话记忆实现:
from langchain.memory import ConversationBufferWindowMemory
from langchain.schema import BaseMemory
from typing import Dict, List, Any
class CustomMemory(BaseMemory):
"""自定义记忆系统"""
def __init__(self, k=10):
self.k = k # 记忆窗口大小
self.conversations: List[Dict] = []
@property
def memory_variables(self) -> List[str]:
return ["chat_history", "current_context"]
def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
"""加载记忆变量"""
recent_chats = self.conversations[-self.k:] if self.conversations else []
return {
"chat_history": recent_chats,
"current_context": self._get_current_context(inputs)
}
def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]):
"""保存对话上下文"""
self.conversations.append({
"input": inputs.get("input", ""),
"output": outputs.get("output", ""),
"timestamp": datetime.now().isoformat()
})
def clear(self):
"""清空记忆"""
self.conversations.clear()
def _get_current_context(self, inputs: Dict[str, Any]) -> str:
"""获取当前上下文"""
# 实现上下文提取逻辑
return "当前对话上下文"
5. 生产级AI Agent项目实战
5.1 项目架构设计与技术选型
系统架构图:
AI Agent系统架构:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 用户接口层 │ │ 业务逻辑层 │ │ 数据访问层 │
│ - Web界面 │◄──►│ - 任务调度器 │◄──►│ - 向量数据库 │
│ - API接口 │ │ - 工作流引擎 │ │ - 关系数据库 │
│ - 命令行工具 │ │ - 错误处理 │ │ - 缓存系统 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ 模型服务层 │
│ - LLM模型 │
│ - 嵌入模型 │
│ - 工具执行器 │
└──────────────────┘
技术栈选择理由:
- 后端框架 :FastAPI(高性能、异步支持、自动文档生成)
- 数据库 :PostgreSQL(关系型)+ ChromaDB(向量)
- 缓存 :Redis(高速缓存会话状态)
- 任务队列 :Celery(分布式任务处理)
- 监控 :Prometheus + Grafana(系统监控)
5.2 核心代码实现
主应用入口:
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any
import uvicorn
app = FastAPI(title="AI Agent API", version="1.0.0")
class ChatRequest(BaseModel):
message: str
session_id: str = None
tools: List[str] = []
class ChatResponse(BaseModel):
response: str
session_id: str
tools_used: List[str]
confidence: float
@app.post("/chat", response_model=ChatResponse)
async def chat_endpoint(request: ChatRequest):
"""处理聊天请求"""
try:
# 初始化或获取会话
session_manager = SessionManager()
session = session_manager.get_or_create_session(request.session_id)
# 处理用户消息
agent = AIAgent(session=session)
result = await agent.process_message(request.message, request.tools)
return ChatResponse(
response=result["response"],
session_id=session.session_id,
tools_used=result["tools_used"],
confidence=result["confidence"]
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
"""健康检查端点"""
return {"status": "healthy", "timestamp": datetime.now().isoformat()}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
智能体核心类:
# agent.py
import asyncio
from datetime import datetime
from typing import Dict, List, Any
import logging
logger = logging.getLogger(__name__)
class AIAgent:
def __init__(self, session, model_provider="openai"):
self.session = session
self.model_provider = model_provider
self.tool_registry = ToolRegistry()
self.setup_agent()
def setup_agent(self):
"""初始化智能体组件"""
# 初始化LLM
self.llm = self._init_llm()
# 初始化工具
self.tools = self.tool_registry.get_tools()
# 初始化记忆系统
self.memory = ConversationBufferWindowMemory(
k=10,
return_messages=True
)
# 初始化智能体
self.agent_executor = initialize_agent(
tools=self.tools,
llm=self.llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
memory=self.memory,
handle_parsing_errors=True
)
async def process_message(self, message: str, enabled_tools: List[str] = None):
"""处理用户消息"""
try:
start_time = datetime.now()
# 预处理消息
processed_message = self._preprocess_message(message)
# 执行智能体任务
result = await asyncio.get_event_loop().run_in_executor(
None,
lambda: self.agent_executor.run(processed_message)
)
# 后处理结果
processed_result = self._postprocess_result(result)
# 记录执行时间
execution_time = (datetime.now() - start_time).total_seconds()
logger.info(f"消息处理完成,耗时: {execution_time:.2f}秒")
return {
"response": processed_result,
"tools_used": self._extract_used_tools(result),
"confidence": self._calculate_confidence(result),
"execution_time": execution_time
}
except Exception as e:
logger.error(f"消息处理失败: {str(e)}")
return {
"response": "抱歉,处理您的请求时出现了问题。请稍后重试。",
"tools_used": [],
"confidence": 0.0,
"error": str(e)
}
def _preprocess_message(self, message: str) -> str:
"""消息预处理"""
# 实现消息清洗、标准化等逻辑
return message.strip()
def _postprocess_result(self, result: Any) -> str:
"""结果后处理"""
# 实现结果格式化、敏感信息过滤等逻辑
return str(result)
def _extract_used_tools(self, result: Any) -> List[str]:
"""提取使用的工具"""
# 从结果中解析使用的工具
return []
def _calculate_confidence(self, result: Any) -> float:
"""计算置信度"""
# 基于结果质量计算置信度
return 0.8
6. 高级特性与优化策略
6.1 子代理(Subagents)系统
子代理管理器:
class SubagentManager:
def __init__(self):
self.subagents = {}
self.setup_subagents()
def setup_subagents(self):
"""初始化子代理"""
# 文档分析子代理
self.subagents["doc_analyst"] = {
"name": "documentation-analyst",
"description": "分析技术文档片段",
"system_prompt": """你是一个专业的技术文档分析师。
你的任务是分析给定的文档片段,提取关键信息并总结主要内容。
请关注:API说明、配置步骤、代码示例、注意事项等关键内容。""",
"tools": ["read_file", "analyze_code"]
}
# 数据查询子代理
self.subagents["data_query"] = {
"name": "data-query-agent",
"description": "执行数据查询和分析",
"system_prompt": """你是一个数据分析专家。
负责执行数据库查询、数据分析和结果解释。
确保查询准确、高效,并对结果进行清晰的解释。""",
"tools": ["sql_query", "data_visualization"]
}
async def delegate_to_subagent(self, subagent_name, task_description, context):
"""委托任务给子代理"""
if subagent_name not in self.subagents:
raise ValueError(f"未知的子代理: {subagent_name}")
subagent_config = self.subagents[subagent_name]
# 创建子代理实例
subagent = create_deep_agent(
model=self.llm,
tools=subagent_config["tools"],
system_prompt=subagent_config["system_prompt"]
)
# 执行子代理任务
result = await subagent.ainvoke({
"input": f"任务: {task_description}\n上下文: {context}"
})
return result
6.2 流式输出与实时交互
流式响应实现:
import json
from fastapi.responses import StreamingResponse
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
class CustomStreamingCallback(StreamingStdOutCallbackHandler):
def __init__(self, websocket):
self.websocket = websocket
def on_llm_new_token(self, token: str, **kwargs) -> None:
"""处理新生成的token"""
asyncio.create_task(
self.websocket.send_text(json.dumps({
"type": "token",
"content": token,
"timestamp": datetime.now().isoformat()
}))
)
@app.websocket("/ws/chat")
async def websocket_endpoint(websocket: WebSocket):
"""WebSocket聊天端点"""
await websocket.accept()
try:
while True:
# 接收消息
data = await websocket.receive_text()
message_data = json.loads(data)
# 创建流式回调
callback = CustomStreamingCallback(websocket)
# 处理消息(流式)
agent = AIAgent()
result = await agent.process_message_streaming(
message_data["message"],
callback=callback
)
# 发送完成信号
await websocket.send_text(json.dumps({
"type": "complete",
"final_result": result
}))
except WebSocketDisconnect:
logger.info("WebSocket连接断开")
except Exception as e:
logger.error(f"WebSocket处理错误: {str(e)}")
await websocket.close()
7. 部署与生产环境优化
7.1 Docker容器化部署
Dockerfile配置:
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 创建非root用户
RUN useradd -m -u 1000 agentuser && chown -R agentuser:agentuser /app
USER agentuser
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Docker Compose配置:
version: '3.8'
services:
ai-agent:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/ai_agent
- REDIS_URL=redis://redis:6379/0
- OPENAI_API_KEY=${OPENAI_API_KEY}
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
db:
image: postgres:13
environment:
- POSTGRES_DB=ai_agent
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- ai-agent
restart: unless-stopped
volumes:
postgres_data:
redis_data:
7.2 性能监控与日志管理
结构化日志配置:
# logging_config.py
import logging
import json
from datetime import datetime
class JSONFormatter(logging.Formatter):
def format(self, record):
log_entry = {
"timestamp": datetime.now().isoformat(),
"level": record.levelname,
"logger": record.name,
"message": record.getMessage(),
"module": record.module,
"function": record.funcName,
"line": record.lineno
}
if hasattr(record, 'extra_data'):
log_entry.update(record.extra_data)
return json.dumps(log_entry)
def setup_logging():
"""配置结构化日志"""
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 文件处理器
file_handler = logging.FileHandler('app.log')
file_handler.setFormatter(JSONFormatter())
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(JSONFormatter())
logger.addHandler(file_handler)
logger.addHandler(console_handler)
性能监控中间件:
# monitoring.py
from fastapi import Request
import time
from prometheus_client import Counter, Histogram, generate_latest
# 定义指标
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP requests', ['method', 'endpoint', 'status'])
REQUEST_DURATION = Histogram('http_request_duration_seconds', 'HTTP request duration')
class MonitoringMiddleware:
def __init__(self, app):
self.app = app
async def __call__(self, scope, receive, send):
if scope['type'] != 'http':
return await self.app(scope, receive, send)
start_time = time.time()
method = scope['method']
path = scope['path']
async def send_wrapper(message):
if message['type'] == 'http.response.start':
status_code = message['status']
REQUEST_COUNT.labels(method=method, endpoint=path, status=status_code).inc()
await send(message)
try:
await self.app(scope, receive, send_wrapper)
finally:
duration = time.time() - start_time
REQUEST_DURATION.observe(duration)
8. 常见问题排查与优化建议
8.1 性能问题排查清单
高延迟问题排查:
class PerformanceOptimizer:
def __init__(self):
self.metrics = {}
async def analyze_performance(self, request_data):
"""分析性能瓶颈"""
bottlenecks = []
# 检查模型响应时间
model_latency = await self._check_model_latency()
if model_latency > 2.0: # 超过2秒
bottlenecks.append({
"issue": "模型响应延迟过高",
"latency": model_latency,
"suggestion": "考虑使用更轻量级的模型或优化提示词"
})
# 检查向量检索性能
retrieval_time = await self._check_retrieval_performance()
if retrieval_time > 0.5: # 超过500ms
bottlenecks.append({
"issue": "向量检索性能不足",
"retrieval_time": retrieval_time,
"suggestion": "优化索引结构或减少检索数量"
})
# 检查内存使用
memory_usage = await self._check_memory_usage()
if memory_usage > 80: # 超过80%
bottlenecks.append({
"issue": "内存使用率过高",
"usage": f"{memory_usage}%",
"suggestion": "增加内存或优化数据缓存策略"
})
return bottlenecks
8.2 错误处理与重试机制
智能重试策略:
import asyncio
from typing import Callable, Any
from tenacity import retry, stop_after_attempt, wait_exponential
class SmartRetryHandler:
def __init__(self, max_retries=3, base_delay=1, max_delay=10):
self.max_retries = max_retries
self.base_delay = base_delay
self.max_delay = max_delay
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=1, max=10)
)
async def execute_with_retry(self, func: Callable, *args, **kwargs) -> Any:
"""带重试的执行函数"""
try:
result = await func(*args, **kwargs)
return result
except Exception as e:
logger.warning(f"操作失败: {str(e)},进行重试...")
raise e
async def execute_with_fallback(self, primary_func: Callable, fallback_func: Callable, *args, **kwargs):
"""带降级策略的执行"""
try:
return await self.execute_with_retry(primary_func, *args, **kwargs)
except Exception as e:
logger.error(f"主操作失败,使用降级方案: {str(e)}")
return await fallback_func(*args, **kwargs)
通过本文的完整学习路径,你已经掌握了从零开始构建生产级AI Agent的全套技能。在实际项目中,建议先从简单的用例开始,逐步增加复杂度,同时注重代码质量、测试覆盖和监控告警。AI Agent开发是一个快速发展的领域,持续学习和实践是保持竞争力的关键。
更多推荐
所有评论(0)