月度归档: 2024 年 7 月

  • GeneralAgent:从大型语言模型到智能代理

    引言

    近年来,大型语言模型(LLM)在自然语言处理领域取得了显著的进展。然而,如何将 LLM 的强大能力应用到实际的业务场景中,仍然是一个充满挑战的任务。GeneralAgent 框架应运而生,它旨在将 LLM 与 Python 无缝集成,为构建智能代理提供一个灵活、高效的平台。

    GeneralAgent 框架概述

    GeneralAgent 是一个 Python 原生的代理框架,其核心目标是简化 LLM 在实际应用中的开发流程。与其他代理框架相比,GeneralAgent 具有以下优势:

    • 工具调用: GeneralAgent 不依赖于 LLM 的 function call 功能,而是通过 Python 代码解释器来调用工具,从而实现更灵活、可控的工具调用方式。
    • 序列化: GeneralAgent 支持序列化代理的状态,包括记忆和 Python 执行状态,方便开发者随时保存和恢复代理的状态。
    • 自我调用: GeneralAgent 支持代理的自我调用和堆栈记忆,能够最小化 LLM 的调用次数,从而高效地处理复杂任务。
    • 部署服务: GeneralAgent 可以与 AgentServer 配合使用,快速为大规模用户提供代理服务。

    GeneralAgent 功能介绍

    函数调用

    GeneralAgent 允许开发者将 Python 函数注册到代理中,并通过自然语言指令来调用这些函数。例如,我们可以定义一个获取天气信息的函数:

    def get_weather(city: str) -> str:
        """
        get weather information
        @city: str, city name
        @return: str, weather information
        """
        return f"{city} weather: sunny"

    然后将该函数注册到代理中:

    agent = Agent('你是一个天气小助手', functions=[get_weather])

    当用户询问 “成都天气怎么样?” 时,代理会自动调用 get_weather 函数,并将 “成都” 作为参数传递给该函数,最终返回 “成都天气: 晴朗”。

    知识库

    GeneralAgent 支持将外部知识库集成到代理中,从而增强代理的知识范围。开发者可以将知识库文件路径传递给代理,代理会自动加载并索引知识库内容。

    knowledge_files = ['../docs/paper/General_Agent__Self_Call_And_Stack_Memory.pdf']
    agent = Agent('你是AI助手,用中文回复。', workspace='9_knowledge_files', knowledge_files=knowledge_files)

    当用户提出问题时,代理会先在知识库中搜索相关信息,并将搜索结果作为 LLM 的输入,从而生成更准确、全面的答案。

    序列化

    GeneralAgent 支持序列化代理的状态,包括 LLM 的对话历史和 Python 解释器的状态。开发者可以使用 agent.save() 方法将代理的状态保存到磁盘,并使用 agent.load() 方法从磁盘加载代理的状态。

    # agent序列化位置,运行过程中会自动保存LLM的messages和python解析器的状态
    workspace='./5_serialize'
    
    role = 'You are a helpful agent.'
    agent = Agent(workspace=workspace)
    agent.user_input('My name is Shadow.')
    
    agent = None
    agent = Agent(role, workspace=workspace)
    agent.user_input('What is my name?')

    工作流

    GeneralAgent 支持定义复杂的工作流,并通过多个步骤来完成任务。开发者可以使用 agent.run() 方法执行单个步骤,并使用 Python 代码控制工作流的执行逻辑。

    # 工作流: 写小说
    from GeneralAgent import Agent
    from GeneralAgent import skills
    
    # 步骤0: 定义Agent
    agent = Agent('你是一个小说家')
    
    # 步骤1: 从用户处获取小说的名称和主题
    # topic = skills.input('请输入小说的名称和主题: ')
    topic = '小白兔吃糖不刷牙的故事'
    
    # 步骤2: 小说的概要
    summary = agent.run(f'小说的名称和主题是: {topic},扩展和完善一下小说概要。要求具备文艺性、教育性、娱乐性。')
    
    # 步骤3: 小说的章节名称和概要列表
    chapters = agent.run('输出小说的章节名称和每个章节的概要,返回列表 [(chapter_title, chapter_summary), ....]', return_type=list)

    多代理协作

    GeneralAgent 支持多个代理协作完成任务。开发者可以创建多个代理实例,并为每个代理分配不同的角色和任务。代理之间可以通过消息传递进行通信和协作。

    # 多Agent配合完成任务
    from GeneralAgent import Agent
    story_writer = Agent('你是一个故事创作家,根据大纲要求或者故事梗概,返回一个更加详细的故事内容。')
    humor_enhancer = Agent('你是一个润色作家,将一个故事进行诙谐润色,增加幽默元素。直接输出润色后的故事')

    多模态输入

    GeneralAgent 支持多模态输入,例如文本、图片、音频等。开发者可以将多模态数据封装成数组,并传递给 agent.user_input() 方法或 agent.run() 方法。

    # 支持多模态: 图片输入
    from GeneralAgent import Agent
    
    agent = Agent('You are a helpful assistant.')
    agent.user_input(['what is in the image?', {'image': '../docs/images/self_call.png'}])

    总结

    GeneralAgent 框架为构建智能代理提供了一个强大、灵活的平台,其丰富的功能和易用的 API 可以帮助开发者快速构建各种类型的智能代理应用。随着 LLM 技术的不断发展,GeneralAgent 框架将会在更多领域发挥重要作用。

  • 使用 GPT-4 解析 PDF 为 Markdown 文档:gptpdf 项目解析

    引言

    在信息爆炸的时代,如何高效地处理和提取 PDF 文档中的信息成为了一个普遍的需求。传统的 OCR 技术在处理复杂的排版、数学公式、表格和图片时往往力不从心。而 gptpdf 项目利用强大的视觉大语言模型 GPT-4,为 PDF 解析提供了一种全新的解决方案。

    gptpdf 项目概述

    gptpdf 项目的核心思想是利用 GPT-4 强大的多模态理解能力,将 PDF 文档解析为结构化的 Markdown 格式。项目地址:https://github.com/CosmosShadow/gptpdf

    与传统的 OCR 技术相比,gptpdf 项目具有以下优势:

    • 更精准的识别: gptpdf 能够准确识别复杂的排版、数学公式、表格、图片、图表等内容,而传统的 OCR 技术在处理这些内容时 often 出现错误。
    • 更结构化的输出: gptpdf 将解析结果输出为 Markdown 格式,方便后续编辑和处理,而传统的 OCR 技术只能输出纯文本,丢失了原文档的结构信息。
    • 更低的成本: gptpdf 平均每页的解析成本仅需 0.013 美元,远低于人工解析的成本。

    gptpdf 工作原理

    gptpdf 的工作流程可以概括为以下两个步骤:

    1. 预处理: 使用 PyMuPDF 库对 PDF 文件进行解析,识别并标记出所有非文本区域,例如图片、表格、公式等。 ![][]
    2. GPT-4 解析: 将预处理后的 PDF 页面图片和标记信息发送给 GPT-4o 模型进行解析,GPT-4o 模型会根据页面内容和标记信息,生成相应的 Markdown 文本。

    gptpdf 使用方法

    使用 gptpdf 非常简单,只需安装 gptpdf 包并调用 parse_pdf 函数即可:

    from gptpdf import parse_pdfapi_key = 'Your OpenAI API Key'
    content, image_paths = parse_pdf(pdf_path, api_key=api_key)
    print(content)

    其中:

    • pdf_path: 要解析的 PDF 文件路径。
    • api_key: 您的 OpenAI API 密钥。
    • content: 解析后的 Markdown 文本。
    • image_paths: 解析过程中提取的图片路径列表。

    gptpdf 项目特色

    除了基本的功能之外,gptpdf 还提供了一些额外的功能,例如:

    • 支持多种 OpenAI 模型: 用户可以根据自己的需求选择不同的 OpenAI 模型,例如 gpt-4oqwen-vl-maxGLM-4V 等。
    • 支持 Azure OpenAI: 用户可以使用 Azure OpenAI 服务来运行 gptpdf。
    • 可配置的输出: 用户可以自定义输出目录、文件名等参数。
    • 详细的日志: 用户可以通过设置 verbose=True 来查看详细的解析日志。

    总结

    gptpdf 项目提供了一种高效、准确、低成本的 PDF 解析方案,为处理大量 PDF 文档提供了新的思路。随着 GPT-4 等视觉大语言模型的不断发展,相信 gptpdf 项目会在未来得到更广泛的应用。

    参考文献

  • 开源大语言模型提示工程探索:机器翻译与摘要评估新视角

    引言

    近年来,大型语言模型(LLM)的兴起彻底改变了自然语言处理(NLP)领域。尤其引人注目的是,LLM 的上下文学习能力使其能够作为自然语言生成任务的评估指标,这在低资源场景和时间受限的应用中尤为 advantageous。传统的评估指标,例如 BLEU 或 ROUGE,往往依赖于大量的人工标注数据,而 LLM 则可以通过少量的样本学习到评估文本质量的能力。

    然而,尽管已经提出了许多基于提示的 LLM 评估指标,但目前仍然缺乏对不同提示方法进行结构化评估的研究,特别是对于开源模型而言。本文介绍了 PrExMe,一个针对评估指标的大规模提示探索框架。我们评估了超过 720 个提示模板,涵盖了机器翻译(MT)和摘要数据集上的开源 LLM 评估指标,总计超过 660 万次评估。这项广泛的比较 (1) 作为近期开源 LLM 作为评估指标的性能基准,(2) 探索了不同提示策略的稳定性和可变性。

    相关工作

    基于提示的评估指标

    近年来,LLM 在自然语言生成(NLG)评估指标方面取得了显著进展,其主要依赖于上下文学习,即直接从生成的文本中预测质量判断。Li 等人(2024b)和 Gao 等人(2024a)的综述提供了对这些指标的全面概述。除了 BARTSCORE(Yuan 等人,2021 年)和 PRD(Li 等人,2024a),Li 等人(2024b)综述的基于提示的方法都建立在闭源模型之上。相比之下,EVAL4NLP 2023 共享任务(Leiter 等人,2023 年)明确考虑了开源的基于提示的指标,要求参与者仅使用提供的模型来评估机器翻译和摘要,而不能对这些模型进行微调。表现最好的提交甚至能够击败强大的基线,例如机器翻译领域的 GEMBA(Kocmi 和 Federmann,2023b)和摘要领域的 BARTSCORE。

    提示技术

    近年来,人们提出了许多成功的提示技术(例如,Liu 等人,2023a)。我们的工作主要依赖于已有的方法,如零样本 CoT 和 RAG。此外,Li 等人(2023 年)提出了情绪诱导提示,以提高 LLM 的性能。据我们所知,我们是第一个分析这种技术在评估指标中的应用的。受此启发,我们还提出了一种新颖的情绪-CoT 模式(见第 3 节)。Kocmi 和 Federmann(2023b)对基于提示的指标的输出格式进行了先前的评估,我们通过更广泛的评估对其进行了扩展。其他工作也使用分层模板来构建提示(例如 Fu 等人,2023 年),LangChain(Chase,2022 年)和 DSPy(Khattab 等人,2023 年)等工具也支持这种实现。我们使用分层模板作为结构化比较不同提示模式的一种手段。

    提示鲁棒性

    由于我们对不同的提示、数据集和任务进行了网格搜索,因此我们的工作建立在 LLM 如何响应提示扰动的研究基础之上,并对其进行了扩展。Webson 和 Pavlick(2022 年)、Leidinger 等人(2023 年)、Weber 等人(2023 年)以及 Sclar 等人(2023 年)发现,自然语言推理和情感分类的性能存在很大差异。作为解决方案,Sclar 等人(2023 年)建议提供不同提示扰动下的所有结果。Voronov 等人(2024 年)和 Mizrahi 等人(2024 年)认为,目前 LLM 的评估基准存在问题,因为它们通常每个任务只提供一个提示模板。这可以通过提供多个模板并评估其集合来解决。据我们所知,我们是第一个探索这些鲁棒性问题在多大程度上影响开源的基于 LLM 的指标,以及如何为其选择最佳提示的。此外,通过使用多个提示来提示 LLM,我们遵循了 Mizrahi 等人(2024 年)的做法,实现了对 LLM 的稳定和公平的评估。

    研究方法

    为了系统地研究不同提示方法对 LLM 评估指标的影响,我们构建了一个名为 PrExMe 的大规模提示探索框架。

    提示模板

    我们的提示被构建成分层模板(见图 1),即一个大的模板由多个小的模板构成。每个提示都由以下部分构成:(1) 需要评分的源文本和生成的假设文本,(2) 基本提示,(3) 任务描述,(4) 格式要求,以及 (5) 可选的单样本演示。表 1 展示了 (2)、(3)、(4) 和 (5) 的例子。

    基本提示

    基本提示是我们提示层次结构的顶层,它包含了其他组件。具体来说,我们测试了三个零样本(ZS)和相应的单样本(OS)基本提示:(1) 普通 ZS/OS (PZS/POS),(2) ZS/OS-COT,以及 (3) ZS/OS-CoT-Emotion (ZS/OS-COT-EM)。PZS 简单地呈现了用换行符分隔的任务描述、源文本、假设文本和格式要求。ZS-COT (KOJIMA ET AL.,2022) 另外要求模型在返回输出之前逐步思考。最后,ZS-COT-EM 要求模型在 ZS-CoT 提示之前描述其“情绪”。我们之所以包含 CoT,是因为它提高了基于提示的闭源指标(如 AUTOMQM Fernandes 等人(2023 年)和 GEMBA(Kocmi 和 Federmann,2023a))的性能。ZS-COT-EM 探索了在提示 LLM 描述其输出中的情绪时,LLM 性能的变化。这是由我们对情绪提示对指标性能的探索所推动的(见下文“任务描述”)。模板的 OS 版本添加了一个用于演示的字段。为了避免模型局限于特定的推理步骤,我们在 OS-CoT 中包含了一个占位符,模型应该在其中插入其推理。

    任务描述

    任务描述是给生成的假设评分的指令。Li 等人(2023 年)发现,对人类来说能引发某些情绪的 LLM 指令可以提高性能。受这一发现的启发,我们探索了在任务描述中使用“情绪提示”。这种方法主要提供了一种简单的改写策略,以扩大我们的网格搜索范围。此外,它还允许我们研究“情绪”对基于 LLM 的指标的影响。除了中性提示外,我们还包括了例如礼貌、威胁和怀疑的指令。我们自己创建了 11 个任务描述,并使用 CHATGPT (OpenAI, 2023) 创建了 13 个任务描述。

    格式要求

    格式要求描述了 LLM 在生成分数时应遵循的输出格式。例如,它包括输出分数应该在哪一范围内,以及应该是离散的还是连续的。此外,我们还包括要求 LLM 返回文本质量标签的提示。我们总共定义了 10 种格式要求。

    单样本演示

    最后,我们使用 RAG 构造可选的 OS 演示。我们从 WMT21 (Freitag 等人,2021 年) 中提取机器翻译的演示,从 ROSE (Liu 等人,2023b) 中提取摘要的演示。

    基于 MQM 的方法

    除了分层模板之外,我们还使用选定的开源 LLM 测试了 GEMBA-MQM (Kocmi 和 Federmann,2023a) 的提示。GEMBA-MQM 通常使用 GPT4,它根据出现的错误数量(按严重程度加权)来预测分数。我们将开源实现称为 LocalGemba。

    数据集和阶段

    我们的实验分两个阶段,使用不同的数据集。这样做是为了减轻大规模提示搜索带来的统计效应。此外,它还允许我们在完整的数据集上评估选定的提示(否则这项任务将非常耗费资源),并探索其泛化能力。

    在第一阶段,我们使用 EVAL4NLP 2023 (Leiter 等人,2023 年) 的训练集进行评估;在第二阶段,我们使用其开发集和测试集进行评估。训练集和开发集是 WMT2022 指标共享任务 (Freitag 等人,2022 年) 和 SUMMEVAL (Fabbri 等人,2021 年) 的(无参考)分割。测试集由 Leiter 等人(2023 年)新标注。作为第二个测试集,我们使用了 WMT23 MQM 机器翻译标注 (Freitag 等人,2023 年) 和 Seahorse 多语言摘要标注 (Clark 等人,2023 年)。由于 OS 提示在其他数据集上的表现不佳,因此我们没有在 WMT23/SEAHORSE 上对其进行评估。

    在第一阶段,我们评估了训练集上 720 个 ZS 提示的所有组合。由于这非常耗费资源,因此对于机器翻译,我们将每个语种对限制在第一阶段,我们评估了训练集上 720 个 ZS 提示的所有组合。由于这非常耗费资源,因此对于机器翻译,我们将每个语种对限制为 1,000 个样本。对于摘要,我们使用了 SUMMEVAL 中的所有样本。对于每个模型,我们选择 Kendall 的 τ 与人类判断的相关性最高的 10 个提示。在第二阶段,我们使用这些选定的提示来评估开发集和测试集,以及 WMT23/SEAHORSE。

    模型

    我们实验中使用的所有模型都可以在 HuggingFace Hub 上公开获取,并且可以在消费级硬件上运行。我们使用七个不同的模型: GPT2-XL (Radford 等人,2019 年)、OPT-IML-30B (Iyer 等人,2022 年)、BLOOM-7B1 (Scao 等人,2022 年)、Pythia-12B (Biderman 等人,2023 年)、StableLM-Base-Alpha-7B (Chiang 等人,2023 年)、OpenAssistant-Pythia-12B (Köpf 等人,2023 年) 和 PLATYPUS2-70B (Lee 等人,2023a)。我们选择这些模型是因为它们代表了不同大小、架构和训练数据集的开源 LLM 的多样化样本。

    实验结果

    RQ1:开源 LLM 的评估能力

    为了回答关于开源 LLM 评估能力的第一个研究问题,我们分析了不同模型在不同数据集上的总体性能。图 2 显示了所有模型在所有数据集和任务上的平均 Kendall 的 τ。

    图2:不同模型在不同数据集上的平均 Kendall 的 τ。

    总的来说,PLATYPUS2-70B 在所有数据集上都取得了最好的结果,这表明更大的模型更适合作为评估指标。然而,其他模型(如 OpenAssistant-Pythia-12B)在某些情况下也表现良好,这表明模型大小并不是性能的唯一决定因素。

    RQ2:提示模式的稳定性为了研究不同提示模式的稳定性,我们分析了不同数据集、任务和模型之间 Kendall 的 τ 的变化。我们发现,某些提示模式(如要求模型返回文本标签而不是数字分数)对于某些模型(如 PLATYPUS2-70B)始终表现良好。然而,我们也发现,对于某些设置,即使是对输入提示进行微小的更改也会极大地影响性能。例如,将请求的输出格式从“0 到 100”更改为“-1 到 +1”会极大地影响我们评估中的排名。

    RQ3:新评估场景的提示设计

    根据我们的发现,我们为新评估场景的提示设计提出以下建议:

    • 从简单的提示开始。 在许多情况下,简单的零样本提示就能获得良好的结果。
    • 尝试不同的输出格式。 一些模型更喜欢返回文本标签,而另一些模型则在使用数字分数时表现更好。
    • 考虑使用 CoT 提示。 CoT 提示可以帮助提高某些模型的性能,尤其是在评估复杂文本时。
    • 在多个数据集上评估你的提示。 即使是表现良好的提示也可能无法很好地泛化到新数据集。

    结论

    在这项工作中,我们对不同提示方法对 LLM 评估指标的影响进行了大规模分析。我们的研究结果表明,某些提示模式是稳健的,并且可以很好地泛化到不同的任务和数据集。然而,我们也发现,对于某些设置,即使是对输入提示进行微小的更改也会极大地影响性能。根据我们的发现,我们为新评估场景的提示设计提出了一些建议。

    参考文献

    • Biderman, S. et al. (2023). Pythia: A suite for analyzing large language models across training and scaling. arXiv preprint arXiv:2304.01355.
    • Chase, H. (2022). Langchain. https://github.com/hwchase17/langchain.
    • Chiang, W.-L. et al. (2023). Stablelm-alpha 7b: Small and mighty for research. https://github.com/Stability-AI/stablelm.
    • Clark, E. et al. (2023). Seahorse: A multilingual benchmark for factual correctness in summarization. arXiv preprint arXiv:2306.05125.
    • Fabbri, A. R. et al. (2021). Summeval: Re-evaluating summarization evaluation. Transactions of the Association for Computational Linguistics, 9, 408–430.
    • Fernandes, P. et al. (2023). AutoMQM: Automatic machine translation evaluation with large language models. In Proceedings of the 17th Conference of the European Association for Machine Translation.
    • Freitag, M. et al. (2021). Results of the WMT21 Metrics Shared Task: Evaluating metrics with explanations. In Proceedings of the Sixth Conference on Machine Translation.
    • Freitag, M. et al. (2022). Findings of the WMT22 Shared Task on Machine Translation Quality Estimation. In Proceedings of the Seventh Conference on Machine Translation.
    • Freitag, M. et al. (2023). Findings of the WMT23 Shared Task on Machine Translation Quality Estimation. In Proceedings of the Eighth Conference on Machine Translation.
    • Fu, Y. et al. (2023). From words to programs: Exploring the potential of large language models for abstract semantic parsing. arXiv preprint arXiv:2305.17770.
    • Gao, L. et al. (2024a). A survey of large language model based automatic metrics for natural language generation. arXiv preprint arXiv:2404.14012.
    • Gao, L. et al. (2024b). Retrieval augmentation for large language model based evaluation metrics. arXiv preprint arXiv:2405.12504.
    • Iyer, S. et al. (2022). OPT: Open pre-trained transformer language models. arXiv preprint arXiv:2205.01068.
    • Khattab, O. et al. (2023). DSPy: Towards general-purpose symbolic programming for composable program synthesis. arXiv preprint arXiv:2305.15956.
    • Kocmi, T. and Federmann, C. (2023a). Large language models are not fair judges: Exploring the intrinsic bias of dataset average as a metric. arXiv preprint arXiv:2305.13400.
    • Kocmi, T. and Federmann, C. (2023b). On the evaluation of machine translation systems trained with controlled simplification. In Proceedings of the 17th Conference of the European Association for Machine Translation.
    • Kojima, T. et al. (2022). Large language models are zero-shot reasoners. arXiv preprint arXiv:2205.11916.
    • Köpf, B. et al. (2023). OpenAssistant Conversations—democratizing large language model alignment. arXiv preprint arXiv:2304.07327.
    • Lee, H. Y. et al. (2023a). PLATYPUS: Quick, cheap, and accurate fine-tuning of large language models. arXiv preprint arXiv:2310.11307.
    • Leidinger, T. et al. (2023). Prompt surveillance: Tracking prompts that expose weaknesses in large language models. arXiv preprint arXiv:2302.12177.
    • Leiter, C. et al. (2023). Findings of the WMT 2023 Shared Task on Evaluating the Evaluation of Machine Translation and Summarization. In Proceedings of the Eighth Conference on Machine Translation.
    • Li, H. et al. (2023). Exploring the impact of emotion on large language models. arXiv preprint arXiv:2305.14725.
    • Li, S. et al. (2024a). Unbabel’s submission to the WMT23 metrics shared task: Prompting large language models for machine translation quality estimation. In Proceedings of the Eighth Conference on Machine Translation.
    • Li, Y. et al. (2024b). A survey of automatic metrics based on large language models for natural language generation. arXiv preprint arXiv:2404.00774.
    • Liu, P. et al. (2023a). Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing. ACM Computing Surveys, 55(9), 1–35.
  • LLM 也许是 LongLM:无需微调地自扩展 LLM 上下文窗口

    @misc{jin2024llm,
          title={LLM Maybe LongLM: Self-Extend LLM Context Window Without Tuning}, 
          author={Hongye Jin and Xiaotian Han and Jingfeng Yang and Zhimeng Jiang and Zirui Liu and Chia-Yuan Chang and Huiyuan Chen and Xia Hu},
          year={2024},
          eprint={2401.01325},
          archivePrefix={arXiv},
          primaryClass={cs.CL}
    }

    》这篇论文介绍了一种名为 Self-Extend 的新方法,该方法可以在不进行微调的情况下,有效地扩展大型语言模型 (LLM) 的上下文窗口。

    1. 引言

    大型语言模型 (LLM) 在各种任务中都取得了显著的成果,但其应用受限于训练序列的长度。为了解决这个问题,本文提出了一种名为 Self-Extend 的方法,该方法可以有效地扩展 LLM 的上下文窗口,而无需进行任何微调。

    2. Self-Extend 方法概述

    Self-Extend 方法的核心思想是构建双层注意力信息:组级别和邻居级别。这两种级别的注意力信息都是通过原始模型的自注意力机制计算得到的,这意味着该方法不需要任何额外的训练。

    2.1 双层注意力机制

    • 组级别注意力: 将输入序列划分为多个组,每个组包含多个词语。组级别注意力机制计算每个组与其他所有组之间的注意力权重。
    • 邻居级别注意力: 在每个组内,邻居级别注意力机制计算每个词语与其邻居词语之间的注意力权重。

    通过结合组级别和邻居级别注意力信息,Self-Extend 方法可以有效地扩展 LLM 的上下文窗口,使其能够处理更长的输入序列。

    如下图所示:

    3. Self-Extend 的使用

    3.1 环境配置

    目前,Self-Extend 方法已在 Llama 模型上进行了测试,所需的 Python 包如下:

    transformers==4.38.2
    flash_attn==2.5.6 

    推荐使用以下 Docker 镜像: hoytjin/selfextend_docker:v0.1

    3.2 运行 Self-Extend

    import SelfExtend
    
    # 加载模型,例如:loaded_model = AutoModelForCausalLM.from_pretrained(model_path) 
    
    # 设置组大小和邻居窗口大小
    
    SelfExtend.apply(loaded_model, group_size, window_size, enable_flash_attention=False)
    
    # 进行推理,例如:loaded_model.generate(...)

    默认情况下,enable_flash_attention=False。如果模型加载时启用了 FlashAttention,则可以设置 enable_flash_attention=True

    以下代码示例展示了如何使用 Self-Extend 方法进行密钥检索:

    python example.py

    4. 如何选择组大小和邻居窗口大小

    选择合适的组大小和邻居窗口大小对于 Self-Extend 方法的性能至关重要。以下是一些经验法则:

    • 以 Llama-2 为基础模型,2~64 是合理的组大小;512~1536 是可行的邻居窗口大小。但在许多情况下,较大的组大小和较小的邻居窗口大小也是不错的选择。
    • 选择组大小和邻居窗口大小的一般原则是:确保输入序列长度在最大扩展窗口大小之内(对于 Llama-2,最大扩展窗口大小为 (4096 – 邻居窗口大小) * 组大小 + 邻居窗口大小)。
    • 作者并没有仔细选择组大小。对于相同的序列,较小的组应该更好。但在一些实验中,作者发现情况并非总是如此:

    有时,较大的组大小可能更有益。这可能是因为较大的位置没有得到很好的训练。较大的组大小可以利用在预训练中接受过更多训练的较小位置来促进扩展。然而,较小的组大小往往具有更好的精度。因此,这是一个权衡。更多细节请参考消融研究部分。

    例如:
    如果问答任务的输入长度为 15,800,邻居窗口大小设置为 1,024,则组大小可以设置为 5。这是因为 5 * (4,096 – 1,024) + 1,024 等于 16,384,大于 15,800。然而,将组大小设置为 6,甚至更大,例如 8 或 16,可能会提高模型的性能。当组大小为 5 时,Self-Extend 使用位置 1,025 到 3,979 来扩展上下文窗口。如果组大小设置为 8,Self-Extend 使用位置 1,025 到 2,871 进行扩展。虽然组大小为 8 的精度低于组大小为 5,但在预训练期间,组大小为 5 时使用的位置 2,872 到 3,979 的训练程度较低,这可能会影响扩展的有效性。

    • 也许,对于长度为 L 的序列,可以先尝试最小的组大小 [计算公式为:G * (L- w_n) + w_n],然后测试更大的组大小是否更好。

    Self-Extend 在“大海捞针”任务上的表现

    经验法则

    将预训练上下文窗口表示为 $L$,目标扩展长度表示为 $N$,邻居窗口表示为 $W$,组大小表示为 $G$,选择超参数的经验法则是确保以下不等式成立: $(\frac{1}{2} \sim \frac{2}{3}) \times L > W + \frac{N-W}{G}$ 这是经验性的,作者认为这是因为:较大的相对位置没有得到很好的训练。根据经验,只有一部分($\frac{1}{2} \sim \frac{2}{3}$)的位置得到了很好的训练,Self-Extend 应该只利用这些训练有素的相对位置进行扩展。这一发现解释了:

    • 过小的组大小会降低性能,因为它们提供了精确的位置信息,但需要 Self-Extend 利用训练程度较低的相对位置进行扩展。
    • 过大的邻居窗口大小也会降低性能,因为它们提供了更多的邻居信息,但需要利用训练程度较低的相对位置进行扩展。

    实验结果表明,Self-Extend 对超参数的选择并不十分敏感。预先定义的、启发式的组大小和邻居窗口大小值通常足以获得令人满意的性能。

    [TLDR]

    Self-Extend 对超参数的选择并不十分敏感。可以使用一个代表性任务来找到合适的超参数。或者直接遵循作者的经验不等式: $(\frac{1}{2} \sim \frac{2}{3}) \times L > W + \frac{N-W}{G}$

    5. 总结

    Self-Extend 是一种简单而有效的方法,可以在不进行微调的情况下扩展 LLM 的上下文窗口。该方法易于实现,并且可以应用于各种 LLM 模型。实验结果表明,Self-Extend 方法可以显著提高 LLM 在长文本任务上的性能。

    参考文献

    @misc{jin2024llm,
          title={LLM Maybe LongLM: Self-Extend LLM Context Window Without Tuning}, 
          author={Hongye Jin and Xiaotian Han and Jingfeng Yang and Zhimeng Jiang and Zirui Liu and Chia-Yuan Chang and Huiyuan Chen and Xia Hu},
          year={2024},
          eprint={2401.01325},
          archivePrefix={arXiv},
          primaryClass={cs.CL}
    }
  • 基于音频特征的情感识别

    MELD这篇论文将介绍如何使用音频特征进行情感识别。我们将以 MELD 数据集为例,使用 Python 代码演示如何提取音频特征并将其用于情感分类。

    数据集介绍

    MELD (Multimodal EmotionLines Dataset) 是一个多模态情感数据集,包含 Friends 电视剧中的对话片段。每个片段都标注了说话人的情感和语句的情感倾向。

    train_data=pd.read_csv('/content/MELD/data/MELD/train_sent_emo.csv')
    valid_data=pd.read_csv('/content/MELD/data/MELD/dev_sent_emo.csv')
    test_data=pd.read_csv('/content/MELD/data/MELD/test_sent_emo.csv')

    上述代码展示了如何使用 pandas 库读取 MELD 数据集中的训练集、验证集和测试集。

    音频特征提取

    为了从音频数据中提取特征,我们使用 Librosa 库。Librosa 是一个强大的音频处理库,提供了许多用于特征提取的函数。

    首先,我们定义一些特征提取的参数:

    num_mfcc=40
    sr=22050
    hop_length=512
    n_fft=2048
    • num_mfcc:MFCC 特征的数量,这里设置为 40。
    • sr:音频采样率,这里设置为 22050 Hz。
    • hop_length:帧移长度,这里设置为 512 个样本点。
    • n_fft:傅里叶变换的窗口大小,这里设置为 2048 个样本点。

    接下来,我们遍历测试集中的所有音频文件,并提取以下特征:

    • 色度频率: 使用 librosa.feature.chroma_stft 函数提取。
    • 均方根能量: 使用 librosa.feature.rmse 函数提取。
    • 谱心: 使用 librosa.feature.spectral_centroid 函数提取。
    • 谱带宽: 使用 librosa.feature.spectral_bandwidth 函数提取。
    • 谱衰减点: 使用 librosa.feature.spectral_rolloff 函数提取。
    • 过零率: 使用 librosa.feature.zero_crossing_rate 函数提取。
    • MFCC: 使用 librosa.feature.mfcc 函数提取 40 个 MFCC 特征。
    for audio_file in os.listdir('/content/drive/My Drive/MELD/test'):
      # ...
      y, sr = librosa.load(audio, mono=True)
      chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
      rmse = librosa.feature.rmse(y=y)
      spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
      spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
      rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
      zcr = librosa.feature.zero_crossing_rate(y)
      mfcc = librosa.feature.mfcc(y=y, sr=sr,n_mfcc=40)
      # ...

    我们将所有提取的特征取平均值,并将它们与对应的情感标签一起保存到 CSV 文件中。

      to_append = f'{audio_file} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'
      # ...
      to_append += f' {senti}'
      # ...
      with file:
        writer = csv.writer(file)
        writer.writerow(to_append.split())

    情感分类

    提取音频特征后,我们可以使用各种机器学习算法进行情感分类。常用的算法包括:

    • 支持向量机 (SVM)
    • 随机森林 (Random Forest)
    • 深度神经网络 (DNN)

    我们可以使用训练集数据训练模型,并使用验证集数据评估模型性能。最后,我们可以使用测试集数据测试模型的泛化能力。

    总结

    本文介绍了如何使用音频特征进行情感识别。我们以 MELD 数据集为例,使用 Librosa 库提取了音频特征,并将它们保存到 CSV 文件中。最后,我们讨论了可以使用哪些机器学习算法进行情感分类。

    参考文献

  • 免费获取知识的宝库:22个美国免费教科书网站推荐

    在美国,高中和大学的教科书费用是一笔不小的开销。为了减轻大家的经济负担,本文整理了22个提供免费高中及大学教科书的网站,希望能够帮助到有需要的学生和家长。

    1. 资源丰富的综合类网站

    • Open Textbook Library: 由 Center for Open Education 和 Open Textbook Network 共同创建,提供商业、工程、法律等14个领域的教科书,所有书籍都经过大学老师审查,并提供 PDF 和 EPUB 格式下载。 (https://open.umn.edu/opentextbooks/)
    • OpenStax: 由莱斯大学创建,提供高中和大学的免费教科书,采用 CC-BY 授权方式,允许用户修改和传播内容。 (https://openstax.org/subjects)
    • LibreTexts: 由美国国家科学基金会赞助,提供化学、生物学等12个领域的书籍、作业题目、案例研究等资源,并支持用户协作修正错误。(https://libretexts.org/index.html)
    • California Open Online Library for Education (COOL4Ed): 由加州三大高等教育系统组成,提供免费电子教科书和在线课程,涵盖人文艺术、科学技术等多个领域。(https://www.cool4ed.org/)
    • Open Culture: 提供由知名学者编写的免费电子教科书,以及超过1300个顶尖大学的免费在线课程。(https://www.openculture.com/free_textbooks)
    • Open SUNY Textbooks: 由纽约州立大学图书馆创建,提供超过200本涵盖多个领域的免费教科书。(https://textbooks.opensuny.org/browse-by-subject/)
    • 2012 Book Project: 收集整理了一个出版商发布的免费教科书,以入门级大学用书为主,涵盖经济、政治、法律等多个领域。(https://2012books.lardbucket.org/)
    • College Open Textbooks: 由卡内基梅隆大学与多个教育机构共同创建,提供工程、电子、健康等24个领域的700多本开放式教科书,并标明授权方式。(https://collegeopentextbooks.org/)
    • DOAB (Directory of open access books): 收录超过一万本开放获取的书籍,并与众多出版商合作。(https://www.doabooks.org/)

    2. 特色鲜明的专业类网站

    • Intech: 与全球9万多名科学家合作,提供工程、科技、物理等领域的教科书和期刊,拥有约2500本开放式教科书。(https://www.intechopen.com/books/)
    • NOBA: 提供心理学领域的专业教科书,旨在减轻学生负担,并为教师提供交流平台。(https://nobaproject.com/)
    • O’Really: 知名计算机信息书籍出版社,提供部分绝版或重要书籍的免费 PDF 下载,涵盖程序编写、网络管理等内容。(https://www.oreilly.com/openbook/)
    • Project Gutenberg: 收藏超过著作权年限的书籍,目前已有超过56000本藏书,提供多种下载格式。(https://www.gutenberg.org/)
    • Textbook Revolution: 致力于收集高质量的免费教科书,帮助教师和学生减轻经济压力,提供按领域、主题或授权方式搜索的功能。(http://textbookrevolution.org/index.php/Book:Lists/Subjects)
    • The Global Text Project: 由乔治亚大学和丹佛大学共同创建,提供自行开发的全球商业和教育类教科书。(http://globaltext.terry.uga.edu/)

    3. 用户共建的开放平台

    4. 方便实用的导航网站

    希望以上整理的网站能够帮助大家找到需要的免费教科书,减轻学习成本,更轻松地获取知识!

    参考文献

    [1] 22个免费美国教科书网站 包括高中及大学 – 美国实用资讯 (https://www.chineselikela.com/huaren/usa-study/35865/)