在 Qwen Conference 上,QwenCloud 作为一站式 AI 开发平台正式亮相。对开发者而言,平台发布的消息本身并不重要,真正有意义的是:从模型调用、数据集管理、微调训练到应用部署,过去散落在不同工具里的步骤,能不能被统一到一条可追踪、可复现的链路里。本文不讨论发布会上的概念,而是从工程落地角度拆解 QwenCloud 能解决什么问题、开发环境如何准备,并用一个企业知识库问答机器人作为例子,走通一个完整的 AI 应用开发闭环。内容包括核心 API 参数、常见报错排查、生产环境注意事项和可复用的检查清单。
1. QwenCloud 解决什么问题:从模型调用到应用交付的链路整合
1.1 传统 AI 开发流程中的链路断裂
大多数 AI 应用开发者在开始一个新项目时,并不会立刻写模型调用代码,而是先解决一堆工具拼接问题。模型推理需要一个 API Token,数据处理需要单独写脚本,向量化需要调用一个 Embedding 接口,向量存储可能又要引入一套数据库,最终部署还要再写一个 Web 服务。每个环节都有独立的鉴权方式、配置格式和数据格式,任何一个节点出错,排查都费时。
这种碎片化开发的典型表现是:开发环境跑通一次之后,换一台机器或换一个项目就重新配置;测试环境和生产环境使用不同的 key 和资源,却很难在平台层面统一管理;同一个团队里,不同成员维护的调用代码风格不一致,接口版本升级后也很难及时同步。链路断裂的直接后果是,大量时间花在了“让工具协作”上,而不是花在“让模型解决业务问题”上。
QwenCloud 的一站式思路,是把模型、数据、训练、评测、部署这些环节放进同一个平台,用统一的项目空间和资源体系管理。开发者在平台侧完成数据标注或文档上传,在代码中通过 SDK 调用模型,训练任务和部署服务也由平台统一调度。这样做的价值不是消灭所有底层工具,而是减少上下文切换,让开发者可以把注意力集中在业务流程上。
1.2 一站式平台到底“一站式”在哪里
要判断一个 AI 开发平台是否真的是“一站式”,可以从模块完整度来看。平台只提供一个聊天 API 不叫一站式,还需要覆盖数据管理、模型微调、评测、部署和可观测性。下表从开发者视角对比传统工具组合与平台化能力的差异:
| 开发环节 | 传统工具组合 | 平台化能力 | 收益点 |
|---|---|---|---|
| 模型调用 | 各家模型 API 独立 key | 统一模型网关与 SDK | 接口风格一致,切换模型成本低 |
| 数据管理 | 自建文件服务器/数据库 | 数据集管理、版本化、自动解析 | 数据与模型任务绑定,可追溯 |
| 向量化与检索 | 手动调用 Embedding + 搭建向量库 | 内置 Embedding 模型与向量索引 | 减少组件集成调试 |
| 训练与微调 | 自建 GPU 集群或脚本 | 可视化训练任务、自动资源调度 | 降低训练门槛 |
| 评测 | 自写指标脚本 | 内置评测集与指标报表 | 客观比较模型效果 |
| 部署 | 自建服务、网关、监控 | 一键发布为 API 或应用 | 缩短交付周期 |
| 可观测 | 日志、监控分开配置 | 统一调用链路、Token 消耗、费用统计 | 排查问题和成本核算更直接 |
需要说明的是,平台并不能替代所有自建能力。如果现有团队已经在生产环境中稳定运行了一套向量数据库,没有必要因为使用 QwenCloud 就强行迁移。更好的做法是,把平台作为模型能力和数据管理中枢,通过 API 与现有基础设施对接。
1.3 QwenCloud 在 Qwen 生态中的定位
QwenCloud 并不是一个与 Qwen 系列模型无关的通用平台,它的核心优势在于和 Qwen 生态深度绑定。平台既提供托管好的 Qwen 系列模型,也支持开发者上传的数据集和基础模型进行微调。因此在选择平台时,需要先确认目标模型是否在平台支持列表中,比如文本生成、对话、Embedding、多模态等模型类型。
在实际项目中,这种绑定的意义在于:平台可以直接处理 Qwen 模型特有的 prompt 格式和参数,避免开发者从开源代码里再翻一遍模型文档。当 Qwen 模型发布新版本时,平台可以统一升级和兼容,开发者的业务代码只需要修改模型名称即可完成切换。
但也要留意,平台依赖越深,迁移成本也越高。比较稳妥的做法是,在业务层加一层模型调用抽象,不要把所有项目代码直接绑定某个平台的 Python SDK,这样即使后续切换模型提供商,改动范围也能控制在接口适配层。
2. 环境准备与账号初始化:先让一次模型调用跑通
2.1 准备工作清单
开始写代码之前,先把环境确认清楚。以个人开发或团队测试为例,需要准备以下内容:
| 项目 | 最低要求 | 说明 |
|---|---|---|
| 账号 | 能登录 QwenCloud 控制台 | 个人账号即可,生产环境建议使用组织账号 |
| API Key | 在控制台创建至少一个 | 用于 SDK 鉴权,保存时注意保密 |
| Python | 3.10 或更高版本 | 本文示例使用 Python |
| 网络环境 | 能访问 QwenCloud API 端点 | 生产环境需要有稳定的出网策略 |
| 依赖包 | openai、pyyaml、requests 等 | 具体版本以实际项目为准 |
这里要解释一下为什么使用openai这个包。很多模型平台都提供 OpenAI 风格的接口兼容层,这样可以复用生态里成熟的工具链,QwenCloud 也常常以兼容接口的方式开放模型能力。如果平台官方提供了独立 SDK,优先使用官方 SDK;没有的情况下,使用openai客户端指向平台的 base_url 也是一种可行方案。
2.2 创建 API Key 与项目空间
在 QwenCloud 控制台登录后,一般需要先创建一个项目空间。项目空间的作用是隔离资源,比如 API Key、数据集、模型服务和调用配额都归属于某个项目。建议按照业务线或应用名称创建项目,不要把所有环境放在同一个项目下,否则测试流量和生产流量难以区分。
创建好项目后,进入密钥管理页面生成一个 API Key。平台通常只会在创建时完整显示一次密钥,后续只显示脱敏后的字符串,因此一定在生成后立即保存到密码管理器或部署机环境变量里。密钥丢失后不要继续使用,直接删除并重新生成,避免历史密钥被泄露导致费用风险和安全隐患。
2.3 安装 SDK 并验证连接
使用 Python 作为演示环境,先安装依赖包:
pip install openai pyyaml requests安装完成后,建议把 API Key 写入环境变量,而不是直接写在脚本里:
export QWENCLOUD_API_KEY="sk-your-qwencloud-api-key-here" export QWENCLOUD_BASE_URL="https://api.qwencloud.example.com/v1"然后创建一个chat_demo.py:
import os from openai import OpenAI client = OpenAI( api_key=os.getenv("QWENCLOUD_API_KEY"), base_url=os.getenv("QWENCLOUD_BASE_URL"), ) response = client.chat.completions.create( model="qwen-plus", messages=[ {"role": "user", "content": "请用一句话介绍 QwenCloud"}, ], temperature=0.7, ) print(response.choices[0].message.content)执行:
python chat_demo.py这段代码的关键点有三个。第一,base_url使用的是平台提供的 OpenAI 兼容地址,具体路径要以控制台的接入文档为准。第二,model参数直接决定调用哪个模型,不同模型的价格和上下文长度不同。第三,messages是标准的角色消息结构,不能随意省略角色字段。
2.4 检查点:请求成功与失败时的结果
如果调用成功,终端会输出模型生成的文本。比如:
QwenCloud 是围绕 Qwen 模型生态构建的一站式 AI 开发平台,面向开发者提供模型调用、数据处理、微调训练和应用部署能力。如果调用失败,常见的错误响应包括401、403或404。看到401时优先检查 API Key 是否正确;看到403时检查项目权限或配额;看到404时检查 base_url 路径和模型名是否拼写正确。不要先看代码逻辑,先确认网络、地址、密钥这三项基础配置,因为它们的问题概率最高。
3. 实战案例:用 QwenCloud 搭建企业知识库问答机器人
3.1 需求拆解和总体流程
企业知识库问答是一个典型的 RAG(Retrieval-Augmented Generation,检索增强生成)场景。比如企业内部有大量政策文档、产品手册和操作规范,员工希望能像聊天一样提问,而模型不能只依靠自身训练时的记忆来回答,必须依据企业文档内容生成答案,否则容易出现幻觉。
整个流程可以拆成两条链路:一条离线链路负责处理文档,另一条在线链路负责回答用户问题。
离线链路:上传文档 -> 文档解析 -> 文本切片 -> 调用 Embedding 模型向量化 -> 写入向量存储。
在线链路:用户提问 -> 调用 Embedding 模型向量化 -> 从向量存储检索相关片段 -> 组装 Prompt -> 调用大模型生成答案。
这两条链路都需要在 QwenCloud 上使用模型和数据管理能力,也是“一站式”最典型的体现。
3.2 准备数据集与文档解析
准备一个简单的企业文档,比如employee_handbook.md,内容可以是一段关于请假流程的说明:
员工请假流程: 1. 提前一天在 OA 系统提交请假申请。 2. 填写请假类型、起止时间和事由。 3. 直属主管审批通过后,请假生效。 4. 请假超过 3 天需要部门负责人二次审批。然后通过平台的文件上传接口,把文档上传到项目空间。以下代码仅用于说明调用方式,实际接口路径和字段需要参考平台文档。
import requests upload_url = "https://api.qwencloud.example.com/v1/datasets/upload" headers = {"Authorization": "Bearer YOUR_API_KEY"} with open("employee_handbook.md", "rb") as f: resp = requests.post( upload_url, headers=headers, files={"file": f}, data={"dataset_name": "employee_handbook"} ) print(resp.json())文档解析是很容易忽略的一步。PDF、Word、Markdown 的解析结果差异很大,如果直接按字节切分,会把表格、标题、列表拆得支离破碎,导致后续检索效果变差。平台如果提供解析接口,应当优先使用;没有提供时,需要自己在代码里处理文本提取。
3.3 将文本切片并写入向量库
文本切片是影响 RAG 效果的重要因素。切片太短,单片段包含的信息不足;切片太长,向量化后的语义容易被无关内容稀释。一般来说,按段落和标题层级切分,每个切片控制在 200 到 500 个中文字符比较合适。
示例切片逻辑:
def split_text(text: str, chunk_size: int = 300, overlap: int = 50): paragraphs = [p.strip() for p in text.split("\n") if p.strip()] chunks = [] current = "" for para in paragraphs: if len(current) + len(para) > chunk_size and current: chunks.append(current) current = para else: current += "\n" + para if current: chunks.append(current) return chunks chunks = split_text(open("employee_handbook.md", encoding="utf-8").read()) for i, chunk in enumerate(chunks): print(i, chunk)切片之后调用 Embedding 接口生成向量。接口调用思路如下:
from openai import OpenAI client = OpenAI( api_key="YOUR_API_KEY", base_url="https://api.qwencloud.example.com/v1" ) embedding = client.embeddings.create( model="text-embedding-v2", input=chunks, ) vectors = [item.embedding for item in embedding.data]生成的向量维度取决于模型。不同维度会影响向量库的存储成本和检索速度,但不能简单认为维度越高越好,还要看模型与业务数据的匹配程度。
3.4 实现检索增强生成(RAG)问答链路
向量写入向量库之后,在线问答环节需要做三步:将用户问题向量化、检索相似片段、构造 Prompt 并调用生成模型。
这里给出一个简化实现:
import numpy as np def retrieve(query: str, top_k: int = 3): query_vec = client.embeddings.create( model="text-embedding-v2", input=[query], ).data[0].embedding scores = [] for i, vec in enumerate(vectors): score = np.dot(query_vec, vec) / ( np.linalg.norm(query_vec) * np.linalg.norm(vec) ) scores.append((score, chunks[i])) scores.sort(reverse=True, key=lambda x: x[0]) return [item[1] for item in scores[:top_k]] def answer_by_rag(query: str): contexts = retrieve(query) prompt = f"""请根据以下资料回答问题,如果资料中没有相关内容,请直接说明资料中未找到。 资料: {chr(10).join(f"- {ctx}" for ctx in contexts)} 问题:{query} """ response = client.chat.completions.create( model="qwen-plus", messages=[{"role": "user", "content": prompt}], temperature=0.3, ) return response.choices[0].message.content这里有两个设计点。第一,temperature在知识库问答场景中建议调低,比如 0.2 到 0.3,让回答更稳定,减少发散。第二,Prompt 中明确要求“资料中未找到就直接说明”,这是降低 RAG 幻觉最直接的方式。
3.5 运行验证与输出示例
输入问题:
员工请假超过 3 天需要谁审批?正常输出可能如下:
根据员工请假流程,请假超过 3 天需要部门负责人二次审批。同时把检索到的片段打印出来,用来排查“为什么模型这样回答”。
检索片段 0:员工请假流程... 检索片段 1:请假超过 3 天需要部门负责人二次审批。如果输出结果与文档不符,通常先检查检索片段,而不是怀疑模型能力。如果检索片段本身就没有包含正确信息,那么无论 Prompt 怎么写,模型都无法给出准确答案。
4. 核心 API、参数与数据流详解
4.1 模型推理 API 的请求结构
OpenAI 兼容的 Chat Completions 接口是理解 QwenCloud 模型调用的基础。一个请求大致如下:
{ "model": "qwen-plus", "messages": [ {"role": "system", "content": "你是一个企业知识库助手。"}, {"role": "user", "content": "请帮我查看请假超过3天需要谁审批。"} ], "temperature": 0.3, "top_p": 0.9, "max_tokens": 512 }字段含义:
| 参数 | 含义 | 注意事项 |
|---|---|---|
| model | 模型名称 | 必须以平台控制台提供的模型名为准 |
| messages | 对话消息序列 | system、user、assistant 角色要正确 |
| temperature | 采样随机性 | 0 到 2 之间,值越低越稳定 |
| top_p | 核采样概率 | 与 temperature 一般不要同时大幅调整 |
| max_tokens | 最大生成 token 数 | 过大增加费用,过小会截断输出 |
在实际项目中,不要把system角色当作摆设。它可以设定回答边界、输出格式、语言风格等,能显著影响对话质量。例如知识库助手可以把 system 设置为“只依据提供资料回答问题”。
4.2 Embedding 模型与向量检索的搭配
Embedding 模型的作用是把文本转换为向量。在 RAG 场景中,文档切片和用户问题必须使用同一个 Embedding 模型,否则两个向量不在同一语义空间,相似度计算没有意义。
向量库的选择也要考虑数据规模和部署方式。数据量只有几万条时,可以使用轻量级向量数据库;数据量达到百万级或需要高并发查询时,要评估索引类型、内存占用和弹性扩容。QwenCloud 如果提供内置向量索引,可以先使用内置能力,因为这样可以少维护一套基础设施,但如果后续检索质量不达标,需要能在自建向量库和平台索引之间切换。
4.3 微调任务的关键参数
除了直接调用现成模型,QwenCloud 作为一站式平台通常还支持微调。微调不是所有项目都必须做,但如果业务需要固定输出格式、特定术语或领域风格,微调比不断改 Prompt 更稳定。
常见微调参数如下:
| 参数 | 作用 | 设置建议 |
|---|---|---|
| epoch | 训练轮数 | 小数据集先试 2 到 3 轮 |
| learning_rate | 学习率 | 建议从 1e-5 开始尝试 |
| batch_size | 批大小 | 受显存限制,一般 4 到 16 |
| warmup_ratio | 预热比例 | 常用 0.03 到 0.1 |
| max_seq_len | 最大序列长度 | 超过长度会被截断 |
微调前需要准备训练数据集,数据格式通常为 JSONL,每一行是一个样本。对于对话模型,一般包含 system、user、assistant 三部分。数据集质量比数量更重要,几十条高质量样本的效果可能超过几千条噪音样本。
4.4 常用参数选型速查表
| 场景 | 推荐模型 | temperature | top_p | 建议 |
|---|---|---|---|---|
| 通用对话 | qwen-plus | 0.7 | 0.9 | 角色设定清晰 |
| 知识库问答 | qwen-plus | 0.3 | 0.8 | 必须配合检索片段 |
| 内容摘要 | qwen-long | 0.4 | 0.8 | 注意上下文长度 |
| 代码生成 | qwen-coder | 0.2 | 0.9 | 建议给出输入输出样例 |
| 文本分类 | qwen-turbo | 0.2 | 0.7 | 在 Prompt 中限定类别集合 |
这里的推荐值来自常见工程经验,不一定是所有业务的最优值。真正上线前应该用测试集对比多组参数,选择在准确率和召回率上最稳定的一组。
5. 常见报错与排查路径
5.1 鉴权失败、项目不存在与配额不足
现象:调用返回401 Unauthorized、403 Forbidden或429 Too Many Requests。
排查顺序:
- 检查 API Key 是否复制完整,前后是否有空格。
- 检查项目空间是否选错,key 是否属于当前项目。
- 检查账号余额或配额是否充足。
- 检查请求是否触发了平台限流,等待一段时间再试。
解决方案:如果是密钥问题,重新生成并更新环境变量;如果是配额不足,到控制台提升配额或优化调用频次;如果是限流,使用指数退避重试。
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 401 | API Key 错误或失效 | 控制台重新生成 | 更新环境变量并重启服务 |
| 403 | 项目权限不足 | 检查项目归属和权限 | 调整子账号权限 |
| 429 | 请求频率或并发超过限制 | 查看控制台配额 | 增加退避,启用限流客户端 |
5.2 请求格式或上下文超长
现象:返回400,错误信息中提示messages格式错误或context length exceeded。
通常原因包括:
- messages 中缺少角色字段。
- 内容不是合法字符串,传了数组或对象。
- 输入 token 数超过模型的上下文窗口。
max_tokens设置大于模型允许的最大生成长度。
解决方案:首先用len(messages)确认消息条数,再统计输入文本字符数。一般中文场景下,1 个汉字约等于 1 到 2 个 token,具体要看平台分词器。超长时,对历史消息做截断或摘要,而不是无脑把全部内容塞进上下文。
5.3 向量检索结果为空或相关性差
现象:RAG 回答时检索不到资料,或检索出来的片段完全答非所问。
排查顺序:
- 确认 Embedding 模型是否一致。
- 确认向量库中确实写入了文档向量。
- 检查切片长度,是否过短或过长。
- 检查
top_k是否太小,比如只取 1 导致漏掉关键信息。 - 检查相似度计算方式与向量维度是否匹配。
如果检索效果差,可以先手动打印检索片段,判断是不是切片导致的问题。切片时最好保留标题和段落结构,例如在employee_handbook.md中,把“请假超过 3 天需要部门负责人二次审批”这个关键信息作为一个完整切片,而不是被切到两个切片里。
5.4 调用超时与并发限制
现象:请求偶发超时,或者高峰期大量请求返回429。
解决策略:
- 设置合理的
timeout,比如 30 秒,避免无限等待。 - 对偶发错误使用重试机制,重试时需要带退避时间。
- 对大量用户请求使用异步队列,避免同步阻塞。
- 评估并发上限,在客户端做限流。
示例重试逻辑:
import time from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def call_with_retry(): return client.chat.completions.create( model="qwen-plus", messages=[{"role": "user", "content": "test"}], )需要说明的是,重试只在“临时性错误”时有意义。如果请求本身格式错误或密钥无效,重试再多次也没有用。因此重试前应检查错误码和错误信息,只对429、500、503这类可恢复错误重试。
6. 从 Demo 到生产:平台使用的工程化建议
6.1 不同环境的配置差异
学习环境跑通 Demo 之后,真正落地到生产还需要补很多工程内容。不同环境之间的差异主要体现在以下方面:
| 维度 | 学习/本地环境 | 测试环境 | 生产环境 |
|---|---|---|---|
| API Key | 个人 key | 独立测试项目 key | 独立生产项目 key |
| 日志 | 控制台输出 | 文件日志和搜索 | 集中日志平台 + 告警 |
| 监控 | 无 | 基础指标 | 调用成功率、token 消耗、延迟、费用 |
| 数据隔离 | 临时文件 | 测试数据集 | 正式数据集和版本管理 |
| 回滚 | 直接改代码 | 部署脚本 | 灰度发布和快速回滚 |
| 安全 | 本机调试 | 权限收口 | 密钥托管、IP 白名单、审计 |
6.2 密钥管理与配置外置
不要把 API Key 写死在代码或 Dockerfile 里。推荐做法是:
- 本地开发使用
.env文件,配置在.gitignore中忽略。 - CI/CD 环境使用流水线变量或密钥管理服务。
- 生产环境使用云厂商的密钥管理组件,让应用运行时从密钥中心读取。
- 定期轮换密钥,尤其在团队成员变动后。
示例.env文件:
QWENCLOUD_API_KEY=sk-prod-xxx QWENCLOUD_BASE_URL=https://api.qwencloud.example.com/v1 QWENCLOUD_PROJECT_ID=prod-project代码中通过环境变量读取,而不是读取本地文件,可以避免密钥进入版本库。
6.3 日志、监控与成本控制
生产环境中,AI 应用的日志和常规 Web 应用不同,你还需要记录模型调用级的元信息。推荐至少记录以下字段:
{ "request_id": "req_123456", "model": "qwen-plus", "input_tokens": 320, "output_tokens": 128, "latency_ms": 850, "temperature": 0.3, "user_id": "user_001", "scene": "knowledge_qa" }这些数据有以下用途:
- 排查单个请求失败原因。
- 统计业务场景下的 token 消耗和费用。
- 分析模型输出质量与参数量关系。
- 设置预算告警,避免异常调用导致费用飙升。
成本控制不能只靠事后看账单,要在代码层设置拦截点。例如在调用前检查单次输入长度,对超过阈值的请求先做压缩或拒绝;对内部测试流量和生产流量使用不同的模型规格,测试场景可以用 cheaper 的模型,生产场景再使用效果更好的模型。
6.4 发布前检查清单
上线前可以对照这份清单逐项检查:
| 检查项 | 检查内容 |
|---|---|
| 密钥 | 是否使用生产专用 key,是否已加入密钥管理平台 |
| 模型 | 模型名称是否与生产环境一致,是否经过版本确认 |
| 超时 | 是否设置合理 timeout,是否配置重试策略 |
| 限流 | 是否评估生产流量与平台配额上限 |
| 日志 | 是否记录 request_id 和 token 消耗 |
| 费用 | 是否设置消费预算和告警阈值 |
| 安全 | Prompt 是否包含敏感信息,接口是否做权限校验 |
| 回滚 | 是否可以在模型不可用时切到备用模型 |
这份清单在不同团队里可以继续补充,比如数据合规、内容审核、负载测试等,但核心思想是:每个模型调用都应该像数据库查询一样被对待,有权限、有日志、有限流、有回滚方案。
7. 下一步扩展方向
7.1 多轮对话与工具调用
企业知识库问答只是 RAG 的一种简化形态。实际业务通常需要多轮对话能力,比如用户先问“请假流程是什么”,再追问“如果我请两天呢”,系统需要从历史消息中识别出“两天”是在问请假流程,而不是回答“两天这个数字不存在”。
这时可以引入会话历史管理,把最近几轮问答压缩后放入上下文,同时借助工具调用能力让模型访问日历、审批系统或数据库。QwenCloud 如果提供 function calling 能力,可以试着把“查询考勤接口”“查询审批状态”注册为工具函数,让模型在回答中主动选择调用。
7.2 微调专属模型与评测
当通用模型在特定业务场景中始终不满意时,可以整理历史问答数据,进行监督微调。微调前先建立一个离线评测集,包含准确率、格式正确率、拒绝回答次数等指标。每次微调后都使用同样的评测集对比,避免只凭一两个案例感觉模型变好或变差。
平台化的优势在这一步会体现出来:数据集可以直接从平台的数据管理模块选择,训练任务交给平台调度,评测结果也可以在平台上生成报表。这样整个微调周期就不再需要在多个工具之间搬运数据。
7.3 多模型混合路由与安全审查
生产系统往往不会只依赖一个模型。低成本模型负责简单分类,高性能模型负责复杂推理,多模态模型处理图片,这种混合路由需要统一封装。建议把模型调用封装成一个服务层,路由规则用配置下发,便于在线调整。
同时,输出内容的安全审查不能完全依赖模型自身。平台如果提供内容审核接口,应当在生成结果返回给用户前进行拦截;如果平台没有提供,也可以使用独立的审核服务。尤其是面向 C 端用户的 AI 应用,这一步必须纳入上线流程,而不是写到“后续优化”清单里。
对于刚接触 QwenCloud 的开发者,建议按本文顺序先完成一次完整的知识库问答 Demo,再逐步加入会话管理、微调评测和工具调用。把一次调用跑通只是起点,真正有价值的是在一个可以运维、可以观测、可以迭代的平台上,把 AI 能力稳定地交付给业务。