Skip to content

应用详情

本应用为阿里云百炼

阿里云百炼

这个页面对应项目中 AI 应用接入的现状说明。

为什么要通过后端代理

前端页面不能直接暴露模型 API Key,也不应该让浏览器直接决定模型、Prompt、权限和日志策略。正确做法是让前端只提交用户问题,后端负责鉴权、组装 Prompt、调用百炼、记录日志和处理错误。

如果直接在前端调用模型,密钥会泄露,接口无法统一限流,用户也可能绕过页面直接构造请求。后端代理不是多此一举,而是 AI 应用安全和治理的基本边界。

你现在项目里的 AI 页面大致链路

  1. 前端聊天页面负责输入和展示。
  2. 前端通过请求模块把问题发给后端。
  3. 后端再转发给模型服务。
  4. 模型返回结果后再展示到页面。

一次问答流程

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: 展示回答

这种方式的好处是:

  1. 密钥不暴露到浏览器。
  2. 后端可以统一做鉴权、限流和审计。
  3. 后续更换模型平台时,只需要改后端适配层。
  4. 可以把敏感词、上下文拼接、失败兜底放在服务端统一处理。

接口设计建议

一个最小可用的聊天接口可以包含这些字段:

字段说明
message用户当前问题
conversationId会话编号,用于多轮上下文
scene场景标识,比如客服问答、知识库问答、合同抽取、工单摘要
stream是否启用流式输出
metadata文章 ID、用户 ID、来源页面等辅助信息

后端返回时建议保留:

字段说明
answer模型回答
traceId排查问题用的链路 ID
sources如果使用 RAG,可以返回引用文档
usageToken 用量、耗时等统计信息
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,密钥、超时、错误处理和日志都放在后端。

生产环境注意点

  1. 超时控制:模型调用可能比普通接口慢,需要单独设置超时时间。
  2. 失败兜底:模型不可用时,前端要提示用户稍后重试,不能页面一直 loading。
  3. 内容安全:对用户输入和模型输出都要做基础过滤,避免违规内容直接展示。
  4. 成本监控:记录每日请求量、Token 用量和平均响应时长。
  5. 权限隔离:后台写作、私有知识库问答等功能要区分用户权限。

本页小结

百炼不是简单的“前端调接口”,更合理的方式是把它放在后端服务之后,由后端完成密钥保护、统一审计、异常处理和模型平台适配。