AI学习:第2天

太好了,恭喜你成功迈出了第一步!现在你已经能用本地模型生成回答了。下一步,我们按计划进入第二天:把模型封装成 API 服务,这样你就可以像调用在线接口一样使用它,为后续做 RAG(检索增强生成)打下基础。

由于你用的是 ModelScope(魔塔),我会继续基于它来写 API 代码,保证你能直接复用。


第二天任务(约30-40分钟):用 FastAPI 封装模型

第1步:安装 FastAPI 和 uvicorn(2分钟)

在 ai_env 环境中执行:

bash 复制代码
pip install fastapi uvicorn

第2步:创建 app.py 文件(15分钟)

在你喜欢的目录(比如 C:\Users\Lenovo\ai_api)新建 app.py,写入以下内容:

python 复制代码
# app.py
from fastapi import FastAPI
from pydantic import BaseModel
from modelscope import AutoModelForCausalLM, AutoTokenizer
import torch
import time

# ---------- 全局加载模型(只加载一次,避免重复)----------
print("正在加载模型,请稍等...")
start = time.time()
model_id = 'qwen/Qwen2-0.5B-Instruct'
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
print(f"模型加载完成,耗时 {time.time()-start:.2f} 秒")
# -------------------------------------------------

app = FastAPI()

# 定义请求体的数据结构
class PromptRequest(BaseModel):
    prompt: str
    max_tokens: int = 200      # 默认值
    temperature: float = 0.7   # 默认值

@app.post("/generate")
async def generate(request: PromptRequest):
    # 构造对话消息
    messages = [{"role": "user", "content": request.prompt}]
    # 应用聊天模板
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    inputs = tokenizer(text, return_tensors="pt")
    
    # 推理
    start_gen = time.time()
    with torch.no_grad():
        outputs = model.generate(
            inputs.input_ids,
            max_new_tokens=request.max_tokens,
            temperature=request.temperature,
            do_sample=True
        )
    gen_time = time.time() - start_gen
    
    # 解码并提取助手回复
    full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    assistant_response = full_response.split("assistant")[-1].strip()
    
    return {
        "response": assistant_response,
        "inference_time_seconds": round(gen_time, 2)
    }

@app.get("/health")
def health_check():
    return {"status": "ok", "model_loaded": True}

第3步:启动服务(2分钟)

在终端(确保已激活 ai_env)切换到 app.py 所在目录,然后执行:

bash 复制代码
uvicorn app:app --reload --host 127.0.0.1 --port 8000

看到类似下面的输出就表示成功:

复制代码
INFO:     Uvicorn running on http://127.0.0.1:8000
INFO:     Application startup complete.

保持这个终端窗口不要关闭,服务会一直运行。

第4步:测试 API(5分钟)

打开另一个终端 (或按 Ctrl+T 新建一个标签页),用下面任一方式测试:

方法一:用 curl 命令(推荐)
bash 复制代码
curl -X POST "http://127.0.0.1:8000/generate" -H "Content-Type: application/json" -d "{\"prompt\":\"什么是深度学习?\"}"
方法二:用 Python 脚本测试

新建一个 test_api.py:

python 复制代码
import requests
resp = requests.post("http://127.0.0.1:8000/generate", json={"prompt": "解释一下反向传播"})
print(resp.json()["response"])

运行后会打印模型回答。

如果一切正常,恭喜你,你已经拥有了一个本地 LLM API 服务!后续你可以把它集成到任何应用中。


遇到的问题

  1. api相关的那个代码不能在jupyter中执行,这里面不适合执行服务,单独放在一个py文件中,然后运行。
  2. 在运行服务过程中出现了"SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte"的问题,用文本文件打开,选择另存为,然后在下面的编码部分选择utf-8就好了。
相关推荐
2601_9669496513 分钟前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
张彦峰ZYF2 小时前
越过边界之前:Reward Seeker 实验如何改写智能体安全的时间逻辑
人工智能·ai agent·anthropic·智能体安全·reward seeker·“控制评价过程”泛化跨领域策略·envbom
拓恒技术2 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
学长毕设3 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
罗西的思考4 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
在世修行4 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
字节跳动视频云技术团队5 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI5 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
逐米时代5 小时前
从试点验证到协同深化:制造业AI转型三年路线图设计方法
人工智能