本地部署的小 LLM 模型不会自动停止输出,怎么解决?

86 天前
 huc2

想用 langchain + huggingface 上的一些小模型做一些 rag 的测试,随便尝试了 2 个 Qwen/Qwen2-7B-Instructmicrosoft/Phi-3.5-mini-instruct,但我发现他们好像都不知道什么时候应该停止输出。下面举了一些例子

模型和 prompt 的代码,检索器的就不放了:

llm_model = AutoModelForCausalLM.from_pretrained(
    model_name, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
pipe = pipeline(
    "text-generation",
    model=llm_model,
    tokenizer=tokenizer,
    max_new_tokens=512,
    return_full_text=False,
    do_sample=False,
    temperature=None,
    top_k=None,
    top_p=None,
)

prompt = ChatPromptTemplate.from_template(
    "你是问答任务的助手。使用以下检索到的相关规定来回答问题。如果你不知道答案,就说你不知道。\n\n"
    "问题:{input} \n\n"
    "上下文:\n{context}\n\n"
    "回答:"
)

这个 prompt 我是希望他在回答后面直接回答就可以了,很直接,但是这些模型有时候就很蠢。比如它会往后面补充:

根据上下文,..........

问题:.....
答案:.....

问题:.....
答案:.....

问题:.....
答案:......

就十分容易出现上面这种情况,明明直接回答就好了,但是它一定要把能用的 token 用完才结束,这些小模型的输出 token 里面没有指定什么时候结束的吗?有没有什么解决办法。

988 次点击
所在节点    问与答
2 条回复
xmumiffy
86 天前
没办法 以前 openai3.5 也会这样
huc2
86 天前
@xmumiffy 现在的 gpt4o 和 claude 这种自回归模型是因为模型大了,数据好了所以能聪明地判断什么时候结束了吗?还有一个我有点好奇的是,像他们这种模型做 Instruct 或着那种 对话交流 训练的时候,A 一句话,B 一句话,也是简单的把话拼接在一起吗,比如

A: .......
B: ......

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1068158

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX