microsoft / LLMLingua

To speed up LLMs' inference and enhance LLM's perceive of key information, compress the prompt and KV-Cache, which achieves up to 20x compression with minimal performance loss.
https://llmlingua.com/
MIT License
4.18k stars 222 forks source link

[Bug]: When I use Chinese prompt, the compressed prompt has extra spaces. #131

Open saucebing opened 3 months ago

saucebing commented 3 months ago

Describe the bug

When I use Chinese prompt, there are extra spaces between Chinese characters in compressed prompt, which is incorrect in such language.

Steps to reproduce

Script:

from llmlingua import PromptCompressor
import time

compressor = PromptCompressor(
    model_name="../llmlingua-2-bert-base-multilingual-cased-meetingbank",
    use_llmlingua2=True
)

while True:
    input('Press <Enter> to Start.')
    a = time.time()
    original_prompt = open('test.txt', 'r').read()
    results = compressor.compress_prompt_llmlingua2(
        original_prompt,
        rate=0.6,
        force_tokens=['\n', '.', '!', '?', ','],
        chunk_end_tokens=['.', '\n'],
        return_word_label=True,
        drop_consecutive=True
    )

    print(results.keys())
    print(f"Compressed prompt: {results['compressed_prompt']}")
    print(f"Original tokens: {results['origin_tokens']}")
    print(f"Compressed tokens: {results['compressed_tokens']}")
    print(f"Compression rate: {results['rate']}")

    # get the annotated results over the original prompt
    word_sep = "\t\t|\t\t"
    label_sep = " "
    lines = results["fn_labeled_original_prompt"].split(word_sep)
    annotated_results = []
    for line in lines:
        word, label = line.split(label_sep)
        annotated_results.append((word, '+') if label == '1' else (word, '-')) # list of tuples: (word, label)
    print("Annotated results:")
    for word, label in annotated_results[:10]:
        print(f"{word} {label}")
    b = time.time()
    print(f"Time is {b - a}s")

test.txt: 从前有个可爱的小姑娘,谁见了都喜欢,但最喜欢她的是她的奶奶,简直是她要什么就给她什么。 一次,奶奶送给小姑娘一顶用丝绒做的小红帽,戴在她的头上正好合适。 从此,姑娘再也不愿意戴任何别的帽子,于是大家便叫>她"小红帽"。 一天,妈妈对小红帽说:"来,小红帽,这里有一块蛋糕和一瓶葡萄酒,快给奶奶送去,奶奶生病了,身子很虚弱,吃了这些就会好一些的。趁着现在天还没有热,赶紧动身吧。在路上要好好走,不要跑,也不要离开大路,否则你 会摔跤的,那样奶奶就什么也吃不上了。到奶奶家的时候,别忘了说'早上好',也不要一进屋就东瞧西瞅。" "我会小心的。"小红帽对妈妈说,并且还和妈妈拉手作保证。 奶奶住在村子外面的森林里,离小红帽家有很长一段路。 小红帽刚走进森林就碰到了一条狼。 小红帽不知道狼是坏家伙,所以一点也不怕它。 "你好,小红帽,"狼说。 "谢谢你,狼先生。" "小红帽,这么早要到哪里去呀?" "我要到奶奶家去。" "你那围裙下面有什么呀?" "蛋糕和葡萄酒。昨天我们家烤了一些蛋糕,可怜的奶奶生了病,要吃一些好东西才能恢复过来。" "你奶奶住在哪里呀,小红帽?" "进了林子还有一段路呢。她的房子就在三棵大橡树下,低处围着核桃树篱笆。你一定知道的。"小红帽说。 狼在心中盘算着:"这小东西细皮嫩肉的,味道肯定比那老太婆要好。我要讲究一下策略,让她俩都逃不出我的手心。"于是它陪着小红帽走了一会儿,然后说:"小红帽,你看周围这些花多么美丽啊!干吗不回头看一看呢?还有这 些小鸟,它们唱得多么动听啊!你大概根本没有听到吧?林子里的一切多么美好啊,而你却只管往前走,就像是去上学一样。" 小红帽抬起头来,看到阳光在树木间来回跳荡,美丽的鲜花在四周开放,便想:"也许我该摘一把鲜花给奶奶,让她高兴高兴。现在天色还早,我不会去迟的。"她于是离开大路,走进林子去采花。 她每采下一朵花,总觉得前面还 有更美丽的花朵,便又向前走去,结果一直走到了林子深处。 就在此时,狼却直接跑到奶奶家,敲了敲门。 "是谁呀?" "是小红帽。"狼回答,"我给你送蛋糕和葡萄酒来了。快开门哪。" "你拉一下门栓就行了,"奶奶大声说,"我身上没有力气,起不来。" 狼刚拉起门栓,那门就开了。 狼二话没说就冲到奶奶的床前,把奶奶吞进了肚子。 然后她穿上奶奶的衣服,戴上她的帽子,躺在床上,还拉上了帘子。 可这时小红帽还在跑来跑去地采花。 直到采了许多许多,她都拿不了啦,她才想起奶奶,重新上路去奶奶家。 看到奶奶家的屋门敞开着,她感到很奇怪。 她一走进屋子就有一种异样的感觉,心中便想:"天哪!平常我那么喜欢来奶奶家,今天怎么这样害怕?"她大声叫道:"早上好!",可是没有听到回答。 她走到床前拉开帘子,只见奶>奶躺在床上,帽子拉得低低的,把脸都遮住了,样子非常奇怪。 "哎,奶奶,"她说,"你的耳朵怎么这样大呀?" "为了更好地听你说话呀,乖乖。" "可是奶奶,你的眼睛怎么这样大呀?"小红帽又问。 "为了更清楚地看你呀,乖乖。" "奶奶,你的手怎么这样大呀?" "可以更好地抱着你呀。" "奶奶,你的嘴巴怎么大得很吓人呀?" "可以一口把你吃掉呀!" 狼刚把话说完,就从床上跳起来,把小红帽吞进了肚子,狼满足了食欲之后便重新躺到床上睡觉,而且鼾声震天。 一位猎人碰巧从屋前走过,心想:"这老太太鼾打得好响啊!我要进去看看她是不是出什么事了。"猎人进了屋,来 到床前时却发现躺在那里的竟是狼。 "你这老坏蛋,我找了你这么久,真没想到在这里找到你!"他说。 他正准备向狼开枪,突然又想到,这狼很可能把奶奶吞进了肚子,奶奶也许还活着。 猎人就没有开枪,而是操起一把剪刀, 动手把呼呼大睡的狼的肚子剪了开来。 他刚剪了两下,就看到了红色的小帽子。 他又剪了两下,小姑娘便跳了出来,叫道:"真把我吓坏了!狼肚子里黑漆漆的。"接着,奶奶也活着出来了,只是有点喘不过气来。 小红帽赶紧跑 去搬来几块大石头,塞进狼的肚子。 狼醒来之后想逃走,可是那些石头太重了,它刚站起来就跌到在地,摔死了。 三个人高兴极了。 猎人剥下狼皮,回家去了;奶奶吃了小红帽带来的蛋糕和葡萄酒,精神好多了;而小红帽却在想:"要是妈妈不允许,我一辈子也不独自离开大路,跑进森林了。" 人们还说,小红帽后来又有一次把蛋糕送给奶奶,而且在路上又有一只狼跟她搭话,想骗她离开大路。 可小红帽这次提高了警惕,头也不回地向前走。 她告诉奶奶她碰到了狼,那家伙嘴上虽然对她说"你好",眼睛里却露着凶光>,要不是在大路上,它准把她给吃了。 "那么,"奶奶说,"我们把门关紧,不让它进来。"不一会儿,狼真的一面敲着门一面叫道:"奶奶,快开门呀。我是小红帽,给你送蛋糕来了。"但是她们既不说话,也不开门。 这长着灰毛>的家伙围着房子转了两三圈,最后跳上屋顶,打算等小红帽在傍晚回家时偷偷跟在她的后面,趁天黑把她吃掉。 可奶奶看穿了这家伙的坏心思。 她想起屋子前有一个大石头槽子,便对小姑娘说:"小红帽,把桶拿来。我昨天做了 一些香肠,提些煮香肠的水去倒进石头槽里。"小红帽提了很多很多水,把那个大石头槽子装得满满的。 香肠的气味飘进了狼的鼻孔,它使劲地用鼻子闻呀闻,并且朝下张望着,到最后把脖子伸得太长了,身子开始往下滑。 它从 屋顶上滑了下来,正好落在大石槽中,淹死了。 小红帽高高兴兴地回了家,从此再也没有谁伤害过她。

The outputs of the script: Press to Start. Token indices sequence length is longer than the specified maximum sequence length for this model (2177 > 512). Running this sequence through the model will result in indexing errors dict_keys(['compressed_prompt', 'compressed_prompt_list', 'origin_tokens', 'compressed_tokens', 'ratio', 'rate', 'saving', 'fn_labeled_original_prompt']) Compressed prompt: 有 可 爱 的 小 姑 娘 喜 欢 喜 她 她 奶 奶 要 什 么 给 她 。 奶 奶 送 给 娘 一 顶 用 丝 绒 做 小 红 帽 戴 在 头 上 合 适 姑 娘 不 愿 意 戴 别 帽 子 叫 她 " 小 红 帽 " 妈 妈 对 小 红 帽 说 有 一 块 蛋 糕 瓶 葡 萄 酒 给 奶 奶 送 奶 奶 生 病 身 子 虚 弱 吃 了 会 好 一 些 天 热 赶 紧 动 身 吧 路 上 要 好 好 走 不 跑 离 开 大 路 摔 跤 奶 奶 吃 不 上 了 到 奶 奶 家 ' 早 上 好 ' 进 屋 小 心 小 红 帽 妈 妈 拉 手 保 证 奶 奶 住 在 村 子 外 面 森 林 里 离 小 红 帽 家 长 路 小 红 帽 碰 到 一 条 狼 狼 坏 家 伙 不 怕 它 好 小 红 帽 谢 谢 狼 先 生 小 红 帽 早 要 到 哪 里 去 ? 奶 奶 家 去 围 裙 下 面 有 么 蛋 糕 葡 萄 酒 家 烤 了 蛋 糕 奶 奶 生 了 病 吃 好 东 西 恢 复 奶 奶 住 在 哪 里 呀 小 红 帽 ? 进 了 林 子 一 段 路 她 的 房 子 在 三 棵 大 橡 树 下 围 着 核 桃 树 篱 知 道 小 红 帽 说 。 狼 心 中 盘 算 着 小 东 西 细 皮 嫩 肉 味 道 比 老 太 婆 要 好 讲 究 策 略 她 逃 不 出 手 心 它 陪 着 小 红 帽 走 会 儿 小 红 帽 看 周 围 花 美 丽 小 鸟 唱 动 听 听 到 林 子 里 切 美 好 管 往 前 走 去 上 学 小 红 帽 阳 光 树 木 间 跳 荡 美 丽 鲜 花 四 周 开 放 摘 一 把 鲜 花 给 奶 奶 高 兴 高 兴 天 色 早 迟 。 她 离 开 大 路 走 进 林 子 采 花 她 下 朵 花 美 丽 花 朵 向 前 走 去 走 到 林 子 深 处 狼 跑 到 奶 奶 家 敲 敲 门 谁 ? 小 红 帽 。 狼 答 给 送 蛋 糕 葡 萄 酒 来 开 门 拉 门 栓 行 奶 奶 没 力 气 起 不 来 狼 拉 门 栓 门 开 了 狼 冲 到 奶 奶 的 床 前 把 奶 奶 吞 进 肚 子 她 穿 上 奶 奶 的 衣 服 戴 上 她 帽 子 躺 在 床 上 拉 上 帘 子 小 红 帽 跑 采 花 采 了 拿 不 了 啦 想 起 奶 奶 重 新 上 路 去 奶 奶 家 。 看 奶 奶 家 的 屋 门 敞 开 感 奇 怪 她 走 进 屋 子 有 异 样 感 觉 想 : 天 哪 ! 喜 欢 来 奶 奶 家 今 天 害 怕 ? " 她 大 声 叫 道 早 上 好 ! " 没 有 听 回 答 。 走 到 床 前 拉 开 帘 子 奶 奶 躺 在 床 上 帽 子 拉 低 低 脸 遮 住 样 子 奇 怪 。 " , 奶 奶 , 耳 朵 大 呀 ? 听 话 乖 乖 。 奶 奶 眼 睛 大 呀 ? 小 红 帽 问 清 楚 看 你 乖 乖 奶 奶 手 大 ? 抱 着 你 奶 奶 嘴 巴 大 吓 人 ? 把 你 吃 掉 呀 ! 狼 把 话 说 完 从 床 上 跳 把 小 红 帽 吞 进 肚 子 狼 满 足 食 欲 重 新 躺 到 床 上 睡 觉 声 震 天 。 猎 人 从 屋 前 想 : 老 太 太 打 好 响 啊 她 出 什 么 事 。 猎 人 发 现 躺 狼 。 你 老 坏 蛋 找 了 你 久 ! 他 准 备 向 狼 开 枪 狼 能 把 奶 奶 吞 进 肚 子 奶 活 着 。 猎 人 没 有 开 枪 操 起 剪 刀 把 狼 的 肚 子 剪 剪 两 下 看 到 红 色 小 帽 子 剪 小 姑 娘 跳 吓 坏 狼 肚 子 里 黑 漆 漆 奶 奶 活 着 出 喘 不 气 。 小 红 帽 搬 大 石 头 塞 进 狼 的 肚 子 。 狼 醒 来 想 逃 走 石 头 重 跌 到 摔 死 了 。 三 个 人 高 兴 极 。 猎 人 剥 下 狼 皮 回 家 去 奶 奶 吃 了 小 红 帽 蛋 糕 葡 萄 酒 精 神 多 小 红 帽 想 : 妈 妈 不 允 许 不 离 开 大 路 跑 进 森 林 说 小 红 帽 把 蛋 糕 送 给 奶 奶 上 一 只 狼 跟 她 搭 话 想 骗 她 离 开 大 路 。 小 红 帽 提 高 警 惕 向 走 告 诉 奶 奶 碰 到 了 狼 家 伙 嘴 上 她 好 眼 睛 里 露 着 凶 光 大 路 上 它 准 把 她 吃 。 奶 奶 说 把 门 关 紧 不 让 它 进 来 。 狼 叫 奶 奶 快 开 门 小 红 帽 给 你 送 蛋 糕 来 。 不 说 话 不 开 门 。 长 着 灰 毛 的 家 伙 围 着 房 子 转 两 三 圈 跳 上 屋 顶 小 红 帽 傍 晚 后 面 天 黑 把 她 吃 掉 奶 奶 看 穿 家 伙 坏 心 思 想 屋 子 前 大 石 头 槽 子 对 小 姑 娘 小 红 帽 把 桶 拿 来 做 了 香 肠 水 倒 进 石 头 槽 里 。 小 红 帽 提 了 水 槽 子 装 满 满 。 香 肠 气 味 飘 进 狼 的 鼻 孔 脖 子 伸 长 身 子 下 滑 屋 顶 滑 落 在 大 石 槽 中 淹 死 了 。 小 红 帽 兴 地 回 了 家 没 谁 伤 害 过 她

Original tokens: 2995 Compressed tokens: 2633 Compression rate: 87.9% Annotated results: 从 - 前 - 有 + 个 - 可 + 爱 + 的 + 小 + 姑 + 娘 + Time is 1.691406488418579s Press to Start.

We can see that inappropriate spaces cause high compressed rate. If removing spaces, the compression rate should be near 50%.

Expected Behavior

No spaces between Chinese characters.

Logs

No response

Additional Information

No response

iofu728 commented 2 months ago

Hi @saucebing, thanks for your support. We'll check it.