当前位置: 首页 > article >正文

结构化生成式 AI

原文towardsdatascience.com/structured-generative-ai-e772123428e4?sourcecollection_archive---------3-----------------------#2024-04-18如何限制你的模型输出定义的格式https://medium.com/orenmatar?sourcepost_page---byline--e772123428e4--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--e772123428e4-------------------------------- Oren Matar·发表于 Towards Data Science ·阅读时间 7 分钟·2024 年 4 月 18 日–在这篇文章中我将解释并演示“结构化生成式 AI”的概念即将生成式 AI 限制在定义的格式内。文章结束时你将理解它的应用场景以及如何实现它无论是从零开始构建一个变换器模型还是使用 Hugging Face 的模型。此外我们还将介绍一个与分词相关的重要技巧特别适用于结构化语言。生成式 AI 的许多用途之一是作为翻译工具。这通常涉及在人类语言之间的翻译但也可以包括计算机语言或格式。例如你的应用程序可能需要将自然语言人类语言翻译成 SQL**Natural language**:“Get customer namesandemails of customersfromthe US”**SQL**:SELECT name, email FROM customers WHERE country USA或者将文本数据转换为 JSON 格式**Natural language**:“I am John Doe,phone numberis555–123–4567,my friends are AnnaandSara”**JSON**:{name:John Doe,phone_number:555–123–5678,friends:{name:[[Anna,Sara]]}}自然地其他结构化语言也可以有更多的应用。此类任务的训练过程包括将自然语言与结构化格式的示例输入到编码器-解码器模型中。或者利用预训练的语言模型LLM也可以满足需求。虽然实现 100% 准确率是不可能的但有一类错误我们是可以消除的语法错误。这些错误是对语言格式的违反比如用点替代逗号使用 SQL 模式中没有的表名或者遗漏括号闭合这些都会导致 SQL 或 JSON 无法执行。我们正在翻译成结构化语言这意味着在每一步生成过程中合法令牌的列表是有限的并且是预定的。如果我们能够将这一知识注入到生成式 AI 过程中就能避免许多不正确的结果。这就是结构化生成式 AI 的理念将其限制为一组合法的令牌。关于令牌生成的快速提醒无论是使用编码器-解码器架构还是 GPT 架构令牌生成都是按顺序进行的。每个令牌的选择依赖于输入和之前生成的令牌直到生成令牌标志着序列的完成。在每一步分类器会为词汇表中的所有令牌分配 logit 值表示每个令牌作为下一个选择的概率。接下来的令牌是基于这些 logits 进行采样的。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cad3a2ae8eae2f7150a70bacdecbaa82.png解码器分类器为词汇表中的每个令牌分配一个 logit图片由作者提供限制令牌生成为了约束令牌生成我们结合了对输出语言结构的理解。不合法的令牌将其 logits 设置为-inf确保它们不会被选中。例如如果在“Select name”后只有逗号或“FROM”是合法的那么所有其他令牌的 logits 都会被设置为-inf。如果你使用 Hugging Face可以通过“logits 处理器”实现这一点。要使用它你需要实现一个包含call方法的类该方法在计算 logits 后被调用但在采样之前。此方法接收所有令牌 logits 和生成的输入 ID并返回所有令牌的修改后的 logits。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e92f5fbfb0e5b222e3b5b4571ae33971.png从 logits 处理器返回的 logits所有不合法的令牌都会得到-inf 的值图片由作者提供我将通过一个简化的示例演示代码。首先我们初始化模型这里我们使用 Bart 模型但任何模型都可以使用。fromtransformersimportBartForConditionalGeneration,BartTokenizerFast,PreTrainedTokenizerfromtransformers.generation.logits_processimportLogitsProcessorList,LogitsProcessorimporttorch namefacebook/bart-largetokenizerBartTokenizerFast.from_pretrained(name,add_prefix_spaceTrue)pretrained_modelBartForConditionalGeneration.from_pretrained(name)如果我们想要生成从自然语言到 SQL 的翻译可以运行to_translatecustomers emails from the uswordsto_translate.split()tokenized_texttokenizer([words],is_split_into_wordsTrue)outpretrained_model.generate(torch.tensor(tokenized_text[input_ids]),max_new_tokens20,)print(tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(out[0],skip_special_tokensTrue)))返回More emails from the us由于我们没有针对文本到 SQL 任务对模型进行微调因此输出不类似于 SQL。在本教程中我们不会训练模型但我们会引导它生成 SQL 查询。我们将通过使用一个函数来实现这一点该函数将每个生成的令牌映射到允许的下一个令牌列表。为了简化我们仅关注紧接着的前一个令牌但更复杂的机制也容易实现。我们将使用一个字典来定义每个令牌允许的后续令牌。例如查询必须以“SELECT”或“DELETE”开始在“SELECT”之后仅允许“name”、“email”或“id”因为这些是我们架构中的列。rules{s:[SELECT,DELETE],# beginning of the generationSELECT:[name,email,id],# names of columns in our schemaDELETE:[name,email,id],name:[,,FROM],email:[,,FROM],id:[,,FROM],,:[name,email,id],FROM:[customers,vendors],# names of tables in our schemacustomers:[/s],vendors:[/s],# end of the generation}现在我们需要将这些令牌转换为模型使用的 ID。这将在一个继承自 LogitsProcessor 的类中完成。defconvert_token_to_id(token):returntokenizer(token,add_special_tokensFalse)[input_ids][0]classSQLLogitsProcessor(LogitsProcessor):def__init__(self,tokenizer:PreTrainedTokenizer):self.tokenizertokenizer self.rules{convert_token_to_id(k):[convert_token_to_id(v0)forv0inv]fork,vinrules.items()}最后我们将实现call函数该函数在计算 logits 后被调用。此函数创建一个包含-infs 的新张量检查哪些 ID 符合规则字典中的规则并将其分数放入新张量中。结果是一个仅包含有效令牌的有效值的张量。classSQLLogitsProcessor(LogitsProcessor):def__init__(self,tokenizer:PreTrainedTokenizer):self.tokenizertokenizer self.rules{convert_token_to_id(k):[convert_token_to_id(v0)forv0inv]fork,vinrules.items()}def__call__(self,input_ids:torch.LongTensor,scores:torch.LongTensor):ifnot(input_idsself.tokenizer.bos_token_id).any():# we must allow the start token to appear before we start processingreturnscores# create a new tensor of -infnew_scorestorch.full((1,self.tokenizer.vocab_size),float(-inf))# ids of legitimate tokenslegit_idsself.rules[int(input_ids[0,-1])]# place their values in the new tensornew_scores[:,legit_ids]scores[0,legit_ids]returnnew_scores就这样我们现在可以使用 logits 处理器进行生成to_translatecustomers emails from the uswordsto_translate.split()tokenized_texttokenizer([words],is_split_into_wordsTrue,return_offsets_mappingTrue)logits_processorLogitsProcessorList([SQLLogitsProcessor(tokenizer)])outpretrained_model.generate(torch.tensor(tokenized_text[input_ids]),max_new_tokens20,logits_processorlogits_processor)print(tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(out[0],skip_special_tokensTrue)))返回SELECT email,email,id,email FROM customers结果有点奇怪但请记住我们甚至没有训练模型我们只是根据特定规则强制生成标记。值得注意的是约束生成不会干扰训练约束只在训练后生成过程中起作用。因此当这些约束得当实施时它们只会提高生成准确性。我们的简化实现未能涵盖所有 SQL 语法。一个真正的实现必须支持更多的语法可能不仅考虑最后一个标记还要考虑多个标记并且支持批量生成。一旦这些改进到位我们训练好的模型可以可靠地生成可执行的 SQL 查询且仅限于模式中有效的表名和列名。类似的方法也可以在生成 JSON 时强制执行约束确保键存在和括号闭合。注意分词问题分词通常被忽视但在使用生成性 AI 进行结构化输出时正确的分词至关重要。然而在后台分词可能对模型的训练产生影响。例如您可能会微调一个模型将文本翻译为 JSON。在微调过程中您向模型提供文本-JSON 对模型会对其进行分词。那么这种分词会是什么样子呢https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc9052660570390852112c1180650f1e.png(图像来源作者)当您阅读“[”时它是两个方括号但分词器将其转换为单一的 ID这将被分词分类器视为与单一括号完全不同的类别。这使得模型必须学习的整个逻辑更加复杂例如记住需要关闭多少个括号。类似地在单词前添加空格可能会改变它们的分词和类别 ID。例如https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ce09edd397c68277a6d2ddf93b2cb378.png分开写的单词有助于更一致的分词图像来源作者在微调过程中输入带空格的示例可以简化模型需要学习的模式从而提高模型的准确性。在预测时模型将输出带空格的 JSON您可以在解析之前去除这些空格。总结生成性 AI 提供了一种有价值的方法用于翻译成格式化语言。通过利用输出结构的知识我们可以约束生成过程消除一类错误并确保查询的可执行性和数据结构的可解析性。此外这些格式可能会使用标点符号和关键词来表示某些意义。确保这些关键词的标记化一致性可以显著降低模型需要学习的模式复杂度从而减少模型的所需规模和训练时间同时提高其准确性。结构化生成式人工智能可以有效地将自然语言转换为任何结构化格式。这些翻译能够从文本中提取信息或生成查询这是许多应用的强大工具。

相关文章:

结构化生成式 AI

原文:towardsdatascience.com/structured-generative-ai-e772123428e4?sourcecollection_archive---------3-----------------------#2024-04-18 如何限制你的模型输出定义的格式 https://medium.com/orenmatar?sourcepost_page---byline--e772123428e4---------…...

结构与关系:图神经网络及其在 Pytorch 中的实现

原文:towardsdatascience.com/structure-and-relationships-graph-neural-networks-and-a-pytorch-implementation-c9d83b71c041?sourcecollection_archive---------1-----------------------#2024-03-05 了解图神经网络的数学背景及其在 pytorch 中回归问题的实现…...

使用 Metaflow、AWS 和 Weights Biases 优化物体检测

原文:towardsdatascience.com/streamlining-object-detection-with-metaflow-aws-and-weights-biases-b44a14cb2e11?sourcecollection_archive---------1-----------------------#2024-07-19 如何为物体检测创建生产级管道 https://medium.com/ed.izaguirre?sour…...

精简巨头精简巨头精简巨头精简巨头精简巨头

原文:towardsdatascience.com/streamlining-giants-8a26aa1e91d3?sourcecollection_archive---------5-----------------------#2024-02-29 LLM 时代模型压缩的演变 https://natecibik.medium.com/?sourcepost_page---byline--8a26aa1e91d3---------------------…...

在开始撰写新研究论文时简化你的工作流程

原文:towardsdatascience.com/streamline-your-workflow-when-starting-a-new-research-paper-50522940b0dd https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5c26191bd4a63c4de5ee6b1dfd89ee57.png 由Maksym Kaharlytskyi在Un…...

7个步骤掌握fastai自定义数据加载器:复杂数据格式处理终极指南

7个步骤掌握fastai自定义数据加载器:复杂数据格式处理终极指南 【免费下载链接】fastai The fastai deep learning library 项目地址: https://gitcode.com/gh_mirrors/fa/fastai fastai是一个强大的深度学习库,提供了简洁易用的API来处理各种数据…...

OpenAI客户端库选型与实战:.NET集成指南与最佳实践

1. 项目概述:一个面向开发者的轻量级OpenAI客户端 如果你正在开发一个需要集成AI能力的应用,比如一个智能客服机器人、一个内容生成工具,或者一个代码辅助插件,那么你大概率绕不开OpenAI的API。官方的SDK固然功能齐全,…...

如何在5分钟内搭建你的第一个机器人AI控制系统:LeRobot完整指南

如何在5分钟内搭建你的第一个机器人AI控制系统:LeRobot完整指南 【免费下载链接】lerobot 🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 还在为复杂…...

终极GTA5安全增强菜单:YimMenu新手完全指南

终极GTA5安全增强菜单:YimMenu新手完全指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu 你…...

Hitboxer终极指南:专业级SOCD清理器与按键重映射工具,彻底解决游戏操作冲突

Hitboxer终极指南:专业级SOCD清理器与按键重映射工具,彻底解决游戏操作冲突 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏的世界里,每一次按键输入都可能是胜利的…...

三步秘籍:如何用127行代码轻松保存百度文库文档?

三步秘籍:如何用127行代码轻松保存百度文库文档? 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的付费文档而烦恼吗?每次找到心仪的资料&#x…...

专为求职者开发的“面馆”!!!摆脱面试焦虑!!!

🚀 写在前面 很多人准备面试的时候都会遇到一个痛点:题库太散。牛客网上刷几道、LeetCode上刷几道、CSDN上搜几篇面经……来来回回在不同的平台之间切换,效率很低。 于是我从今年3月开始,花了两个月时间,基于之前积累…...

终极指南:如何让外接Magic Trackpad在Windows上完美实现三指拖拽功能

终极指南:如何让外接Magic Trackpad在Windows上完美实现三指拖拽功能 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/Thre…...

独立开发者如何利用 Taotoken 透明计费机制精准控制项目预算

独立开发者如何利用 Taotoken 透明计费机制精准控制项目预算 1. 项目开发中的成本管理痛点 对于独立开发者和小型工作室而言,大模型API的调用成本往往是项目预算中最难预测的部分。传统接入方式通常存在几个典型问题:计费颗粒度粗放、用量统计滞后、缺…...

如何用3套模板告别知识碎片化?Obsidian Zettelkasten模板全解析

如何用3套模板告别知识碎片化?Obsidian Zettelkasten模板全解析 【免费下载链接】Obsidian-Templates A repository containing templates and scripts for #Obsidian to support the #Zettelkasten method for note-taking. 项目地址: https://gitcode.com/gh_mi…...

通用框架操作系统:构建可插拔应用生态的架构实践

1. 项目概述:一个“野心勃勃”的通用框架操作系统 最近在开源社区里闲逛,又看到了一个挺有意思的项目,叫 TELLEBO/universal-framework-os 。光看这个名字,就透着一股“野心”——“通用框架操作系统”。这可不是我们平常说的Wi…...

仅限前500名开发者获取:.NET 9 AI本地部署自动化脚本包(含模型自动下载/量化/缓存预热/健康检查)

更多请点击: https://intelliparadigm.com 第一章:.NET 9 AI 推理本地部署概览 .NET 9 原生强化了对 AI 工作负载的支持,通过新增的 Microsoft.ML.GenAI 库、内置 ONNX Runtime 集成以及轻量级模型服务主机( GenAIServer&#x…...

主构造函数+record struct+required修饰符=零冗余实体层?手把手构建高可测DDD核心模型

更多请点击: https://intelliparadigm.com 第一章:主构造函数record structrequired修饰符零冗余实体层?手把手构建高可测DDD核心模型 在 C# 12 的现代 DDD 实践中,实体建模正经历一场静默革命——主构造函数、record struct 和 …...

【工业级边缘C++编译黄金标准】:基于ARM64+RT-Thread实测验证的9条不可妥协规则

更多请点击: https://intelliparadigm.com 第一章:工业级边缘C编译黄金标准导论 在资源受限、实时性敏感、可靠性至上的工业边缘场景中,C 编译流程远非“g main.cpp -o app”即可交付。它是一套融合工具链选型、交叉编译策略、静态链接控制、…...

为 OpenClaw 智能体工作流配置 Taotoken 作为后端模型服务

为 OpenClaw 智能体工作流配置 Taotoken 作为后端模型服务 1. 准备工作 在开始配置之前,请确保已安装 OpenClaw 框架并完成基础环境搭建。同时需要在 Taotoken 控制台获取有效的 API Key,并在模型广场确认目标模型的 ID。OpenClaw 支持通过 Taotoken 提…...

OpenIM Server离线部署完整指南:从零构建企业级私有IM系统

OpenIM Server离线部署完整指南:从零构建企业级私有IM系统 【免费下载链接】open-im-server IM Chat OpenClaw 项目地址: https://gitcode.com/gh_mirrors/op/open-im-server 在金融、政务、军工等对数据安全有严格要求的场景中,企业通常需要在完…...

终极Android架构示例指南:从Lint检查到代码优化的完整实践

终极Android架构示例指南:从Lint检查到代码优化的完整实践 【免费下载链接】architecture-samples A collection of samples to discuss and showcase different architectural tools and patterns for Android apps. 项目地址: https://gitcode.com/gh_mirrors/a…...

MPC Video Renderer终极指南:5个核心技术带你掌握高性能DirectShow视频渲染

MPC Video Renderer终极指南:5个核心技术带你掌握高性能DirectShow视频渲染 【免费下载链接】VideoRenderer Внешний видео-рендерер 项目地址: https://gitcode.com/gh_mirrors/vi/VideoRenderer MPC Video Renderer是一款专为Windows平…...

快速上手使用 Taotoken 官方价折扣节省大模型调用成本

快速上手使用 Taotoken 官方价折扣节省大模型调用成本 1. 了解 Taotoken 的定价优势 Taotoken 作为大模型聚合分发平台,定期推出官方价折扣活动,帮助开发者降低模型调用成本。这些折扣信息会实时更新在控制台的「价格与活动」页面,无需额外…...

url-opener:命令行批量打开网页工具,提升开发与运维效率

1. 项目概述:一个被低估的效率工具如果你和我一样,每天的工作流里充斥着大量的链接——可能是需要定期查看的监控面板、项目文档、测试环境地址,或者是十几个需要同时打开的社交媒体后台。那么,你肯定经历过这样的痛苦&#xff1a…...

终极指南:如何在Rete.js可视化编程框架中实现用户行为统计与监控

终极指南:如何在Rete.js可视化编程框架中实现用户行为统计与监控 【免费下载链接】rete JavaScript framework for visual programming 项目地址: https://gitcode.com/gh_mirrors/re/rete Rete.js是一个用于创建可视化界面和工作流的JavaScript框架&#xf…...

从零开始将一个 React 前端项目对接 Taotoken 大模型后端

从零开始将一个 React 前端项目对接 Taotoken 大模型后端 1. 准备工作 在开始对接之前,需要确保已经完成 Taotoken 平台的账号注册和 API Key 的创建。登录 Taotoken 控制台后,在「API 密钥管理」页面可以创建新的密钥。建议为每个项目单独创建密钥以便…...

2026深度解析:耐克1.4TB数据泄露与WorldLeaks无加密勒索的供应链安全革命

2026年1月,全球运动用品巨头耐克遭遇了一场史无前例的网络安全事件,这场事件不仅改写了勒索软件的攻击范式,更彻底暴露了全球制造业供应链在数字化时代的致命脆弱性。臭名昭著的数据勒索组织WorldLeaks成功从耐克公司窃取了约1.4TB的核心数据…...

VMware克隆Debian虚拟机后,如何快速修改主机名、IP和用户?完整操作实录

VMware克隆Debian虚拟机后的身份信息重构指南 当你用VMware的完整克隆功能复制出一台Debian虚拟机时,新机器就像个"数字双胞胎"——除了硬件UUID不同,其他所有身份信息都与原机完全相同。这会导致网络冲突、权限混乱等一系列问题。作为运维老…...

通过用量看板清晰观测各模型 API 调用成本与消耗趋势

通过用量看板清晰观测各模型 API 调用成本与消耗趋势 1. 用量看板的核心功能 Taotoken 控制台的用量看板为开发者提供了多维度的 API 调用数据可视化能力。登录后进入「用量分析」页面,系统默认展示最近 7 天的聚合数据概览,包括总 token 消耗量、费用…...