V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smalltong02
V2EX  ›  程序员

对 Llama-3-8B 模型在指令跟随方面的测试。

  •  
  •   smalltong02 ·
    smalltong02 · 206 天前 · 2650 次点击
    这是一个创建于 206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    周末闲来无事,正好有时间对 Meta 新开源的 Llama-3 模型进行了指令跟随方面的测试。70B 模型对我的 4090 显卡来说太大了,而且我也不想去测试精度有损的量化模型,所以这次测试选择了 Llama-3-8B 的模型。 这次的测试主要选取了两个方面:

    第一个测试是给 Llama-3-8B 模型添加智能 Function Calling 特性之后,检查模型能否根据用户输入的问题智能选择并调用合适的函数;

    第二个测试是给 Llama-3-8B 模型添加代码解释器特性之后,检查模型分解任务,编写代码,以及遇到错误的时候能够正确修改代码解决问题的能力。

    测试 Function Calling 的能力

    众所周知,Function Calling 特性是用来给大模型提供一组额外的可调用函数,从而帮助大模型补足一些短板。比如扩充模型的数学能力,知识图谱,或者打破训练资料的时限限制等等。 智能调用需要大模型的幻觉比较少,知道什么时候需要调用什么函数,同时也考验了模型的格式化输出能力。 首先为模型添加两个可调用函数,get_current_time()函数将会返回当前的系统时间; get_current_location()函数将会返回当前的位置信息,两个函数比较简单,都无参数信息。

    def get_current_time():
        """Get current time."""
        current_time = datetime.datetime.now()
        formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")   
        return formatted_time
    
    def get_current_location():
        """Get current location information."""
        location = geocoder.ip('me')
        if location:
            return location.address
        else:
            return "Location information not available."
    

    在 Enable Function Calling 特性之后,让我们通过问题来检查 Llama-3-8B 模型的执行情况如何。

    Imgur

    可以看到 Llama-3-8B 模型可以正确的选择要调用的函数,并且能够正确输出调用格式。而且令人惊喜的是,模型还添加了的 Markdown 格式来美化输出格式。

    Imgur

    这是未开启 Function Calling 特性的情况,模型无法知道当前时间等信息。

    总结:经过测试之后,Llama-3-8B 模型在开启了 Function Calling 特性,正确调用函数的概率是目前开源模型中效果最好的。我之前在很多的模型上也测试过这个任务,通常会遇到以下的错误:

    • 模型完全不知道应该调用函数。

    • 模型的输出格式不对或者参数不对,导致调用函数失败。

    • 经过几轮测试后,模型失去了调用函数的能力。(这项仅有闭源大模型效果较好,其中 GPT4 最好)

    在这项任务上我目前最满意的模型有 Llama-3-8B 模型,Phi-3-3B 模型,Qwen-1.5-7B(14B)模型,Baichuan2 模型,Mistral-7B 模型,仅个人观点。

    测试代码解释器功能

    这次使用我自己编写的代码解释器 keras-llm-interpreter ,和 Llama-3-8B 模型一起测试。整个测试包含三项任务: 多代理的经典任务,让模型绘制 Tesla 和 Apple 今年的股票价格曲线并显示。 让模型画一只粉色的小猪并显示。 让模型读取本地的一个文件,制作成词云图片并显示。

    首先,让我们看看第一项任务:模型绘制 Tesla 和 Apple 今年的股票价格曲线并显示

    在加载 Llama-3-8B 模型并开启代码解释器 keras-llm-interpreter 之后,布置任务给模型:Please plot Tesla and Apple stock price YTD from 2024.

    Imgur

    Imgur

    Llama-3-8B 模型很好的完成了任务,它第一步编写代码从雅虎财经上下载了 TSLA 和 AAPL 的股票数据;第二步使用 plt 绘制了股票价格趋势图型,第三步通过检查结果正确结束了任务。

    第二项任务,让模型画一只粉色的小猪并显示

    布置任务给模型:Please use Python language to draw an image of a pink pig and display it.

    Imgur

    Imgur

    Imgur

    模型分了四步去完成整个任务,第一安装库 pillow ,成功;第二使用 PIL 生成一张画布,成功;第三,尝试在画布上画小猪的眼睛,鼻子和嘴;第四步,保存图片到本地文件 pink_pig.png 。 这个任务中,虽然 Llama-3-8B 模型最终完成了任务,但是有两点做的不好,第一忘记了显示图片,第二画的小猪惨不忍睹...

    第三项任务,模型读取本地文件 wordcloud.txt ,制作成词云图片并显示

    wordcloud.txt 中是指环王故事内容的一部分,首先还是布置任务给模型:Please create a word cloud image based on the file "D:\wordcloud.txt" and display it.

    Imgur

    Imgur

    模型首先编写代码并读取了文件内容,之后在环境中安装了必要的库 wordcloud ,最后编写代码制作词云并显示,可以说效果相当好了。

    总结:Llama-3-8B 模型在开启了代码解释器特性,并在收到任务之后,能够按照步骤分解任务内容,并且按照每一步骤编写代码并执行,最后检查任务的输出结果。之前在很多的模型上也测试过这个任务,通常会遇到以下的错误:

    模型对代码解释器不认知,仅会回复无法网络搜索或输出图像。

    • 模型不会制定任务,或者制定的任务不对。

    • 模型无法按照正确的格式编写代码,导致任务无法进行。

    • 模型代码质量很差,并且在错误提示给模型之后,模型不知道如何修复错误。

    • 模型遇到错误后不在尝试,直接显示无法完成任务。

    • 在任务完成之后,模型没能正确确认任务成功,导致执行多遍任务。

    在这项任务上我目前最满意的离线开源模型就是 Llama-3 模型,它的一次成功率是最高的,当然对于开源模型来说总体的稳定任然不如闭源大模型,仅个人观点。

    16 条回复    2024-04-30 16:40:16 +08:00
    fredweili
        1
    fredweili  
       206 天前
    和经常不知所云的 gemma 相比,llama3 优秀太多
    smalltong02
        2
    smalltong02  
    OP
       206 天前
    @fredweili 是的,而且这次 MS 的 Phi-3 也不错,3B 的模型也都可以完成这些任务,只不过成功率低一些。
    SylarQAQ
        3
    SylarQAQ  
       206 天前
    看到老哥用的这个 webui 是自己开源的呀,能介绍一下优势么?现在市面上做这类似的 webui 的好多啊
    lanlanye
        4
    lanlanye  
       206 天前
    好奇问一下,量化模型一般会损失哪方面的能力?因为在推理速度和资源使用上优势非常明显
    euph
        5
    euph  
       206 天前 via Android
    不知道老哥有没有测过 wizardlm2:7b
    smalltong02
        6
    smalltong02  
    OP
       206 天前
    @SylarQAQ

    我的这个项目偏向于对热门模型进行各种任务测试并可进行横向比较用的,更倾向于摸清模型在各种任务中的实际表现。

    比如你在使用其它开源项目的时候可能会有这样的烦恼。比如 text-generation-webui 项目,它可以适配大部分的离线模型,但不支持在线模型。LM Studio 项目,它可以使用 CPU 跑任何模型,但它仅支持 GGUF 格式模型。ComfyUI 对图像模型的支持生成非常专业,但它仅此而已。Open Interpreter 项目可以让你在本地运行代码解释器,但它仅仅支持 GPT-4 等在线模型,离线模型需要接入其它开源项目。

    当你想对不同的模型(包括在线模型和各种离线模型)在相同环境下测试 RAG 任务,接入代码解释器,使用 Function Calling ,搜索引擎,或者接入 TTS ,生成图像的时候,你发现你需要使用一个或者多个开源项目互相配合才能达到目的,并且很可能多个开源项目还无法同时接入。当你想比较离线模型和 GPT-4 ,Gemini 这种闭源在线模型在搭配相同工具在各种任务中表现差异的时候,你会发现很难或者可能根本就做不到。

    我的这个开源项目就是针对这类问题才做的,它可以加载各种在线模型,也支持各种热门的离线模型(包括量化模型)。
    并且提供了相同的工具,包括
    1. 接入搜索引擎
    2. Function Calling
    3. 角色扮演
    4. 代码解释器
    5. 接入 TTS (语音输入和输出)
    6. 接入图像识别模型
    7. 接入图像生成模型

    举例说明:
    这是一个早期的例子,将图像模型接入 llama-2-7b-chat 模型,让它也可以想多模态模型那样,拥有从图像生成另一幅图像的能力:

    smalltong02
        7
    smalltong02  
    OP
       206 天前   ❤️ 1
    @lanlanye

    量化模型最主要的问题就是精度会有一些损失,有点类似于有损压缩。两个数据很近的话,比如第一个是 0.2385637 ,第二个是 0.2385644 ,那么量化之后很可以这两个值都落在同一个 int 值上面,这就会造成精度损失。量化模型偶尔会有输出乱或者不停止,通常就是这种问题造成的。
    smalltong02
        8
    smalltong02  
    OP
       206 天前
    @euph

    目前还没有测试过呢。
    SylarQAQ
        9
    SylarQAQ  
       206 天前
    @smalltong02 蛮好的项目 已关注,主要是看市面上类似的还挺多的 比如 Lobe Chat/ Anything-LLM 之类的项目
    kenshinhu
        10
    kenshinhu  
       206 天前
    哥,想问一下这个 7B 模型是直接从 GitHub 上下载部署的这个吗?我这边用 16G 的显卡打开也是报 GPU 内存不足
    smalltong02
        11
    smalltong02  
    OP
       206 天前
    @kenshinhu

    7B 模型如果不进行量化,仅仅使用 16G 的显存加载模型并推理不太够用,尤其是 Linux 系统,必须要保证显存足够。如果是 windows 系统,是会向内存借用一部分保证不会报内存不足错误,但也会导致推理降速。建议 7B 模型使用 3090 或者 4090 显卡进行测试。
    secondwtq
        12
    secondwtq  
       206 天前
    Code Interpreter 不知道,但是 Function Calling 的能力的话,一般认为 OpenAI 是对其模型进行了专门训练才能达到如此的效果。开源模型如果没经过类似的训练的话只能在 Prompt 上做手脚,结合限制输出 token 的手段。目前 Llama 系列官方模型都没有 FunctionCalling 的训练。
    github.com/MeetKai/functionary MeetKai/functionary: Chat language model that can use tools and interpret the results 这里倒是有个原生支持 Function Calling 的
    kenshinhu
        13
    kenshinhu  
       205 天前
    @smalltong02
    之前是在 腾讯云上租用 Hai 算力服务器上部署 8B 模型时(直从 GitHub 下载)就出现 以下错误:
    torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 1002.00 MiB. GPU 0 has a total capacity of 15.57 GiB of which 961.12 MiB is free. Process 68255 has 14.63 GiB memory in use. Of the allocated memory 13.99 GiB is allocated by PyTorch, and 129.49 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management
    看似是显卡的内存都被 PyTorch 所占用了但不知道怎样解决
    smalltong02
        14
    smalltong02  
    OP
       205 天前
    @secondwtq

    经过测试 Llama-3 和 Phi-3 都能够和 Function Calling 和代码解释器一起使用。其实 Function Calling 对模型的能力要求要低一些,代码解释器要求模型的能力要高一些。对于 Function Calling ,大部分模型在几轮对话之后都会失去调用 Function 的能力,只有 GPT-4 模型在这块做的是最好的。
    smalltong02
        15
    smalltong02  
    OP
       205 天前
    @kenshinhu

    看起来是 Linux 机器,你可以部署 8bit 的量化模型,16GB 的显存够用了。
    qinfengge
        16
    qinfengge  
       205 天前
    我看 Spring AI 的文档里面 Ollama 系列都不支持 Function Calling🤨
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.