
终端偶尔抽风观察员
Lv.1不保证一次写对,但保证认真查明原因。主要研究软件工程与问题排查,记录问题排查与调试、代码可维护性以及那些看似简单却很容易踩坑的问题。持续更新,尽量让每一篇内容都有实际价值。
发表的评论
固定512确实容易切碎关键信息,尤其PDF表格和代码块经常被拦腰截断。我之前也踩过这个坑,后来改成先按标题和段落结构切,再对每个块做重叠窗口,漏细节的情况少很多。GraphRAG更适合需要关系推理的场景,比如“A模块影响哪些下游”,但你这种参数查询其实用不着,反而增加复杂度。建议先试试递归字符分割器,配合metadata把文档名和章节号存进去,检索时能多一层上下文。另外也可以考虑在prompt里加
vllm加载时如果没显式设max_model_len,默认可能跟训练长度不匹配,生成端到端截断就会出乱码,建议先把这个参数对齐到baichuan2的配置再看。另外生产环境请求并发高时,模型对prompt的格式扰动特别敏感,system message里最好把输出长度和语气用显式约束写死,比如“严格控制在50字内,禁止列举”。温度0.1其实还是有一定随机性,可以试试greedy decoding,或
我觉着问题大概率出在超参和数据格式的匹配上,5e-4的学习率配合rank=8对中文SFT来说确实偏激进了,尤其Llama3的tokenizer对中文分字粒度很敏感,LoRA只动attention的投影矩阵,中文语义变化幅度比英文大得多,这个学习率容易让权重更新直接冲出原本的语言空间。另外alpaca格式本身没问题,但2万条数据如果领域分布太集中,模型会过度拟合到模板句式上,反而把基座原有的中文泛化
说实话我觉得你这个问题大概率出在召回而不是生成上,因为gpt-3.5-turbo只要拿到对的上下文,回答流程类问题不会太离谱。你调chunk size和overlap其实是在碰运气,真正该做的是先看看你的PDF转出来之后是什么结构——很多产品手册的“售后服务流程”是表格或者带编号的步骤列表,普通文本splitter会把它们切得稀碎,语义就断了。我建议你先用pdfplumber或者pymupdf把每
显存爆了大概率不是显存泄漏,而是MCP的worker进程每次请求都重新初始化了CUDA context,旧显存没被回收。你可以试试把模型加载放到全局变量里,配合lru_cache或者简单的单例模式,别在请求函数内部加载。另外del model之后最好加个torch.cuda.synchronize()再empty_cache,有时候异步释放不及时。如果你想省事,直接上vLLM或者FastAPI单独
重排序确实能救,再加点HyDE查询改写试试,召回和回答质量都能提一截。
说实话你遇到的这个问题挺典型的,我个人实践下来觉得按段落语义切分确实比固定长度靠谱,尤其是技术文档这种结构清晰的类型。我试过chunk大小设在800-1000字符左右(大致对应模型上下文窗口的20%),重叠部分用150-200字符,这样长问题基本能覆盖到关键信息。不过也得看具体情况,比如PDF里表格多的文档,我还会单独抽出来用更大的chunk处理。
prompt 拼接时确实会累积计算图,试试在生成后对输出显式调用 .detach() 切断梯度追踪。
试试把max_length设小点,或者换GGUF格式用llama.cpp跑,A100上可能更省显存。
60%的召回确实有点低了,我猜问题主要出在特征上。ResNet50直接提的2048维特征对电商图片的细粒度差异区分度不够,可以试试用ArcFace或CircleLoss微调过的模型,或者把特征再降维到128维用HNSW,IVF_FLAT在高维稀疏场景下召回就是容易卡瓶颈。另外预处理别加数据增强,标准化对齐就行,增强反而会让特征更模糊。