自建 AI 教学流水线跑了半年,单人边际成本真降到分级了

老Neo在路上 高级 1小时前 716 浏览 12 点赞 约 1 分钟

去年这时候还在为公司新员工入职培训发愁:买 SaaS 课程库一年十几万,外包录制内部课更是无底洞,还得专人运营学习平台。后来心一横,把那套「必须买现成服务」的思路扔了,花两周搭了一套完全本地化的自动化教学流水线,跑到现在单人次边际成本稳定在 0.3 元以内——基本就是电费钱。

栈很简单,全是开源件拼的:

  • 模型层:Ollama 跑量化后的 Llama 3.1 8B(4-bit),显存占 6.5G,单张 3090 就能跑并发 4 路
  • 编排:LangGraph 定义「课程生成 → 知识点拆解 → 习题出题 → 批改反馈」四个节点的有向图,状态存在 SQLite
  • 检索:Chroma 存切好的内部文档向量,Chunk size 512、overlap 50,混合检索(BM25 + 向量)Top-K 取 5
  • 前端:Streamlit 临时搭的管理后台,HR 自己能改提示词、看进度
自建 AI 教学流水线跑了半年,单人边际成本真降到分级了

最磨人的不是模型,是批改一致性。
早期直接塞系统提示词让大模型打分,同一份代码提交三次能给出 60/85/72 三个分。后来改成 「少样例 + 结构化输出 + 规则校验」 三件套:
1. 每道题预置 3 份人工标注的「标准答案-扣分点-得分」三元组示例
2. 强制模型输出 JSON:{"score": int, "issues": [{"line": int, "desc": str, "deduct": int}]}
3. Python 端做硬性校验:扣分项总和必须等于满分减最终分,行号不能超文件长度,不合格直接重跑一次(设 max_retries=2

# grading_node.py 关键片段
from pydantic import BaseModel, field_validator
from typing import List

class Issue(BaseModel):
    line: int
    desc: str
    deduct: int

class GradeResult(BaseModel):
    score: int
    issues: List[Issue]

    @field_validator("score")
    @classmethod
    def check_sum(cls, v, info):
        if "issues" in info.data:
            total_deduct = sum(i.deduct for i in info.data["issues"])
            if v + total_deduct != 100:  # 假设满分 100
                raise ValueError("扣分项总和与最终分不一致")
        return v

加上这层守卫后,批改方差从 ±12 降到 ±2,基本能替代初级助教了。

再一个坑是长上下文课程生成。
直接让 8B 模型一次吐出 2 小时课程大纲+讲稿,中间必幻觉、断章。拆成「大纲生成 → 分节扩写 → 交叉引用检查 → 合并」四步,中间加一道 人工确认节点(LangGraph 的 interrupt),HR

求助

全部回复 (3)

前端老刘 高级 1小时前
向量库别上云,本地 Chroma 存切片最省心
0 回复
强迫症脚本小子 专家 1小时前
推理端上 vLLM 开 PagedAttention,批量并发吞吐直接拉满显存,别再单条跑了
0 回复
早八人AI炼丹师 专家 1小时前
嵌入模型用的啥?bge-m3 还是自己微调的?
0 回复

发表回复

支持 Markdown 格式