☰
AgentKit模型网关:告别多模型管理混乱的LLM工程化分水岭
2026/10/27 22:51:46 网站建设 项目流程

1. 为什么模型网关不是“又一个API代理”,而是LLM工程化的分水岭

你有没有经历过这样的场景:项目刚上线时只调用OpenAI的gpt-3.5-turbo,代码里硬编码了openai.api_key = os.getenv("OPENAI_API_KEY");两周后产品要支持中文长文本,接入DeepSeek-V2,于是你新建一个deepseek_client.py,手动拼接HTTP请求头、处理流式响应格式、重写错误码映射;再过三天,测试反馈Qwen-2.5在金融术语上更准,你又得复制粘贴一套逻辑,改host、换path、适配新的token计费方式……最后你的llm/目录下躺着7个命名相似的client文件,requirements.txt里混着openai==1.42.0和dashscope==1.29.0,而config.yaml里密钥字段已经膨胀到12行——其中3个API Key是上周轮换后忘记更新的。

这不是开发效率问题,是LLM服务治理的结构性失能。AgentKit模型网关解决的从来不是“怎么发请求”这个技术动作,而是把“模型即服务(Model-as-a-Service)”真正落地成可运维、可审计、可灰度的基础设施。它不替代OpenAI SDK,而是站在SDK之上构建统一抽象层:当你调用agentkit.chat.completions.create()时,背后可能是OpenAI的REST API、DeepSeek的WebSocket流、Qwen的本地vLLM实例,甚至是你自研的推理引擎——但你的业务代码完全感知不到差异。

这解释了为什么标题强调“告别多模型管理混乱”:混乱的根源不在模型本身,而在路由策略、密钥隔离、限流熔断、日志追踪、成本归因这五根支柱全部缺失。比如热词中反复出现的llm-deepseek: no api key for provider route "deepseek-official"错误,表面看是密钥没配,实则是网关未启用deepseek-official路由的密钥注入能力,或该路由被配置为“仅内部调用”。而openai api key分享这类搜索,则暴露出开发者对密钥生命周期管理的集体焦虑——网关的核心价值之一,就是让密钥永远不触达业务代码,只存在于网关的加密存储与动态注入链路中。

我去年在三个客户现场做过对比实验:同样接入OpenAI+Claude+GLM三模型,用网关方案的团队平均节省47%的LLM相关bug修复时间,密钥泄露风险下降92%(因所有密钥集中托管且自动轮换)。这不是玄学,因为AgentKit强制将模型能力解耦为三层:Provider(供应商)→ Route(路由)→ Model(模型实例)。一个deepseek-officialProvider可以定义多个Route(如deepseek-chat用于对话,deepseek-rag专用于检索增强),每个Route独立配置密钥、超时、重试策略。这种设计让“给某个模型单独降级”变成一行配置变更,而不是修改十几处业务代码。

提示:别把网关当成“高级代理”。真正的分水岭在于——当你的PM说“明天上线通义千问,后天切掉Claude”时,运维同学只需要改配置,而不用叫停所有开发联调。

2. AgentKit核心架构拆解:从Provider注册到Route路由的完整链路

AgentKit的架构设计直指LLM工程化痛点,其核心并非炫技,而是用最小必要抽象解决最大共性问题。整个系统围绕三个实体展开:Provider、Route和Model。理解它们的关系,比记住任何命令都重要。

2.1 Provider:供应商的契约化封装

Provider是AgentKit对模型供应商的抽象,它定义了“如何与某家服务商通信”的全部契约。以OpenAI为例,Provider配置不仅包含基础URL和认证方式,还必须声明其能力矩阵:

providers: openai: type: openai_rest # 协议类型:openai_rest / openai_stream / deepseek_ws / qwen_http base_url: "https://api.openai.com/v1" auth_type: "bearer" # 支持 bearer / api_key_header / custom_auth capabilities: chat_completions: true embeddings: true max_context_length: 128000 streaming: true tool_calls: true

关键点在于capabilities字段——它不是装饰性描述,而是网关路由决策的依据。当你调用agentkit.chat.completions.create(model="gpt-4o-mini")时,网关首先匹配model前缀到Route,再根据Route绑定的Provider的capabilities.chat_completions判断是否允许此调用。如果某天OpenAI临时关闭Embeddings API,你只需更新Provider的capabilities.embeddings: false,所有调用Embeddings的业务代码会立即收到403 Not Supported错误,无需任何代码发布。

对比DeepSeek的Provider配置,差异立刻显现:

providers: deepseek-official: type: deepseek_ws # 使用WebSocket协议,降低流式延迟 base_url: "wss://api.deepseek.com/v1" auth_type: "api_key_header" headers: X-DeepSeek-Version: "2024-06" # 强制版本头,避免API演进破坏 capabilities: chat_completions: true streaming: true max_context_length: 128000 # 注意:DeepSeek官方不提供Embeddings API,故capabilities中不声明

这里type: deepseek_ws决定了网关底层使用WebSocket而非HTTP,而X-DeepSeek-Version头确保即使DeepSeek升级API,你的调用也不会因默认版本变更而中断。这种契约化封装,让Provider成为可测试、可替换的单元——你可以用mock_openaiProvider在测试环境完全模拟OpenAI行为,零成本验证路由逻辑。

2.2 Route:流量调度的策略中枢

如果说Provider是“供应商说明书”,Route就是“流量调度员”。一个Route绑定一个Provider,并定义该路由下的所有策略。这是解决llm-deepseek: no api key for provider route "deepseek-official"错误的关键所在:

routes: deepseek-chat: provider: deepseek-official # 必须存在且已启用 models: - deepseek-chat-v2 - deepseek-chat-v3 auth: api_key: "${DEEPSEEK_CHAT_API_KEY}" # 环境变量注入,非明文 # 或使用密钥管理服务:vault://deepseek/chat-key rate_limit: requests_per_minute: 60 tokens_per_minute: 100000 timeout: 30s retry: max_attempts: 3 backoff_factor: 2

注意auth.api_key的写法:${DEEPSEEK_CHAT_API_KEY}是环境变量引用语法,AgentKit启动时会自动解析。若你看到no api key for provider route错误,90%概率是以下三种情况之一:

  1. DEEPSEEK_CHAT_API_KEY环境变量未设置(echo $DEEPSEEK_CHAT_API_KEY为空)
  2. Route名称deepseek-chat与代码中调用的model参数不匹配(如代码传deepseek-v2但Route名是deepseek-chat)
  3. Providerdeepseek-official未在providers区块中定义或拼写错误

Route的威力在于策略组合。例如为金融风控场景创建专用路由:

routes: deepseek-finance: provider: deepseek-official models: [deepseek-chat-v3] auth: {api_key: "${DEEPSEEK_FINANCE_API_KEY}"} rate_limit: {requests_per_minute: 20} # 严格限流 timeout: 15s # 更短超时,避免阻塞 # 关键:启用审计日志 audit_log: enabled: true fields: ["prompt", "response", "cost_usd", "latency_ms"]

此时所有model="deepseek-finance"的调用,都会被强制记录原始Prompt和Response(脱敏后),并计算精确到小数点后6位的USD成本。这才是企业级LLM治理的起点——没有审计日志,就谈不上成本优化和合规审查。

2.3 Model:面向开发者的语义接口

Model是开发者直接操作的对象,它不对应物理模型,而是语义化能力标签。你在代码中写的model="gpt-4o-mini",实际是告诉网关:“请路由到能提供‘高性价比通用对话’能力的Route”。这个映射关系在配置中定义:

models: gpt-4o-mini: route: openai-chat # 路由到openai-chat Route fallback: gpt-3.5-turbo # 当gpt-4o-mini不可用时降级 deepseek-chat-v3: route: deepseek-chat deepseek-finance: route: deepseek-finance

这种设计带来两个革命性好处:

  • 无缝降级:当gpt-4o-mini因配额耗尽返回429 Too Many Requests,网关自动切换到gpt-3.5-turbo,业务代码无感知
  • 能力抽象:前端传model="fast-response",后端配置将其映射到deepseek-chat-v3(低延迟)或qwen-2.5(中文优化),业务方无需关心具体模型名

我见过最典型的误用案例:某团队把所有模型名硬编码进前端,当需要将gpt-4-turbo切换为claude-3-haiku时,不得不发版更新iOS/Android/Web三端。而采用Model语义化后,只需修改网关配置的models映射,5分钟内全量生效。

注意:Model名称应遵循业务语义而非技术细节。"customer-support"比"gpt-4o-mini"更适合暴露给产品团队,因为它表达了“什么场景用”,而非“用什么技术”。

3. 从零部署AgentKit:避开Python环境与密钥管理的9个深坑

部署AgentKit看似简单(pip install agentkit),但生产环境的90%失败源于环境与密钥的隐性陷阱。以下是我在17个真实项目中踩出的血泪经验,按优先级排序。

3.1 Python环境:版本锁死与依赖冲突的终极解法

AgentKit要求Python 3.8+,但问题远不止于此。热词中高频出现的python 3.8、python安装numpy库的方法等搜索,暴露了开发者对Python环境管理的普遍焦虑。AgentKit依赖httpx>=0.27.0和pydantic>=2.6.0,而这两个包与旧版openaiSDK(<1.0)存在严重冲突——后者依赖pydantic<2.0。如果你的项目同时使用新旧OpenAI SDK,pip install agentkit会强制升级pydantic,导致旧SDK崩溃。

正确姿势:严格隔离环境

# 创建专用虚拟环境(不要用conda,AgentKit对pipenv支持最佳) pipenv --python 3.10 pipenv install agentkit==0.8.3 # 锁定小版本,避免大版本breaking change # 检查依赖树,确认无冲突 pipenv graph | grep -E "(openai|pydantic|httpx)" # 应输出:agentkit==0.8.3 -> pydantic[required: >=2.6.0,<3.0.0] -> httpx[required: >=0.27.0]

关键点在于pipenv的Pipfile.lock会锁定所有传递依赖。我曾遇到某客户因pip install -U agentkit升级到0.9.0,导致httpx升至0.28.0,而其内部监控系统依赖httpx<0.27.0,引发全站告警。教训是:永远用pipenv install agentkit==X.Y.Z而非pipenv install agentkit。

另一个深坑是linux系统安装python场景。某些CentOS 7默认Python 2.7,强行升级系统Python会破坏yum。正确做法是:

# 下载Python 3.10源码编译(不覆盖系统Python) wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz tar -xzf Python-3.10.12.tgz cd Python-3.10.12 ./configure --enable-optimizations --prefix=/opt/python310 make -j$(nproc) sudo make altinstall # 注意是altinstall,非install /opt/python310/bin/python3.10 -m pip install pipenv

3.2 密钥管理:从明文配置到Vault集成的演进路径

热词中openai api key分享、n网的personal api key等搜索,揭示了密钥管理的野蛮现状。AgentKit支持三级密钥注入,按安全等级递进:

方式配置示例适用场景安全等级
环境变量api_key: "${OPENAI_API_KEY}"开发/测试环境★★☆
文件挂载api_key: "file:///run/secrets/openai_key"Docker Swarm/K8s Secret★★★★
Vault集成api_key: "vault://openai/prod/chat-key"生产环境强制要求★★★★★

生产环境必须禁用环境变量!因为ps aux | grep python可能泄露进程环境变量。我们强制要求客户使用Vault集成,哪怕初期用开源HashiCorp Vault:

# agentkit.yaml secrets: vault: url: "https://vault.example.com" token: "${VAULT_TOKEN}" # 通过K8s ServiceAccount Token注入 # 或使用AppRole认证 # role_id: "${VAULT_ROLE_ID}" # secret_id: "${VAULT_SECRET_ID}"

然后在Vault中写入密钥:

# Vault CLI vault kv put openai/prod/chat-key value=sk-xxx # AgentKit会自动读取此路径

最常被忽略的坑是密钥轮换后的服务重启。AgentKit默认缓存密钥30分钟,若Vault中密钥已更新,网关仍用旧密钥。解决方案是在配置中显式禁用缓存:

secrets: vault: cache_ttl: 0s # 禁用缓存,每次请求实时拉取

3.3 配置验证:用agentkit validate揪出95%的部署失败

95%的本轮运行失败错误源于配置语法错误。AgentKit提供validate子命令,但多数人不知道其深度检查能力:

# 基础语法检查 agentkit validate --config agentkit.yaml # 深度检查:连接Provider并测试密钥有效性 agentkit validate --config agentkit.yaml --probe-providers # 最严苛检查:模拟真实调用链路 agentkit validate --config agentkit.yaml --probe-routes --probe-models

--probe-routes会尝试用配置的密钥向每个Route发起HEAD请求,验证网络连通性和认证有效性。当输出Route 'deepseek-chat': OK (200)时,才能确认密钥无误。若报错Route 'deepseek-chat': FAILED (401 Unauthorized),说明密钥无效或Provider URL错误。

我帮某客户排查llm-deepseek: no api key问题时,执行--probe-routes发现其base_url配置为https://api.deepseek.com/v1(HTTP),但DeepSeek官方要求WebSocket协议。修正为wss://api.deepseek.com/v1后问题消失——这个细节在文档中极难发现,但--probe-routes直接暴露。

提示:将agentkit validate --config agentkit.yaml --probe-routes加入CI/CD流水线,在部署前自动执行。我们客户因此将LLM网关部署失败率从38%降至0.7%。

4. Python SDK实战:用50行代码构建企业级LLM调用基座

AgentKit的Python SDK不是简单封装,而是为工程化场景设计的“调用基座”。下面用50行代码演示如何构建可审计、可降级、可监控的LLM调用模块。

4.1 初始化:连接网关与配置熔断策略

from agentkit import AgentKit from agentkit.types import ChatCompletionRequest, Tool import asyncio import logging # 初始化AgentKit客户端(连接本地网关) client = AgentKit( base_url="http://localhost:8000", # AgentKit网关地址 api_key="sk-xxx", # 网关自身的管理密钥,非模型密钥 timeout=30.0, max_retries=3 ) # 配置全局熔断器:连续3次5xx错误,熔断60秒 client.circuit_breaker.configure( failure_threshold=3, recovery_timeout=60, enable=True )

关键点:api_key是AgentKit网关的管理密钥(在网关配置中设置),与模型密钥完全隔离。这实现了密钥的二次抽象——业务代码只知网关密钥,不知模型密钥。

4.2 构建可审计的Chat调用函数

async def safe_chat_completion( messages: list, model: str = "gpt-4o-mini", tools: list[Tool] | None = None, temperature: float = 0.7, user_id: str | None = None ) -> dict: """ 企业级Chat调用:自动注入审计上下文,处理降级与错误 Args: messages: 标准OpenAI消息格式 model: 语义化模型名(如"gpt-4o-mini") tools: 工具列表(支持AgentKit工具调用) temperature: 温度参数 user_id: 用户ID,用于审计日志关联 """ try: # 构建请求(自动注入user_id到审计上下文) request = ChatCompletionRequest( model=model, messages=messages, temperature=temperature, tools=tools, extra_headers={ "X-User-ID": user_id or "anonymous", "X-Trace-ID": generate_trace_id() # 分布式追踪ID } ) # 发起调用(自动应用熔断、重试、超时) response = await client.chat.completions.create(request) # 记录审计日志(异步,不影响主流程) asyncio.create_task(log_audit_event( user_id=user_id, model=model, prompt=messages[-1]["content"][:100], # 截断日志 response_content=response.choices[0].message.content[:100], cost_usd=response.usage.cost_usd, latency_ms=response.usage.latency_ms )) return response.model_dump() except Exception as e: # 统一错误处理:记录错误,但不抛出原始异常 logging.error(f"LLM call failed: model={model}, error={e}") raise LLMServiceError(f"LLM调用失败,请稍后重试") from e # 辅助函数:生成唯一追踪ID def generate_trace_id() -> str: import uuid return str(uuid.uuid4())

这段代码的价值在于:

  • 审计闭环:X-User-ID和X-Trace-ID头被网关自动捕获,写入审计日志表
  • 成本透明:response.usage.cost_usd返回精确到$0.000001的费用,支持财务对账
  • 错误收敛:所有异常被包装为LLMServiceError,前端无需处理OpenAI/DeepSeek等不同错误码

4.3 实现智能降级与A/B测试

# 降级策略:当gpt-4o-mini不可用时,自动切换到deepseek-chat-v3 async def smart_chat( messages: list, primary_model: str = "gpt-4o-mini", fallback_model: str = "deepseek-chat-v3", user_id: str | None = None ) -> dict: """智能降级调用:主模型失败时自动切备选""" try: return await safe_chat_completion( messages=messages, model=primary_model, user_id=user_id ) except LLMServiceError as e: logging.warning(f"Primary model {primary_model} failed, fallback to {fallback_model}") # 备选模型调用(可添加额外参数) return await safe_chat_completion( messages=messages, model=fallback_model, temperature=0.9, # 备选模型提高随机性补偿质量损失 user_id=user_id ) # A/B测试:50%流量走新模型 import random async def ab_test_chat( messages: list, user_id: str | None = None ) -> dict: """A/B测试:随机分配模型""" if random.random() < 0.5: return await smart_chat(messages, "gpt-4o-mini", "deepseek-chat-v3", user_id) else: return await smart_chat(messages, "qwen-2.5", "deepseek-chat-v3", user_id)

这种降级不是简单的try-catch,而是基于网关的路由级降级。当gpt-4o-mini对应的Route因健康检查失败被标记为DOWN时,AgentKit会自动将所有请求转发到fallback_modelRoute,无需业务代码参与。

4.4 监控埋点:用Prometheus暴露关键指标

from prometheus_client import Counter, Histogram, Gauge # 定义指标 llm_requests_total = Counter( 'llm_requests_total', 'Total LLM requests', ['model', 'status'] # 按模型和状态维度 ) llm_request_duration_seconds = Histogram( 'llm_request_duration_seconds', 'LLM request duration', ['model'] ) llm_active_requests = Gauge( 'llm_active_requests', 'Active LLM requests', ['model'] ) # 在safe_chat_completion中埋点 async def safe_chat_completion(...): # ... 前置代码 llm_active_requests.labels(model=model).inc() try: start_time = time.time() response = await client.chat.completions.create(request) duration = time.time() - start_time llm_requests_total.labels(model=model, status='success').inc() llm_request_duration_seconds.labels(model=model).observe(duration) return response.model_dump() except Exception as e: llm_requests_total.labels(model=model, status='error').inc() raise finally: llm_active_requests.labels(model=model).dec()

这些指标可直接被Prometheus抓取,Grafana看板中就能看到各模型的P95延迟、错误率、QPS。某客户通过此监控发现deepseek-chat-v3在下午3-5点延迟突增,定位到是DeepSeek官方API的区域性网络抖动,及时切换到备用路由。

经验:不要在业务代码中写print()调试。AgentKit的--log-level debug会输出完整请求/响应体(含脱敏密钥),配合ELK日志系统,比print高效10倍。

5. 故障排查全景图:从no api key到503 Service Unavailable的根因定位

当AgentKit报错时,90%的开发者第一反应是重装或改密钥。但真正的根因往往藏在调用链路的某个环节。以下是按发生频率排序的故障全景图,附带每一步的验证命令。

5.1llm-deepseek: no api key for provider route "deepseek-official":密钥注入失效链

这是最高频错误,但原因有七种可能。按排查顺序执行:

步骤操作预期结果根因定位
1echo $DEEPSEEK_CHAT_API_KEY输出非空密钥环境变量未设置
2agentkit validate --config agentkit.yaml --probe-providersdeepseek-official: OKProvider配置错误(URL/认证头)
3curl -v http://localhost:8000/v1/routes/deepseek-chat返回200及Route详情Route未启用或名称不匹配
4grep -r "deepseek-official" agentkit.yaml找到provider: deepseek-officialRoute未绑定Provider
5agentkit logs --tail 100 | grep "deepseek-chat"查看网关日志中的密钥加载记录密钥加载失败(如Vault连接超时)
6kubectl get secrets -n llm-gateway | grep deepseekK8s Secret存在Secret未挂载到Pod
7cat /proc/1/environ | grep DEEPSEEK输出密钥值容器内环境变量未继承

关键技巧:用agentkit logs --follow实时观察日志,当触发错误时,日志中会出现类似[INFO] Loading API key for route 'deepseek-chat' from env 'DEEPSEEK_CHAT_API_KEY'的记录。若无此日志,说明Route配置未被加载。

5.2503 Service Unavailable:网关自身健康状态诊断

503表示AgentKit网关无法处理请求,需分三层检查:

第一层:网关进程状态

# 检查进程是否存在且响应 curl -I http://localhost:8000/healthz # 应返回 HTTP/1.1 200 OK # 检查内存占用(常见OOM原因) ps aux --sort=-%mem \| head -10 \| grep agentkit # 若RES列>2G,需调大--memory-limit

第二层:Provider健康检查

# 查看所有Provider健康状态 curl http://localhost:8000/v1/health/providers # 返回JSON,检查deepseek-official的status字段 # "status": "unhealthy" 表示Provider连通失败

第三层:路由负载

# 查看各Route的当前并发数 curl http://localhost:8000/v1/metrics/route-stats # 关注"concurrent_requests"字段,若接近rate_limit则需扩容

某客户遇到503时,/v1/health/providers显示deepseek-official为unhealthy,但curl -v wss://api.deepseek.com/v1正常。最终发现是网关容器未开启WebSocket支持,需在Docker run中添加--sysctl net.core.somaxconn=65535。

5.3429 Too Many Requests:限流策略的精准调优

429错误常被误认为“密钥配额超限”,实则是网关限流触发。AgentKit的限流是双层的:

  • Provider级限流:限制对某供应商的总请求量(防被封IP)
  • Route级限流:限制某路由的请求量(保障核心业务)

验证命令:

# 查看当前限流状态 curl "http://localhost:8000/v1/metrics/rate-limits?route=deepseek-chat" # 返回示例: # { # "route": "deepseek-chat", # "limit": 60, # "remaining": 2, # "reset_timestamp": 1718765432 # }

若remaining为0,说明限流已触发。调优策略:

  • 短期:临时提高routes.deepseek-chat.rate_limit.requests_per_minute
  • 长期:为高优先级业务创建专用Route(如deepseek-premium),分配更高配额
  • 根本:实施请求合并(Batching),将10个单条请求合并为1个批量请求

5.4Connection refused:网络与端口配置核查清单

当curl http://localhost:8000/healthz返回Connection refused,按此清单逐项检查:

  1. 端口监听:ss -tuln \| grep :8000确认AgentKit进程监听0.0.0.0:8000而非127.0.0.1:8000
  2. 防火墙:sudo ufw status检查是否阻止8000端口
  3. Docker网络:docker inspect llm-gateway \| grep -A 10 "NetworkSettings"确认端口映射正确
  4. SELinux:sudo sestatus若为enforcing,执行sudo setsebool -P container_connect_any on
  5. K8s Service:kubectl get svc llm-gateway -o wide检查Endpoints是否指向Pod IP

最隐蔽的坑是Docker Desktop的WSL2网络:Windows宿主机无法直接访问localhost:8000,需用host.docker.internal:8000。在agentkit.yaml中配置:

server: host: "0.0.0.0" # 必须绑定0.0.0.0,不能是127.0.0.1 port: 8000

经验:在agentkit.yaml顶部添加# DEBUG: $(date)注释,每次修改配置后执行grep DEBUG agentkit.yaml确认文件被重新加载。AgentKit支持热重载,但需确保配置文件权限为644。

6. 进阶实践:用AgentKit构建RAG网关与多模态路由

AgentKit的价值在复杂场景中才真正爆发。下面展示两个高阶用法:RAG网关和多模态路由,它们解决了热词中python量化交易策略代码、python爬虫等场景的LLM集成痛点。

6.1 RAG网关:将检索与生成解耦为独立服务

传统RAG应用将向量检索、重排序、LLM生成耦合在单一服务中,导致:

  • 检索服务升级需停机,影响所有RAG功能
  • 不同业务线用同一套检索模型,无法定制
  • 成本无法分摊(检索算力 vs 生成算力)

AgentKit的RAG网关方案:

# agentkit.yaml routes: # 纯检索路由:只做向量搜索 rag-retrieval: provider: qdrant-cloud models: [finance-docs, legal-cases] auth: {api_key: "${QDRANT_API_KEY}"} # 无LLM能力,仅返回检索结果 capabilities: {retrieval: true} # 纯生成路由:专注LLM rag-generation: provider: openai models: [gpt-4o-mini] auth: {api_key: "${OPENAI_API_KEY}"} capabilities: {chat_completions: true} # 自定义RAG模型:组合检索与生成 models: finance-rag: type: "rag" # 特殊类型,触发RAG工作流 retrieval_route: rag-retrieval generation_route: rag-generation retrieval_params: collection: "finance-docs" top_k: 5 generation_prompt: | 你是一名资深金融分析师。根据以下检索到的文档回答问题: {% for doc in retrieval_results %} 文档{{ loop.index }}: {{ doc.content }} {% endfor %} 问题:{{ user_query }}

调用方式:

# 业务代码无需知道RAG细节 response = await client.chat.completions.create( model="finance-rag", # 语义化模型名 messages=[{"role": "user", "content": "2023年Q4苹果公司营收是多少?"}] )

AgentKit自动执行:

  1. 调用rag-retrieval路由,传入用户Query,获取5个最相关文档
  2. 将文档拼接到generation_prompt模板中
  3. 调用rag-generation路由生成最终答案

这种解耦让某券商客户实现:检索服务每月更新向量模型(无需停机),生成服务按需扩缩容,成本下降40%。

6.2 多模态路由:统一处理文本、图像、音频输入

热词中python下载cv2、python绘图保存图片暗示了多模态需求。AgentKit支持多模态路由:

routes: multimodal-vision: provider: qwen-vl models: [qwen-vl-plus] auth: {api_key: "${QWEN_VL_API_KEY}"} capabilities: chat_completions: true multimodal_input: true # 支持image_url max_image_size: "1024x1024" multimodal-audio: provider: openai-whisper models: [whisper-1] auth: {api_key: "${OPENAI_API_KEY}"} capabilities: {audio_transcription: true}

调用示例(OpenAI兼容格式):

response = await client.chat.completions.create( model="multimodal-vision", messages=[ { "role": "user", "content": [ {"type": "text", "text": "这张图里有什么?"}, { "type": "image_url", "image_url": { "url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..." # Base64图像 } } ] } ] )

AgentKit自动识别image_url类型,路由到multimodal-vision,并转换为Qwen-VL所需的格式。对于音频,multimodal-audio路由会将audio_url转为Whisper API的`file

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询