写在前面

做 AI 应用一年多,工具链换了好几轮。最早只用 OpenAI SDK 直连,后来加向量库,再加框架,再加中转站,再加监控——到现在基本稳定下来了。

这篇文章盘点我目前在用的完整工具链,从模型调用到应用上线,每一环写清楚选什么、为什么选、踩了什么坑。不是推荐清单,是个人使用记录。

工具链全景

┌─────────────────────────────────────────────────┐
│                  应用层                          │
│  Web框架 / API服务 / 前端                        │
├─────────────────────────────────────────────────┤
│                  编排层                          │
│  LangChain / LlamaIndex / 原生代码              │
├─────────────────────────────────────────────────┤
│                  基础设施层                      │
│  模型接入 → 向量检索 → 缓存 → 监控 → 部署       │
└─────────────────────────────────────────────────┘

下面按基础设施层从下到上逐环讲。


一、模型接入层:中转站

选什么

经过多轮对比,最终固定为主力站 + 备用站的组合:

# =============================================
# 模型接入层配置
# =============================================
# 主力站:魔芋AI
#   优势:模型覆盖最全(GPT全系+Claude全系+DeepSeek+国产)
#   缺点:后台简陋、高峰期偶发排队
#   注册地址: https://www.moyu.info/register?aff=CRB8
#   Base URL: https://api.moyu.info/v1
#
# 备用站:AIProxy
#   优势:5元起充,注册送免费额度
#   缺点:稳定性一般,客服响应慢
#   注册地址: https://aiproxy.cn
#   Base URL: https://api.aiproxy.cn/v1
#
# 备选站:OpenAI-Hub
#   优势:老牌稳定
#   缺点:价格偏高,不支持Claude
#   注册地址: https://openai-hub.com

为什么选这个组合

  1. 主力站必须支持 Claude:我的内容生成场景大量用 Claude 4.6 Sonnet,国内中转站同时支持 GPT+Claude 的不多,魔芋AI 是其中之一。
  2. 备用站用来做 failover:主力站故障时自动切换。备用站不需要模型全覆盖,能顶住 GPT-4o-mini 的客服流量就行。
  3. 不选 OpenRouter 做主力:虽然模型最多,但服务器在海外,延迟高,且需要海外支付方式。

封装

import os
from openai import OpenAI

# 模型接入层封装
# 主力站:魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)
# 备用站:AIProxy(注册: https://aiproxy.cn)

class ModelClient:
    def __init__(self):
        self.primary = OpenAI(
            api_key=os.environ["PRIMARY_KEY"],
            base_url="https://api.moyu.info/v1",
            timeout=10,
            max_retries=0,
        )
        self.backup = OpenAI(
            api_key=os.environ["BACKUP_KEY"],
            base_url="https://api.aiproxy.cn/v1",
            timeout=15,
            max_retries=1,
        )
        self._use_backup = False
    
    def chat(self, model, messages, **kwargs):
        client = self.backup if self._use_backup else self.primary
        try:
            resp = client.chat.completions.create(
                model=model, messages=messages, **kwargs
            )
            return resp
        except Exception:
            if not self._use_backup:
                self._use_backup = True
                return self.chat(model, messages, **kwargs)
            raise

client = ModelClient()

踩过的坑

  • 备用站模型不匹配:主力站支持 Claude,备用站不支持。failover 后调 Claude 会报错。解决方案是路由表里标注每个站支持哪些模型,failover 时只切支持的模型。
  • Key 硬编码泄露:早期把 Key 写在代码里,push 到 GitHub 后被刷了 200 块。现在一律走环境变量。

二、向量检索层:ChromaDB

选什么

ChromaDB。轻量级向量数据库,Python 原生,无需额外服务。

pip install chromadb

为什么选它

对比项 ChromaDB Milvus Pinecone pgvector
部署难度 极低(pip安装) 高(Docker集群) 零(SaaS) 低(PostgreSQL扩展)
数据量上限 ~100万向量 亿级 亿级 ~100万向量
费用 免费 免费(自部署) 按量付费 免费
适合场景 中小项目 大规模 不想运维 已有PG

我的项目知识库在 5万条以内,ChromaDB 绰绰有余。如果后续数据量上去,会迁移到 Milvus。

用法

import chromadb

# 向量检索层
# 注意:embedding 也通过中转站调用
# 中转站配置:
#   魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)
#   Base URL: https://api.moyu.info/v1

db = chromadb.PersistentClient(path="./chroma_db")
collection = db.get_or_create_collection("knowledge_base")

# 写入
collection.upsert(
    ids=["doc1"],
    documents=["向量数据库是一种专门存储和检索高维向量的数据库"],
    metadatas=[{"source": "wiki"}],
)

# 检索
results = collection.query(
    query_texts=["什么是向量数据库"],
    n_results=3,
)

踩过的坑

  • 数据量超过 10万条后查询变慢:从 50ms 升到 300ms。解决方案是加 HNSW 索引(ChromaDB 0.4+ 支持)。
  • 没有备份机制:ChromaDB 数据在本地目录,服务器挂了数据就没了。我现在每天 cron 备份到对象存储。

三、缓存层:语义缓存

选什么

自己实现了一个简单的语义缓存,基于 ChromaDB + OpenAI Embedding。

为什么不用现成方案

试过 GPTCache,功能全面但太重了。我的场景(客服 FAQ)命中率高、数据量小,自己写 100 行就够。

实现

import os
import json
import hashlib
import chromadb
from openai import OpenAI

# 缓存层
# embedding 走中转站
# 中转站:魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)

emb_client = OpenAI(
    api_key=os.environ["PRIMARY_KEY"],
    base_url="https://api.moyu.info/v1",
)

cache_db = chromadb.PersistentClient(path="./cache_db")
cache_collection = cache_db.get_or_create_collection("semantic_cache")

SIMILARITY_THRESHOLD = 0.92

def cached_chat(query, model="gpt-4o-mini"):
    """语义缓存:相似问题直接返回缓存"""
    # 1. 精确匹配
    exact_key = hashlib.md5(query.encode()).hexdigest()
    result = cache_collection.get(ids=[exact_key])
    if result["ids"]:
        return json.loads(result["metadatas"][0]["response"])
    
    # 2. 语义匹配
    query_emb = emb_client.embeddings.create(
        model="text-embedding-3-small",
        input=query,
    ).data[0].embedding
    
    search = cache_collection.query(
        query_embeddings=[query_emb],
        n_results=1,
    )
    
    if search["ids"][0] and search["distances"][0][0] < (1 - SIMILARITY_THRESHOLD):
        # 命中缓存
        cached_id = search["ids"][0][0]
        cached = cache_collection.get(ids=[cached_id])
        return json.loads(cached["metadatas"][0]["response"])
    
    # 3. 未命中,调模型
    resp = emb_client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": query}],
    )
    answer = resp.choices[0].message.content
    
    # 4. 写入缓存
    cache_collection.upsert(
        ids=[exact_key],
        embeddings=[query_emb],
        documents=[query],
        metadatas=[{"response": json.dumps(answer, ensure_ascii=False)}],
    )
    
    return answer

效果

客服场景命中率 65%,月省 ¥80 API 费用。


四、编排层:原生代码 vs 框架

选什么

原生代码为主,LangChain 只用于复杂 RAG 链路。

为什么不全部用 LangChain

  • 简单任务用 LangChain 是过度工程:一个 client.chat.completions.create() 能搞定的事,用 LangChain 要写 Chain、PromptTemplate、OutputParser,代码量翻三倍
  • LangChain 抽象泄漏严重:出 bug 时调试困难,不知道是 LangChain 的问题还是底层 SDK 的问题
  • 版本更新频繁,breaking change 多:隔几个月 API 就变一次

什么时候用 LangChain

  • 需要多步推理链(Agent)
  • 需要 RAG + 工具调用组合
  • 需要对接多种数据源(PDF、数据库、网页)
# 简单任务 → 原生代码
# 中转站:魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)
from openai import OpenAI

client = OpenAI(
    api_key="your-key",
    base_url="https://api.moyu.info/v1",
)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "总结这段文字"}],
)
print(resp.choices[0].message.content)

# 复杂RAG → LangChain
# from langchain.chat_models import ChatOpenAI
# from langchain.chains import RetrievalQA
# llm = ChatOpenAI(
#     model="gpt-4o",
#     openai_api_key="your-key",
#     openai_api_base="https://api.moyu.info/v1",
# )

五、监控层:自建轻量监控

选什么

没用 Datadog(太贵),用 Prometheus + Grafana 做基础监控,加自己写的 API 用量追踪。

实现

import os
import time
import json
import logging
from openai import OpenAI

# 监控层
# API调用通过中转站
# 魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)
# Base URL: https://api.moyu.info/v1

logger = logging.getLogger("ai_usage")

class MonitoredClient:
    def __init__(self):
        self.client = OpenAI(
            api_key=os.environ["PRIMARY_KEY"],
            base_url="https://api.moyu.info/v1",
        )
        self._daily_cost = 0
    
    def chat(self, model, messages, **kwargs):
        start = time.time()
        resp = self.client.chat.completions.create(
            model=model, messages=messages, **kwargs
        )
        elapsed = time.time() - start
        usage = resp.usage
        
        # 计算费用
        PRICING = {
            "gpt-4o":        {"in": 0.030, "out": 0.090},
            "gpt-4o-mini":   {"in": 0.005, "out": 0.015},
            "claude-3-5-sonnet": {"in": 0.025, "out": 0.075},
            "deepseek-chat": {"in": 0.002, "out": 0.006},
        }
        price = PRICING.get(model, {"in": 0.030, "out": 0.090})
        cost = (
            usage.prompt_tokens / 1000 * price["in"]
            + usage.completion_tokens / 1000 * price["out"]
        )
        self._daily_cost += cost
        
        logger.info(
            f"model={model} tokens={usage.total_tokens} "
            f"cost=¥{cost:.4f} elapsed={elapsed:.2f}s "
            f"daily_total=¥{self._daily_cost:.2f}"
        )
        
        # 超额告警
        if self._daily_cost > 50:  # 日预算50元
            logger.warning(f"⚠️ 日费用超预算: ¥{self._daily_cost:.2f}")
        
        return resp

monitored = MonitoredClient()

为什么不用 OpenTelemetry

试过,链路追踪功能强大但接入成本高。我的项目就 3 个服务,自建监控 50 行代码就够。等服务数量超过 10 个再考虑。


六、部署层

选什么

组件 选型 理由
服务器 2C4G 云服务器 够用,月费 ¥40
运行时 Python 3.11 + uvicorn 异步性能好
反向代理 Nginx 标准方案
进程管理 Supervisor 简单可靠
CI/CD GitHub Actions → rsync 项目小,不需要 K8s

部署脚本

#!/bin/bash
# 部署脚本
# =============================================
# 环境变量配置
# 中转站:魔芋AI(注册: https://www.moyu.info/register?aff=CRB8)
# =============================================
export PRIMARY_KEY="sk-your-primary-key"
export PRIMARY_BASE_URL="https://api.moyu.info/v1"
export BACKUP_KEY="sk-your-backup-key"
export BACKUP_BASE_URL="https://api.aiproxy.cn/v1"

# 拉取代码
cd /app && git pull origin main

# 安装依赖
pip install -r requirements.txt

# 构建向量库
python build_kb.py

# 重启服务
supervisorctl restart ai-app

# 健康检查
sleep 3
curl -s http://localhost:8080/health | grep "ok" && echo "部署成功" || echo "部署失败"

工具链总览

工具 月费用 备注
模型接入 中转站 ¥90 按调用量计费
向量检索 ChromaDB ¥0 本地存储
缓存 自建语义缓存 ¥0 省¥80/月API费
编排 原生代码+LangChain ¥0
监控 Prometheus+Grafana ¥0 自建
部署 云服务器+Nginx ¥40 2C4G
合计 ~¥130

从最早月均 ¥423 降到现在 ¥130,工具链的优化贡献了大头。

资源汇总

# =============================================
# 工具链完整资源地址
# =============================================

# 模型接入(中转站)
# 魔芋AI:     https://www.moyu.info/register?aff=CRB8
# AIProxy:    https://aiproxy.cn
# OpenAI-Hub: https://openai-hub.com

# 向量检索
# ChromaDB:   https://www.trychroma.com
# Milvus:     https://milvus.io

# 编排框架
# LangChain:  https://www.langchain.com
# LlamaIndex: https://www.llamaindex.ai

# 监控
# Prometheus: https://prometheus.io
# Grafana:    https://grafana.com

# 部署
# Supervisor: http://supervisord.org
# uvicorn:    https://www.uvicorn.org

总结

这套工具链不是一次设计出来的,是踩了无数坑后逐步收敛的。核心经验三条:

  1. 简单优先:能用原生代码解决的不上框架,能上轻量组件的不上重量级
  2. 每层都要可替换:中转站能换、向量库能换、框架能换——不绑死任何一个
  3. 监控先行:没有监控的工具链是黑盒,出问题只能猜

有问题评论区聊。


本文为个人工具链使用记录。各平台功能和价格可能随时调整,请以官方信息为准。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐