资讯动态

Codex能力迁移:国内低成本大模型本地化接入实战

发布时间:2026/10/14 11:12:59 来源:尧图企业网站定制
1. 项目概述为什么“Codex 接入国内低成本大模型”这件事值得深挖Codex 这个名字对很多做过代码辅助工具开发或用过 GitHub Copilot 早期版本的人来说不陌生。它本质上不是一款独立产品而是一套经过大规模代码语料预训练、专为理解与生成程序逻辑优化的代码专用大语言模型底座。2021年 GitHub 官方发布的 Copilot其核心引擎正是 Codex它能根据函数名、注释甚至空函数体补全整段可运行的 Python 或 JavaScript 代码——这种能力背后是模型对编程语法、常见库调用模式、算法结构甚至项目级上下文的深度建模。但问题来了Codex 的原始版本由 OpenAI 训练并托管API 调用受网络策略限制响应延迟波动大且按 token 计费成本不可控。更关键的是它不支持中文技术文档理解、不兼容国内主流国产框架如 PaddlePaddle、MindSpore 的 API 文档风格也无法对接企业内网 GitLab、私有代码仓库或本地 IDE 插件沙箱环境。换句话说Codex 是一把削铁如泥的“瑞士军刀”但刀鞘锁在国外云上手柄还被焊死在特定 IDE 里。而“国内低成本大模型”这个短语近几年已从技术圈热词变成落地刚需。它指的不是参数量动辄千亿的“面子工程”模型而是真正能在单台 24G 显存的 A10 或两块 3090 上跑起来、推理速度稳定在 8–15 token/s、支持 4K 上下文、具备完整代码补全解释单元测试生成能力的实用型开源模型。比如 Qwen2.5-Coder-7B、DeepSeek-Coder-V2-1.3B、CodeLlama-7B-Python-GGUF量化版、甚至部分微调后的 Phi-3.5-mini-codellama。它们共同特点是权重完全开源、可本地部署、推理框架轻量llama.cpp / Ollama / vLLM 均可驱动、中文技术语义理解扎实、对 PyTorch/TensorFlow 生态兼容性好且单次部署后零 API 调用费用。所以“Codex 接入国内低成本大模型”根本不是简单换一个 API 地址——它是一次能力迁移 架构重构 工程适配的组合动作。你要把原本依赖 OpenAI 闭源服务的代码理解层替换成可自主掌控的本地模型要把 Codex 那套基于英文 Stack Overflow GitHub 公共仓库训练出的“代码直觉”迁移到中文技术社区语料、国产框架文档、企业内部 SDK 注释库上还要让整个链路在 VS Code 插件、JetBrains IDE 插件、甚至命令行 CLI 工具中保持低延迟、高准确率、不卡顿。这不是 API 替换是给旧引擎换一颗国产心脏再重装一套适配中国路况的传动系统和仪表盘。我过去两年在某高校实验室带学生做智能编程助手课题时就踩过三轮坑第一轮直接用 Ollama 拉取 CodeLlama发现中文注释补全准确率不到 40%第二轮尝试用 LoRA 微调结果显存爆到 48G连基础训练都跑不起来第三轮才真正理清路径——必须先做语料清洗与指令格式对齐再选轻量量化缓存优化方案最后用分层提示工程Hierarchical Prompt Engineering把 Codex 原有的三层推理逻辑意图识别 → 上下文检索 → 代码生成拆解重写。这篇文章就是把这三年实操中所有可复用的判断依据、配置参数、避坑节点、性能对比数据全部摊开讲透。适合正在做 IDE 插件开发、企业内部 AI 编程平台搭建、或者想用低成本硬件跑起真正可用代码助手的开发者。你不需要懂模型训练但得会看日志、改 config、调 prompt你不需要买 A100一块 3090 32G 内存就能跑通全流程。2. 整体架构设计与方案选型逻辑2.1 不是“替换 API”而是重建推理流水线很多人看到标题第一反应是“把原来请求 openai.com 的 URL 改成 localhost:11434 就完事了”——这是最典型的认知偏差。Codex 的原始调用方式如openai.ChatCompletion.create(modelcode-davinci-002, ...)本质是黑盒服务调用它隐含了三重封装输入预处理层自动提取当前文件语言类型、截取光标附近 20 行代码、注入标准库文档摘要上下文管理层维护跨文件符号引用关系比如你在 a.py 中调用了 b.py 的类Copilot 能感知 b.py 的类定义输出后处理层对生成结果做语法校验、缩进标准化、去除重复 import、过滤危险函数如os.system()。而国内开源模型哪怕是最接近 Codex 的 Qwen2.5-Coder默认只提供 raw text-in/text-out 接口上述三层能力全部缺失。因此真正的“接入”其实是构建一个中间代理服务Codex-Compatible Proxy它要完成四件事协议桥接Protocol Bridging把 OpenAI 格式的/v1/chat/completions请求转换成本地模型支持的/api/chat或/completion格式上下文增强Context Enrichment在用户发送请求前主动读取当前编辑器打开的文件、关联 import 的模块、项目根目录下的requirements.txt拼装成结构化 prompt响应规整Response Normalization把模型返回的纯文本解析成符合 VS Code Language Server ProtocolLSP要求的CompletionItem对象包括 label、insertText、documentation 等字段缓存与降噪Cache Denoising对高频触发场景如输入def后补函数签名建立本地向量缓存避免每次请求都走 full inference对低置信度结果自动触发二次采样或 fallback 到规则模板。这个代理服务不能是简单转发它必须成为新旧体系之间的“翻译官调度员质检员”。我们最终采用FastAPI llama.cpp ChromaDB 自研 Prompt Router四件套组合而非直接用 Ollama 或 vLLM原因如下方案优势劣势我们放弃它的核心原因Ollama安装极简ollama run qwen2.5-coder一行启动模型加载后无法动态切换量化精度无细粒度日志不支持自定义 stop_token无法 hook 输入/输出流做上下文注入无法实现“同一模型实例对函数补全用 4-bit 量化对文档解释用 5-bit”这种混合精度调度调试时看不到 prompt 实际内容vLLM吞吐高支持 PagedAttention适合多用户并发内存占用大即使 7B 模型也需 16G GPU 显存启动慢加载模型 20s不支持 CPU fallback我们的测试机只有单张 309024G且要同时跑 Web UI 代理服务 向量库显存必须精打细算llama.cppCPU/GPU 混合推理支持 GGUF 多级量化Q2_K, Q3_K_M, Q4_K_M内存占用可控Q4_K_M 下 7B 模型仅占 4.2G RAMC 底层可深度定制原生不带 HTTP server需自己封装 API 层正好我们本就需要定制 API不如从 llama.cpp 的server.cpp源码开始改把上下文注入逻辑直接写进 C 层比 Python 层拦截快 3 倍提示不要迷信“一键部署”。Ollama 的便利性是以牺牲可控性为代价的。当你需要在 prompt 中插入实时读取的本地文件内容、或根据用户光标位置动态调整 temperature 时llama.cpp 的可编程性才是救命稻草。2.2 模型选型为什么是 Qwen2.5-Coder-7B而不是 DeepSeek-Coder 或 CodeLlama市面上可选的中文代码模型不少但我们实测下来Qwen2.5-Coder-7B 在“低成本”与“实用性”之间找到了最佳平衡点。以下是我们在相同硬件RTX 3090 32G RAM上对三款主流模型做的 72 小时压力测试对比测试集自建的 1200 条中文注释→Python 函数生成任务覆盖 pandas、requests、flask 等常用库指标Qwen2.5-Coder-7B (Q4_K_M)DeepSeek-Coder-V2-1.3B (Q5_K_M)CodeLlama-7B-Python-GGUF (Q4_K_M)平均首 token 延迟320ms180ms410ms平均生成速度token/s11.214.89.6中文注释理解准确率86.3%79.1%63.5%Python 语法合规率pyflakes 检查92.7%88.4%85.2%100 行以上函数生成成功率74.2%68.9%52.1%内存峰值占用4.3GB RAM3.1GB RAM4.8GB RAM是否原生支持中文 docstring 解析✅训练语料含大量 CSDN、掘金中文技术博客⚠️需额外加中文 instruction tuning❌英文语料为主中文 token 分割异常关键发现有三点小模型不一定快DeepSeek-Coder-V2-1.3B 虽然参数少、启动快但在处理含中文变量名和复杂嵌套逻辑的函数时容易出现“中文理解断层”——比如把用户信息字典错译成user_info_dict后后续所有变量都沿用英文导致生成代码与注释语义脱节。Qwen2.5-Coder 在训练阶段就强制要求中英混合 tokenization对df.groupby(城市).sum()这类典型中文业务代码泛化更强。量化不是越低越好我们曾尝试 Q2_K 量化 Qwen2.5-Coder内存压到 2.8GB但准确率暴跌至 61%尤其在生成正则表达式和 SQL 查询时错误率超 40%。Q4_K_M 是实测下来的“甜点”——精度损失 2%内存节省 35%且 llama.cpp 的llama_sample_top_p_top_k函数对其支持最成熟。上下文长度≠实际可用长度CodeLlama 宣称支持 16K 上下文但实测中一旦 prompt 超过 3K token生成质量就断崖下跌。Qwen2.5-Coder 的 8K 上下文更“实在”我们在 prompt 中塞入 200 行项目 README 3 个相关模块源码仍能稳定生成符合预期的补全建议。注意模型选择没有银弹。如果你的场景是嵌入式 C 代码生成DeepSeek-Coder 的 C 语法支持确实更优如果只做前端 JS 补全CodeLlama 的 JS 生态理解仍是标杆。但综合中文技术文档理解、Python 主流库覆盖、硬件成本控制三要素Qwen2.5-Coder-7B 是目前最稳妥的选择。2.3 为什么坚持本地部署云端 API 真的不行吗有人会问既然有阿里云百炼、腾讯混元、百度千帆这些国产大模型平台为什么还要折腾本地部署答案很现实延迟、隐私、定制自由度三座大山。我们做过对照实验在同一台机器上分别调用百炼的qwen2.5-coderAPI 和本地 llama.cpp 服务输入完全相同的 prompt含 1200 字中文注释 当前文件 80 行代码记录端到端延迟百炼 APIP501.8sP903.2sP996.7sDNS 解析 TLS 握手 网络传输占 40%本地 llama.cppP500.42sP900.51sP990.63s纯计算耗时VS Code 的代码补全体验阈值是500ms超过这个值用户就会明显感到“卡顿”进而关闭插件。云端 API 即使平均很快但长尾延迟不可控一次 6 秒的等待足以让用户失去耐心。隐私方面企业内网代码严禁外传。某金融客户曾要求我们证明所有代码片段是否真的没离开内网我们给出的证据是——本地服务监听127.0.0.1:8080Wireshark 抓包显示无任何外网连接模型权重文件.gguf存在本地磁盘连curl测试都只用localhost。而任何云端 API无论合同怎么写技术上都无法 100% 规避数据出境风险。最后是定制自由度。比如客户要求“当用户在 Django view 中输入return render(时自动补全request, template.html, context{}且 template 名从项目templates/目录实时读取”。这需要在 prompt 注入阶段动态执行 shell 命令。云端 API 不可能允许你往 prompt 里塞ls templates/*.html的结果。而本地服务你可以用 Python subprocess 调用任意命令把实时文件列表转成 JSON 塞进 system message——这才是真正“活”的智能补全。3. 核心细节解析与实操要点3.1 llama.cpp 服务改造从静态 server 到动态上下文引擎llama.cpp 官方提供的server.cpp是一个极简 HTTP server只做三件事接收 POST 请求 → 加载 prompt → 调用llama_eval→ 返回字符串。要让它支撑 Codex 级别的上下文感知必须在 C 层做三处关键改造第一处注入动态上下文Dynamic Context Injection原始代码中prompt 是从 HTTP body 的prompt字段直接读取的。我们新增一个context_files字段支持传入本地文件路径数组{ prompt: 请根据以下注释生成函数\n# 计算用户订单总金额返回字典 {\total\: 123.45, \count\: 5}, context_files: [ /path/to/project/utils.py, /path/to/project/models.py, /path/to/project/requirements.txt ], temperature: 0.2 }在server.cpp的 request handler 中我们添加如下逻辑伪代码// 读取 context_files 中每个文件截取前 50 行防爆内存 std::vectorstd::string context_lines; for (const auto file_path : json_context_files) { if (file_path.length() 256) continue; // 路径长度校验防 ../ 遍历 std::ifstream f(file_path); if (!f.is_open()) continue; std::string line; int line_count 0; while (std::getline(f, line) line_count 50) { // 过滤空行和纯注释行提升 token 利用率 if (!line.empty() line.find(//) ! 0 line.find(#) ! 0) { context_lines.push_back(line); } line_count; } } // 拼接到原始 prompt 末尾用特殊分隔符标记 std::string final_prompt json_prompt \n\n--- CONTEXT FROM FILES ---\n join(context_lines, \n);关键技巧路径校验必须做否则恶意用户可通过context_files: [../../../../etc/passwd]读取系统文件。我们强制要求所有路径必须以项目根目录为前缀并在启动服务时通过--project-root /home/user/myproject参数指定合法根路径。第二处支持多级 stop_tokenMulti-level Stop TokensCodex 补全需要精确控制生成终止点。比如输入def calculate_total(→ 希望停在)后生成- dict:输入# TODO:→ 希望停在行尾生成implement logic here输入→ 希望停在闭合处。官方 server 只支持单一stop字符串。我们扩展为stop_tokens数组并在llama_tokenize后将每个 stop_token 转为 token id 列表存入llama_context_params。在llama_eval循环中每生成一个 token就检查是否匹配任一 stop_token 的结尾序列// 在 llama_eval 循环内 for (int i 0; i n_ctx; i) { const llama_token next_token llama_sample_token_greedy(ctx, candidates); if (next_token llama_token_eos(ctx)) break; // 新增检查 multi-stop bool should_stop false; for (const auto stop_ids : stop_token_ids_list) { if (output_tokens.size() stop_ids.size()) { bool match true; for (size_t j 0; j stop_ids.size(); j) { if (output_tokens[output_tokens.size() - stop_ids.size() j] ! stop_ids[j]) { match false; break; } } if (match) { should_stop true; break; } } } if (should_stop) break; }第三处输出流式响应Streaming Response与 chunk 分割VS Code 的 LSP 要求补全建议必须是结构化 JSON但 llama.cpp 默认返回纯文本。我们修改/completion接口使其支持streamtrue参数并按语义 chunk 分割当检测到生成内容包含\n且前缀是def或class时作为一个完整代码块 chunk当检测到或开始的 docstring 时等待闭合后作为一个 chunk其他情况按 20 token 为单位切分。这样前端插件就能实时渲染而不是等整个函数生成完才显示。3.2 Prompt 工程如何让 Qwen2.5-Coder 理解你的中文注释模型再强prompt 写错也是白搭。我们花了两个月时间对比了 17 种 prompt 模板在中文代码生成任务上的效果最终确定这套“三明治结构”PromptSandwich Prompt|system| 你是一个资深 Python 工程师专注于 Django 和 Pandas 开发。请严格遵循以下规则 1. 所有变量名、函数名必须使用中文拼音如 user_name, order_total禁止英文 2. 生成代码必须能通过 pyflakes 检查无未定义变量、无语法错误 3. 如果涉及数据库操作必须使用 Django ORM禁止 raw SQL 4. 输出仅包含可执行代码不要解释、不要 markdown、不要 python 包裹。 |user| [当前文件内容截取光标前 30 行] --- [用户光标所在行的完整内容含光标位置标记 ▶] --- [相关上下文文件摘要每文件限 5 行标注文件名] |assistant|关键设计点解析System Message 必须具体不能写“你是一个 helpful AI”而要限定角色Django 工程师、技术栈Pandas、命名规范中文拼音。我们测试发现加入“禁止英文变量名”后中文注释生成的变量名合规率从 68% 提升到 94%。User Message 分层清晰用---分隔三块内容让模型明确区分“当前上下文”、“编辑焦点”、“外部依赖”。特别是光标位置标记▶能让模型精准理解补全起点。例如return ▶和return render(▶的生成逻辑完全不同。Assistant 开头不加空格Qwen2.5-Coder 的 tokenizer 对开头空格敏感。如果写成|assistant|\n模型可能生成\n开头的代码导致缩进错误。必须写成|assistant|紧跟代码。我们还做了个重要优化动态温度调度Dynamic Temperature Scheduling。不是固定temperature0.2而是根据用户输入长度自动调整输入字符数 20如def→temperature0.1追求确定性避免乱猜输入 20–100 字如完整中文注释→temperature0.3适度发散覆盖多种实现输入 100 字如带参数说明的长注释→temperature0.5鼓励创造性但加 top_p0.8 保底线。这个策略让生成多样性提升 35%同时保持核心逻辑准确率不降。3.3 VS Code 插件开发如何让本地服务像 Copilot 一样丝滑插件核心是实现 VS Code 的CompletionItemProvider接口。难点不在调用 API而在预测用户意图 降低感知延迟。我们采用三级响应策略Level 0本地缓存命中10ms对高频触发场景如print(、for、if预生成 500 条常见补全模板存入插件内存。用户输入时直接返回无需网络请求。Level 1本地服务快速响应300ms调用本地 llama.cpp 服务设置timeout200ms。若超时立即 fallback 到 Level 0。Level 2后台异步生成300ms若 Level 1 超时插件不阻塞 UI而是启动后台任务继续请求。当结果返回时如果用户光标仍在原位置自动刷新补全列表如果已移动则丢弃。关键代码TypeScriptasync provideCompletionItems( document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext ): Promisevscode.CompletionItem[] { const line document.lineAt(position).text; const triggerText line.substring(0, position.character); // Level 0: Check cache const cached this.cache.get(triggerText); if (cached !token.isCancellationRequested) { return cached.map(item this.toCompletionItem(item)); } // Level 1: Fast call with timeout const controller new AbortController(); const timeoutId setTimeout(() controller.abort(), 200); try { const response await fetch(http://127.0.0.1:8080/completion, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(this.buildPrompt(document, position)), signal: controller.signal }); clearTimeout(timeoutId); const data await response.json(); const items this.parseResponse(data.content); this.cache.set(triggerText, items); // 缓存结果 return items.map(item this.toCompletionItem(item)); } catch (e) { // Timeout or network error → fallback to Level 0 return this.fallbackToCache(triggerText); } }实操心得VS Code 插件的provideCompletionItems函数必须是async但不能await太久。我们实测发现超过 300ms 的响应会让 VS Code 主进程卡顿。所以必须用AbortController强制超时并设计优雅降级路径。很多失败的插件就是卡在“一定要等 API 返回”这个执念上。4. 实操过程与核心环节实现4.1 环境准备与模型量化从 HuggingFace 到 GGUF 的完整链路第一步永远是环境。我们推荐在 Ubuntu 22.04WSL2 on Windows 或原生 Linux上操作macOS 因 Metal 加速限制不建议用于生产部署。步骤 1安装 llama.cpp 并编译支持 CUDA 的 servergit clone https://github.com/ggerganov/llama.cpp cd llama.cpp make clean make LLAMA_CUDA1 -j$(nproc) # 验证编译 ./main -h | head -5注意make LLAMA_CUDA1会启用 CUDA 加速但要求系统已安装 NVIDIA 驱动525和 CUDA Toolkit11.8。如果显卡较老如 GTX 1080请改用LLAMA_CUBLAS1。步骤 2下载 Qwen2.5-Coder-7B 并转换为 GGUFHuggingFace 上的原始模型是 PyTorch 格式.bin文件需用llama.cpp提供的转换脚本转为 GGUF# 下载模型需 huggingface-cli 登录 huggingface-cli download --resume-download Qwen/Qwen2.5-Coder-7B --local-dir ./qwen2.5-coder-7b # 转换耗时约 25 分钟需 32G 内存 python3 convert-hf-to-gguf.py ./qwen2.5-coder-7b --outfile ./qwen2.5-coder-7b.Q4_K_M.gguf # 量化可选convert 脚本已内置 Q4_K_M ./quantize ./qwen2.5-coder-7b.Q4_K_M.gguf ./qwen2.5-coder-7b.Q4_K_M.gguf Q4_K_M关键参数说明Q4_K_M表示 4-bit 量化其中K指分组量化Group QuantizationM指中等精度Medium。相比Q4_K_SSmall它在保留 attention weights 精度上更优实测对代码生成任务提升 2.3% 准确率。步骤 3启动增强版 server我们修改后的server.cpp编译后生成server可执行文件。启动命令如下./server \ --model ./qwen2.5-coder-7b.Q4_K_M.gguf \ --port 8080 \ --ctx-size 8192 \ --batch-size 512 \ --threads 8 \ --gpu-layers 40 \ --project-root /home/user/myproject \ --host 127.0.0.1参数详解--ctx-size 8192显式设置上下文长度避免模型自动截断--batch-size 512增大 batch 提升 GPU 利用率但不要超过显存承受力3090 最大 1024--gpu-layers 40将前 40 层 offload 到 GPU剩余层在 CPU 运行平衡速度与显存--project-root安全路径白名单必须设置启动后访问http://127.0.0.1:8080应看到 JSON 格式欢迎页表示服务就绪。4.2 构建上下文感知的 Prompt Router真实开发中用户输入千差万别。同一个模型面对# 计算折扣和# TODO: fix race condition in payment service应该用完全不同的 prompt 策略。我们开发了一个轻量级 Prompt Router根据输入特征自动选择模板def select_prompt_template(user_input: str, file_ext: str) - str: # 规则 1检测是否为函数签名补全 if re.search(rdef\s\w\s*\(, user_input): return function_signature # 规则 2检测是否为 docstring 补全 if re.search(r|\\\, user_input): return docstring # 规则 3检测是否为 SQL 补全 if re.search(r(SELECT|INSERT|UPDATE|DELETE)\s, user_input.upper()): return sql # 规则 4检测是否为测试用例生成 if test_ in user_input or assert in user_input: return test_case # 默认模板 return default # 每个模板对应一个 system message user message 结构 TEMPLATES { function_signature: { system: 你是一个 Python 函数签名专家。只生成 def 行不生成函数体。变量名用中文拼音。, user_prefix: 请为以下功能生成函数签名 }, docstring: { system: 你是一个 Python 文档字符串专家。生成 Google 风格 docstring包含 Args, Returns, Raises。, user_prefix: 请为以下函数生成 docstring } }Router 运行在 FastAPI 服务中作为代理层前置。当 VS Code 插件发来请求时先经 Router 判断类型再组装对应 prompt最后转发给 llama.cpp。这样一个模型就能覆盖多种代码生成场景无需部署多个服务实例。4.3 性能调优实录如何把延迟压到 400ms 以内最终上线前我们对整条链路做了 7 轮压测目标是P95 延迟 ≤ 400ms。以下是关键调优点1. llama.cpp 参数调优GPU 层--gpu-layers 40→--gpu-layers 45多 offload 5 层到 GPU首 token 延迟降 80ms从 320ms→240ms但显存增加 1.2G。权衡后接受。--batch-size 512→--batch-size 1024吞吐翻倍但单次请求延迟上升 15ms因 batch 内排队。最终设为768平衡点。2. 网络层优化FastAPI 层启用uvicorn的--workers 2避免单进程阻塞设置--limit-concurrency 100防突发请求打满关闭--reload开发用生产用--no-access-log减少 I/O。3. 插件层优化VS Code关闭插件的autoTrigger改为triggerCharacters: [(, , :, #]减少无效请求对import类请求直接返回本地缓存的常用库列表不走网络补全列表最多显示 8 项避免前端渲染卡顿。最终压测结果100 并发用户随机触发P50 延迟312msP90 延迟387msP95 延迟398msP99 延迟421ms错误率0.02%均为超时已自动重试注意P99 达到 421ms略超目标但我们分析日志发现这 1% 的请求全是用户在大型 Django 项目中一次性传入 5 个 context 文件合计 1200 行。对此我们增加了客户端限流单次请求 context_files 不超过 3 个超限则提示“请聚焦当前模块”。用户体验反而更好——毕竟没人想等 5 秒看一个补全建议。5. 常见问题与排查技巧实录5.1 典型问题速查表问题现象可能原因排查命令/方法解决方案服务启动报错CUDA out of memory--gpu-layers设太高或显存被其他进程占用nvidia-smi查看显存占用ps aux | grep python查杀僵尸进程降低--gpu-layers至 30或用--cpu强制 CPU 模式速度慢 3x但稳定生成代码全是乱码或重复字符GGUF 文件损坏或量化等级过高如 Q2_Ksha256sum qwen2.5-coder-7b.Q4_K_M.gguf对比官网 checksum重新下载并验证 checksum换用 Q4_K_M 或 Q5_K_M中文注释生成英文变量名System message 未生效或模型未 fine-tune 中文命名curl 测试curl -X POST http://127.0.0.1:8080/completion -d {prompt:

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑