背景: 我正在尝试查询来自HuggingFace的Llama-2 7B(meta-llama/Llama-2-7b-hf)。我给它一个问题和上下文(我猜测大约200到1000个标记),并要求它根据上下文回答问题(上下文是从向量存储中通过相似性搜索检索的)。我遇到了两个问题:
- 答案结束后,直到达到
max_new_tokens
的剩余标记全部是换行符。或者它根本不生成任何文本,整个响应都是换行符。添加repetition_penalty
为1.1或更高解决了无限换行符生成的问题,但无法得到完整的答案。 - 对于生成的答案,它们是从给定的上下文中逐字复制。这在
repetition_penalty=1.1
时仍然如此,而将重复惩罚设得太高会使答案变得毫无意义。
我只尝试过使用temperature=0.4
和temperature=0.8
,但从我的尝试来看,调整温度和repetition_penalty
都会导致上下文被复制或得到无意义的答案。
关于“上下文”的说明: 我使用存储在Chroma向量存储中的文档,相似性搜索在传递给Llama之前检索相关信息。
示例问题:我的查询是总结某个主题X。
query = "Summarize Topic X"
从向量存储中检索的上下文有3个来源,看起来像这样(我在向LLM查询时将来源格式化为用换行符分隔):
context = """When talking about Topic X, Scenario Y is always referred to. This is due to the relation ofTopic X is a broad topic which covers many aspects of life.No one knows when Topic X became a thing, its origin is unknown even to this day."""
然后,Llama-2的响应直接镜像了一段上下文,并且不包括其他部分的信息。此外,它在答案后产生了许多换行符。如果答案是100个标记,而max_new_tokens
是150,我会有50个换行符。
response = "When talking about Topic X, Scenario Y is always referred to. This is due to the relation of \n\n\n\n"
我最大的问题之一是,除了复制一段上下文外,如果上下文在句子中间结束,LLM的响应也会在句子中间结束。
是否还有其他人遇到类似的问题(换行符问题或复制输入提示的一部分)?有人找到解决方案了吗?
回答:
这是像Llama这样的预训练基础模型常见的问题。
我的第一个想法是选择一个经过某种指令调整的模型,例如https://huggingface.co/meta-llama/Llama-2-7b-chat。指令调整影响模型可靠解决任务的能力,与基础模型不同,后者通常只是训练来预测下一个标记(这也是截断经常发生的原因)。
第二点,根据我的经验,使用与训练期间相同的提示格式也有帮助。你可以在源代码中看到Meta在训练和生成时使用的提示格式。这里有一个讨论线程关于这个话题。
最后,对于重复问题,在生成时使用Logits Processor有助于减少重复。