应用详情
本应用为阿里云百炼
阿里云百炼
这个页面对应项目中 AI 应用接入的现状说明。
为什么要通过后端代理
前端页面不能直接暴露模型 API Key,也不应该让浏览器直接决定模型、Prompt、权限和日志策略。正确做法是让前端只提交用户问题,后端负责鉴权、组装 Prompt、调用百炼、记录日志和处理错误。
如果直接在前端调用模型,密钥会泄露,接口无法统一限流,用户也可能绕过页面直接构造请求。后端代理不是多此一举,而是 AI 应用安全和治理的基本边界。
你现在项目里的 AI 页面大致链路
- 前端聊天页面负责输入和展示。
- 前端通过请求模块把问题发给后端。
- 后端再转发给模型服务。
- 模型返回结果后再展示到页面。
一次问答流程
mermaid
flowchart TD
A[用户输入问题] --> B[前端聊天组件]
B --> C[业务后端接口]
C --> D[阿里云百炼模型服务]
D --> C
C --> B
B --> E[页面展示回答]阿里云百炼在链路里的位置
阿里云百炼可以理解为模型应用平台,它把底层模型能力以 API 或应用调用方式暴露给业务系统。项目接入时,业务系统通常不直接在前端保存密钥,而是让后端统一调用百炼服务。
| 层级 | 职责 |
|---|---|
| 前端页面 | 采集用户输入,展示流式或完整回答 |
| 后端接口 | 鉴权、限流、参数校验、转发模型请求 |
| 百炼应用 | 管理模型、提示词、知识库或 Agent 配置 |
| 模型服务 | 根据上下文生成回答 |
| 日志监控 | 记录请求耗时、失败原因、Token 成本和用户反馈 |
推荐的后端代理流程
mermaid
sequenceDiagram
participant U as 用户
participant Web as 前端页面
participant API as 业务后端
participant Bailian as 阿里云百炼
participant Log as 日志与监控
U->>Web: 输入问题
Web->>API: POST /ai/chat
API->>API: 登录校验、参数校验、限流
API->>Bailian: 携带密钥调用模型应用
Bailian-->>API: 返回回答或流式片段
API->>Log: 记录耗时、状态、Token 用量
API-->>Web: 返回模型结果
Web-->>U: 展示回答这种方式的好处是:
- 密钥不暴露到浏览器。
- 后端可以统一做鉴权、限流和审计。
- 后续更换模型平台时,只需要改后端适配层。
- 可以把敏感词、上下文拼接、失败兜底放在服务端统一处理。
接口设计建议
一个最小可用的聊天接口可以包含这些字段:
| 字段 | 说明 |
|---|---|
message | 用户当前问题 |
conversationId | 会话编号,用于多轮上下文 |
scene | 场景标识,比如客服问答、知识库问答、合同抽取、工单摘要 |
stream | 是否启用流式输出 |
metadata | 文章 ID、用户 ID、来源页面等辅助信息 |
后端返回时建议保留:
| 字段 | 说明 |
|---|---|
answer | 模型回答 |
traceId | 排查问题用的链路 ID |
sources | 如果使用 RAG,可以返回引用文档 |
usage | Token 用量、耗时等统计信息 |
errorCode | 失败时给前端做友好提示 |
接口 Demo:后端代理百炼调用
下面是一个简化版后端代理示例。真实项目需要按百炼实际接口地址和鉴权方式调整。
python
import os
import requests
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ChatReq(BaseModel):
message: str
conversationId: str | None = None
@app.post("/ai/chat")
def chat(req: ChatReq):
if not req.message.strip():
return {"errorCode": "EMPTY_MESSAGE", "answer": "问题不能为空"}
response = requests.post(
os.getenv("BAILIAN_API_URL", "https://example.com/bailian/chat"),
headers={"Authorization": f"Bearer {os.getenv('BAILIAN_API_KEY')}"},
json={
"input": req.message,
"conversationId": req.conversationId,
},
timeout=30,
)
response.raise_for_status()
data = response.json()
return {
"answer": data.get("answer", ""),
"traceId": data.get("requestId"),
"sources": data.get("sources", []),
}这个 Demo 的重点是:前端只请求 /ai/chat,密钥、超时、错误处理和日志都放在后端。
生产环境注意点
- 超时控制:模型调用可能比普通接口慢,需要单独设置超时时间。
- 失败兜底:模型不可用时,前端要提示用户稍后重试,不能页面一直 loading。
- 内容安全:对用户输入和模型输出都要做基础过滤,避免违规内容直接展示。
- 成本监控:记录每日请求量、Token 用量和平均响应时长。
- 权限隔离:后台写作、私有知识库问答等功能要区分用户权限。
本页小结
百炼不是简单的“前端调接口”,更合理的方式是把它放在后端服务之后,由后端完成密钥保护、统一审计、异常处理和模型平台适配。
