SmallThinker-3B-Preview实战教程结合Ollama REST API构建Web端COT推理服务1. 快速了解SmallThinker-3B-PreviewSmallThinker-3B-Preview是一个基于Qwen2.5-3b-Instruct模型微调而来的轻量级AI模型。这个模型专门为两个核心场景设计边缘设备部署模型体积小巧可以在资源有限的设备上流畅运行高效草稿生成作为更大模型的快速草稿生成器速度提升可达70%这个模型最大的特点是擅长进行链式思维COT推理能够生成超长的推理过程。为了实现这个能力开发者使用了多种合成技术创建了专门的数据集其中超过75%的样本输出长度超过8000个token。2. 环境准备与Ollama部署2.1 安装Ollama框架首先需要安装Ollama框架这是运行SmallThinker模型的基础环境# Linux/macOS 安装命令 curl -fsSL https://ollama.ai/install.sh | sh # Windows 安装 # 访问 https://ollama.ai/download 下载安装包安装完成后启动Ollama服务# 启动服务 ollama serve2.2 拉取SmallThinker模型通过Ollama拉取SmallThinker-3B-Preview模型# 拉取模型 ollama pull smallthinker:3b # 验证模型是否可用 ollama list如果看到smallthinker:3b在列表中说明模型拉取成功。2.3 测试模型运行使用命令行测试模型是否正常工作# 简单测试 ollama run smallthinker:3b 请用链式思维解释如何泡一杯好茶如果看到模型开始生成回答说明部署成功。3. 构建Web服务端3.1 创建基础Web服务器我们使用Python Flask框架来构建Web服务from flask import Flask, request, jsonify import requests import json app Flask(__name__) # Ollama API配置 OLLAMA_URL http://localhost:11434/api/generate app.route(/health, methods[GET]) def health_check(): return jsonify({status: healthy, model: smallthinker:3b}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)3.2 实现推理API接口添加核心的推理接口app.route(/api/infer, methods[POST]) def inference(): try: data request.json prompt data.get(prompt, ) if not prompt: return jsonify({error: 请输入问题内容}), 400 # 构建Ollama请求 ollama_payload { model: smallthinker:3b, prompt: prompt, stream: False } # 调用Ollama API response requests.post(OLLAMA_URL, jsonollama_payload) response.raise_for_status() result response.json() return jsonify({ response: result.get(response, ), status: success }) except Exception as e: return jsonify({error: str(e)}), 5003.3 添加链式思维推理支持为了充分发挥SmallThinker的COT能力我们增强推理接口def enhance_for_cot(prompt): 增强提示词以激发链式思维推理 cot_prompt f请用链式思维一步步推理的方式回答以下问题。在给出最终答案前请展示完整的思考过程。 问题{prompt} 请开始你的推理 return cot_prompt app.route(/api/cot-infer, methods[POST]) def cot_inference(): try: data request.json user_prompt data.get(prompt, ) if not user_prompt: return jsonify({error: 请输入问题内容}), 400 # 增强提示词用于COT推理 enhanced_prompt enhance_for_cot(user_prompt) ollama_payload { model: smallthinker:3b, prompt: enhanced_prompt, stream: False, options: { temperature: 0.7, top_p: 0.9, num_ctx: 8192 # 支持长上下文 } } response requests.post(OLLAMA_URL, jsonollama_payload) response.raise_for_status() result response.json() return jsonify({ response: result.get(response, ), thinking_process: extract_thinking_process(result.get(response, )), status: success }) except Exception as e: return jsonify({error: str(e)}), 500 def extract_thinking_process(response): 从响应中提取思维过程简化版 # 实际实现可以根据响应格式进行调整 return response4. 构建前端界面4.1 创建简单HTML界面!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleSmallThinker推理服务/title style body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } .container { border: 1px solid #ddd; padding: 20px; border-radius: 8px; } textarea { width: 100%; height: 100px; margin-bottom: 10px; } button { padding: 10px 20px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } .response { margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 4px; white-space: pre-wrap; } /style /head body div classcontainer h1SmallThinker推理服务/h1 textarea idpromptInput placeholder请输入您的问题.../textarea div button onclicksendRequest(false)普通推理/button button onclicksendRequest(true) stylebackground: #28a745;链式思维推理/button /div div idresponse classresponse/div /div script async function sendRequest(isCOT) { const prompt document.getElementById(promptInput).value; const responseDiv document.getElementById(response); if (!prompt) { responseDiv.innerHTML 请输入问题内容; return; } responseDiv.innerHTML 思考中...; try { const endpoint isCOT ? /api/cot-infer : /api/infer; const response await fetch(endpoint, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ prompt: prompt }) }); const data await response.json(); if (data.status success) { responseDiv.innerHTML data.response; } else { responseDiv.innerHTML 错误: data.error; } } catch (error) { responseDiv.innerHTML 请求失败: error.message; } } /script /body /html4.2 集成前端到Flask服务在Flask应用中添加静态文件服务from flask import send_from_directory app.route(/) def serve_frontend(): return send_from_directory(., index.html) app.route(/path:path) def serve_static(path): return send_from_directory(., path)5. 高级功能与优化5.1 添加流式输出支持为了更好的用户体验添加流式输出功能app.route(/api/stream-infer, methods[POST]) def stream_inference(): def generate(): data request.json prompt data.get(prompt, ) if not prompt: yield data: {error: 请输入问题内容}\n\n return ollama_payload { model: smallthinker:3b, prompt: prompt, stream: True } try: with requests.post(OLLAMA_URL, jsonollama_payload, streamTrue) as response: response.raise_for_status() for line in response.iter_lines(): if line: decoded_line line.decode(utf-8) json_data json.loads(decoded_line) if response in json_data: yield fdata: {json.dumps({chunk: json_data[response]})}\n\n if json_data.get(done, False): yield data: {done: true}\n\n except Exception as e: yield fdata: {{error: {str(e)}}}\n\n return Response(generate(), mimetypetext/event-stream)5.2 前端流式输出支持更新前端JavaScript以支持流式输出async function streamRequest(isCOT) { const prompt document.getElementById(promptInput).value; const responseDiv document.getElementById(response); if (!prompt) { responseDiv.innerHTML 请输入问题内容; return; } responseDiv.innerHTML 思考中...; try { const endpoint isCOT ? /api/cot-stream : /api/stream-infer; const response await fetch(endpoint, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ prompt: prompt }) }); const reader response.body.getReader(); const decoder new TextDecoder(); let accumulatedText ; while (true) { const { value, done } await reader.read(); if (done) break; const chunk decoder.decode(value); const lines chunk.split(\n); for (const line of lines) { if (line.startsWith(data: )) { const data line.slice(6); if (data) { try { const parsed JSON.parse(data); if (parsed.chunk) { accumulatedText parsed.chunk; responseDiv.innerHTML accumulatedText; } if (parsed.done) { return; } } catch (e) { console.error(解析错误, e); } } } } } } catch (error) { responseDiv.innerHTML 请求失败: error.message; } }6. 部署与优化建议6.1 生产环境部署对于生产环境建议使用WSGI服务器# 安装gunicorn pip install gunicorn # 启动服务 gunicorn -w 4 -b 0.0.0.0:5000 your_app:app6.2 性能优化配置在Ollama配置中优化模型性能# 创建或修改 ~/.ollama/config.json { models: { smallthinker:3b: { num_gpu: 1, num_thread: 8, batch_size: 512 } } }6.3 安全增强建议添加基础安全措施from flask_cors import CORS from flask_limiter import Limiter from flask_limiter.util import get_remote_address # 添加CORS支持 CORS(app) # 添加速率限制 limiter Limiter( get_remote_address, appapp, default_limits[200 per day, 50 per hour] ) app.route(/api/infer, methods[POST]) limiter.limit(10 per minute) def inference(): # 原有代码不变7. 总结通过本教程我们成功构建了一个基于SmallThinker-3B-Preview模型的Web端链式思维推理服务。这个方案具有以下特点核心优势轻量级部署适合资源受限环境完整的链式思维推理能力展示流式输出提供更好的用户体验易于扩展和定制适用场景教育领域的推理教学辅助研究机构的思维过程分析企业内部的推理决策支持个人学习与知识探索下一步改进方向添加对话历史管理支持多模态输入输出实现模型性能监控添加用户认证和权限管理这个解决方案展示了如何将先进的AI模型与实用的Web技术结合为链式思维推理提供了可落地的实现方案。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
SmallThinker-3B-Preview实战教程:结合Ollama REST API构建Web端COT推理服务
SmallThinker-3B-Preview实战教程结合Ollama REST API构建Web端COT推理服务1. 快速了解SmallThinker-3B-PreviewSmallThinker-3B-Preview是一个基于Qwen2.5-3b-Instruct模型微调而来的轻量级AI模型。这个模型专门为两个核心场景设计边缘设备部署模型体积小巧可以在资源有限的设备上流畅运行高效草稿生成作为更大模型的快速草稿生成器速度提升可达70%这个模型最大的特点是擅长进行链式思维COT推理能够生成超长的推理过程。为了实现这个能力开发者使用了多种合成技术创建了专门的数据集其中超过75%的样本输出长度超过8000个token。2. 环境准备与Ollama部署2.1 安装Ollama框架首先需要安装Ollama框架这是运行SmallThinker模型的基础环境# Linux/macOS 安装命令 curl -fsSL https://ollama.ai/install.sh | sh # Windows 安装 # 访问 https://ollama.ai/download 下载安装包安装完成后启动Ollama服务# 启动服务 ollama serve2.2 拉取SmallThinker模型通过Ollama拉取SmallThinker-3B-Preview模型# 拉取模型 ollama pull smallthinker:3b # 验证模型是否可用 ollama list如果看到smallthinker:3b在列表中说明模型拉取成功。2.3 测试模型运行使用命令行测试模型是否正常工作# 简单测试 ollama run smallthinker:3b 请用链式思维解释如何泡一杯好茶如果看到模型开始生成回答说明部署成功。3. 构建Web服务端3.1 创建基础Web服务器我们使用Python Flask框架来构建Web服务from flask import Flask, request, jsonify import requests import json app Flask(__name__) # Ollama API配置 OLLAMA_URL http://localhost:11434/api/generate app.route(/health, methods[GET]) def health_check(): return jsonify({status: healthy, model: smallthinker:3b}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)3.2 实现推理API接口添加核心的推理接口app.route(/api/infer, methods[POST]) def inference(): try: data request.json prompt data.get(prompt, ) if not prompt: return jsonify({error: 请输入问题内容}), 400 # 构建Ollama请求 ollama_payload { model: smallthinker:3b, prompt: prompt, stream: False } # 调用Ollama API response requests.post(OLLAMA_URL, jsonollama_payload) response.raise_for_status() result response.json() return jsonify({ response: result.get(response, ), status: success }) except Exception as e: return jsonify({error: str(e)}), 5003.3 添加链式思维推理支持为了充分发挥SmallThinker的COT能力我们增强推理接口def enhance_for_cot(prompt): 增强提示词以激发链式思维推理 cot_prompt f请用链式思维一步步推理的方式回答以下问题。在给出最终答案前请展示完整的思考过程。 问题{prompt} 请开始你的推理 return cot_prompt app.route(/api/cot-infer, methods[POST]) def cot_inference(): try: data request.json user_prompt data.get(prompt, ) if not user_prompt: return jsonify({error: 请输入问题内容}), 400 # 增强提示词用于COT推理 enhanced_prompt enhance_for_cot(user_prompt) ollama_payload { model: smallthinker:3b, prompt: enhanced_prompt, stream: False, options: { temperature: 0.7, top_p: 0.9, num_ctx: 8192 # 支持长上下文 } } response requests.post(OLLAMA_URL, jsonollama_payload) response.raise_for_status() result response.json() return jsonify({ response: result.get(response, ), thinking_process: extract_thinking_process(result.get(response, )), status: success }) except Exception as e: return jsonify({error: str(e)}), 500 def extract_thinking_process(response): 从响应中提取思维过程简化版 # 实际实现可以根据响应格式进行调整 return response4. 构建前端界面4.1 创建简单HTML界面!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleSmallThinker推理服务/title style body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } .container { border: 1px solid #ddd; padding: 20px; border-radius: 8px; } textarea { width: 100%; height: 100px; margin-bottom: 10px; } button { padding: 10px 20px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } .response { margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 4px; white-space: pre-wrap; } /style /head body div classcontainer h1SmallThinker推理服务/h1 textarea idpromptInput placeholder请输入您的问题.../textarea div button onclicksendRequest(false)普通推理/button button onclicksendRequest(true) stylebackground: #28a745;链式思维推理/button /div div idresponse classresponse/div /div script async function sendRequest(isCOT) { const prompt document.getElementById(promptInput).value; const responseDiv document.getElementById(response); if (!prompt) { responseDiv.innerHTML 请输入问题内容; return; } responseDiv.innerHTML 思考中...; try { const endpoint isCOT ? /api/cot-infer : /api/infer; const response await fetch(endpoint, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ prompt: prompt }) }); const data await response.json(); if (data.status success) { responseDiv.innerHTML data.response; } else { responseDiv.innerHTML 错误: data.error; } } catch (error) { responseDiv.innerHTML 请求失败: error.message; } } /script /body /html4.2 集成前端到Flask服务在Flask应用中添加静态文件服务from flask import send_from_directory app.route(/) def serve_frontend(): return send_from_directory(., index.html) app.route(/path:path) def serve_static(path): return send_from_directory(., path)5. 高级功能与优化5.1 添加流式输出支持为了更好的用户体验添加流式输出功能app.route(/api/stream-infer, methods[POST]) def stream_inference(): def generate(): data request.json prompt data.get(prompt, ) if not prompt: yield data: {error: 请输入问题内容}\n\n return ollama_payload { model: smallthinker:3b, prompt: prompt, stream: True } try: with requests.post(OLLAMA_URL, jsonollama_payload, streamTrue) as response: response.raise_for_status() for line in response.iter_lines(): if line: decoded_line line.decode(utf-8) json_data json.loads(decoded_line) if response in json_data: yield fdata: {json.dumps({chunk: json_data[response]})}\n\n if json_data.get(done, False): yield data: {done: true}\n\n except Exception as e: yield fdata: {{error: {str(e)}}}\n\n return Response(generate(), mimetypetext/event-stream)5.2 前端流式输出支持更新前端JavaScript以支持流式输出async function streamRequest(isCOT) { const prompt document.getElementById(promptInput).value; const responseDiv document.getElementById(response); if (!prompt) { responseDiv.innerHTML 请输入问题内容; return; } responseDiv.innerHTML 思考中...; try { const endpoint isCOT ? /api/cot-stream : /api/stream-infer; const response await fetch(endpoint, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ prompt: prompt }) }); const reader response.body.getReader(); const decoder new TextDecoder(); let accumulatedText ; while (true) { const { value, done } await reader.read(); if (done) break; const chunk decoder.decode(value); const lines chunk.split(\n); for (const line of lines) { if (line.startsWith(data: )) { const data line.slice(6); if (data) { try { const parsed JSON.parse(data); if (parsed.chunk) { accumulatedText parsed.chunk; responseDiv.innerHTML accumulatedText; } if (parsed.done) { return; } } catch (e) { console.error(解析错误, e); } } } } } } catch (error) { responseDiv.innerHTML 请求失败: error.message; } }6. 部署与优化建议6.1 生产环境部署对于生产环境建议使用WSGI服务器# 安装gunicorn pip install gunicorn # 启动服务 gunicorn -w 4 -b 0.0.0.0:5000 your_app:app6.2 性能优化配置在Ollama配置中优化模型性能# 创建或修改 ~/.ollama/config.json { models: { smallthinker:3b: { num_gpu: 1, num_thread: 8, batch_size: 512 } } }6.3 安全增强建议添加基础安全措施from flask_cors import CORS from flask_limiter import Limiter from flask_limiter.util import get_remote_address # 添加CORS支持 CORS(app) # 添加速率限制 limiter Limiter( get_remote_address, appapp, default_limits[200 per day, 50 per hour] ) app.route(/api/infer, methods[POST]) limiter.limit(10 per minute) def inference(): # 原有代码不变7. 总结通过本教程我们成功构建了一个基于SmallThinker-3B-Preview模型的Web端链式思维推理服务。这个方案具有以下特点核心优势轻量级部署适合资源受限环境完整的链式思维推理能力展示流式输出提供更好的用户体验易于扩展和定制适用场景教育领域的推理教学辅助研究机构的思维过程分析企业内部的推理决策支持个人学习与知识探索下一步改进方向添加对话历史管理支持多模态输入输出实现模型性能监控添加用户认证和权限管理这个解决方案展示了如何将先进的AI模型与实用的Web技术结合为链式思维推理提供了可落地的实现方案。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。