技术选型详解
选型核心原则
在2核2G阿里云服务器上构建AI多Agent系统,每MB内存都是稀缺资源。技术选型的核心原则是:能用标准库就不引入框架,能用CLI就不引入SDK。
后端:Python + LangGraph
为什么用LangGraph而不是纯Agno?
| 维度 | LangGraph | Agno (Phidata) |
|---|---|---|
| 条件路由 | ✅ 原生支持 | ❌ 需要手动实现 |
| 状态管理 | ✅ 内置checkpoint | ⚠️ 需要外部存储 |
| 流式输出 | ✅ astream原生支持 | ✅ 支持 |
| 社区生态 | ✅ LangChain生态 | ⚠️ 较新 |
LangGraph的StateGraph + conditional_edges完美契合"按需调度"的需求。
为什么用DeepSeek而不是OpenAI?
- 国内延迟:DeepSeek API在国内访问延迟<100ms,OpenAI需要代理
- 性价比:DeepSeek-V3的价格是GPT-4o的1/10
- 中文能力:DeepSeek在中文理解和生成上表现优秀
- OpenAI兼容:DeepSeek提供OpenAI兼容API,无需额外适配
LLM配置
llm = ChatOpenAI(
model="deepseek-chat",
base_url="https://api.deepseek.com",
api_key=os.getenv("DEEPSEEK_API_KEY"),
)
工具层:flyai-cli
为什么用CLI而不是SDK?
飞猪MCP服务通过flyai-cli暴露,直接用subprocess调用:
result = subprocess.run("npx flyai search-hotel --dest-name 杭州", ...)
优势:
- 零依赖:不需要安装飞猪SDK
- JSON输出:CLI输出标准JSON,易于解析
- 独立更新:CLI更新不影响后端代码
网关:Go标准库
为什么不用Gin/Echo/Fiber?
Go标准库的net/http已经足够:
- 路由:
http.NewServeMux()+HandleFunc - SSE:
http.Flusher接口 - 静态文件:
embed.FS编译时嵌入 - 模板:
html/template标准库
引入框架只会增加二进制体积,没有任何功能收益。
embed.FS的妙用
//go:embed templates/*
var templateFS embed.FS
//go:embed static/*
var staticFS embed.FS
//go:embed blog/posts/*.md
var blogFS embed.FS
所有文件编译进Go二进制,部署时只需要一个可执行文件。
博客渲染:goldmark
Go的goldmark库在首次请求时将Markdown渲染为HTML,结果缓存在内存中(TTL 1小时):
var buf bytes.Buffer
mdRenderer.Convert([]byte(markdown), &buf)
cache[key] = buf.String()
内存预算
| 组件 | 内存 |
|---|---|
| OS + 系统服务 | ~300MB |
| Go网关 | ~20MB |
| Python后端 | ~300MB |
| 总计 | ~620MB |
2GB服务器绰绰有余,还能承受流量高峰。
导航
← 上一篇:Agent协作原理与调度策略 → 下一篇:部署心得与性能优化