”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么我制作 TabbyAPI

为什么我制作 TabbyAPI

发布于2024-08-29
浏览:747

封面照片由 Jason Leung 在 Unsplash 上拍摄

这可能是许多“我为什么制作”帖子中的第一篇,它解释了我制作一款软件并深入研究未来改进的原因。

今天,我将重点关注我最受欢迎的项目 TabbyAPI。 TabbyAPI 是一个基于 Python 的 FastAPI 服务器,允许用户使用 ExllamaV2 库与大型语言模型(或 LLM)交互,并遵守 OpenAI API 规范。

如果您不确定这些词的含义,那么您就不在人工智能领域。但是,没关系!这篇文章的目的是解释我的经历,而不是将整个厨房水槽的人工智能术语扔给你。

开始

让我回到 2023 年 11 月。人工智能蓬勃发展,公司纷纷发布模型,炒作列车似乎没有尽头。好像我说的是远古时期,但那时的每一天都感觉像是一整月的创新。

在这些新技术的冲击下,我专注于用我那微不足道的 3090ti 来运行它们。是的,“微不足道”这个词是正确的,因为显卡中的 24GB VRAM 对于运行大多数 AI 模型来说是入门级的。此时,运行模型的量化版本已成为常态。量化类似于压缩,允许用户在消费级 GPU 上运行这些大型模型。

我越来越喜欢的格式是 exl2,这种格式专注于速度、优化以及尽可能多地使用显卡。代币以音速生成。所以这个格式很棒!有什么问题吗?

问题是运行模型。 Exl2 是 ExllamaV2 库的一部分,但要运行模型,用户需要 API 服务器。唯一的选择是使用 text-generate-webui (TGW),该程序将每个加载器捆绑到 Gradio webui 中。 Gradio 是一种用于 Python 开发的常见“构建块”UI 框架,通常用于 AI 应用程序。这个设置一度不错,但后来就不行了。

本质上,创造Tabby的主要原因是烦恼。我对加载一个模型所需的工作量感到厌倦。更不用说 Gradio 的开销和 TGW 的大量依赖项。我尊重开发人员,但虽然 TGW 对于许多想要一体化解决方案的人来说有好处,但对我来说却不好。

该计划…

Why I made TabbyAPI
照片由 Glenn Carstens-Peters 在 Unsplash 上拍摄

很简单。创建一个可以位于我的计算机上并且不需要大量臃肿的程序来运行的 API 服务器。听起来很简单,但我真的能做到吗?我在 AI 模型理论方面没有太多经验,但在创建后端服务器和理解 API 设计方面有很多经验。

因此,我需要有人帮忙,但是谁呢?进入turboderp,ExllamaV2 背后的人。自从他创建了这个库以来,他几乎了解模型如何工作背后的一切,这与我的 API 知识非常匹配。此外,另一位名叫 Splice 的感兴趣者由于他使用 Python 的经验也加入了。我们三个人一起创建了 TabbyAPI。

但是计划真的那么简单吗?嗯,有点。虽然我有适合这项工作的人员,但我对 Python 和 API 服务器的知识基本上是 0。我最终使用了一个名为 FastAPI 的网络服务器框架,这让我的生活变得更加轻松。它在 python 社区中也很受欢迎,并且有很好的文档记录。

使用 FastAPI 几天后,我迷上了编写 Python Web 服务器代码。文档非常好,网上有很多示例,开发人员很乐意接受反馈。总的来说,社区很受欢迎,我很乐意更频繁地使用 python 进行网络连接。

几周后,我觉得一切都已准备好公开部署,并决定以我所知道的最佳方式发布所有内容。 YOLO 并将所有内容推送到 GitHub。

问题和更多问题

当向世界发布开源项目时,预计会出现问题……很多问题。人们总是有实用程序不适合的用例。由于 Tabby 是后端服务器,因此出现了很多这样的情况。在这篇文章中,我只会提到一些一开始对我来说很难处理的事情。

一个很大的痛点是我在 RAG 炒作周期的中间发布了 Tabby。 RAG 代表“检索增强生成”,即在获得回复时除了法学硕士知识之外还使用外部文档。问题是这些新技术(例如函数调用)需要完全不同的 API 端点和方法来完成任务。

最重要的是,几乎没有关于这些功能如何在后端实际工作的文档。直到今天,我还没有实现 OpenAI 的工具调用,因为我不知道它是如何工作的。可悲的是,缺乏文档在人工智能世界中很常见,它限制了开发人员在没有事先收集大量信息的情况下在项目中实现代码的能力。

另一个持续了几个月的问题是多用户生成。事实证明,对于开发人员来说,处理服务器上的分布式查询并不是一个容易处理的主题。 FastAPI 为此类工作负载提供支持,但 Tabby 是用同步代码编写的。这意味着我必须学习 Python 异步编程(这绝对不容易)。

最糟糕的是,人工智能开发人员不喜欢异步Python,而网络服务器却接受它。这意味着我必须学习如何以线程的形式在异步和同步库之间进行通信。这是更深入地了解 Python 的线程问题以及异步模型存在的原因。我将在另一篇博文中详细介绍所有这些内容,但希望这能解释我在 2-3 个月内应对这些问题时必须完成的学习量。

最终,turbo 和我一起在 ExllamaV2 库中创建了一个更好的生成器,消除了线程库中的所有多用户问题和奇怪的错误。 9 个月后,可以肯定地说,Tabby 终于成为一个运行模型的稳定程序。

倦怠

Why I made TabbyAPI
照片由 Annie Spratt 在 Unsplash 上拍摄

在我开发软件的整个过程中,我从未经历过倦怠期。这很难相信,因为倦怠在软件世界中是很常见的事情,但在过去的 6 年里我一直想编写一些东西。编码是我最喜欢的消遣,可以帮助我逃避一天的压力。

然而,Tabby 和人工智能社区总体上改变了一切。一开始,我结交了很多朋友,他们在探索蓬勃发展的人工智能领域有着共同的兴趣。我的社区过去几乎每天都会进行语音通话,并专注于分享有关该领域新事物的项目和想法。它让开发变得有趣和愉快,因为我可以与志同道合的人一起出去玩并分享新想法。

不幸的是,这些语音通话的人数开始减少,而且发生的频率也越来越低。由于完成医学院第一年的学业,我也承受着很大的压力。在网络世界中,这对我来说是一段巨大的孤独时期,而正在发育的塔比感觉就像是我医学生生活的负担。最终,这些事件以巨大的挫败感和疲惫感达到了顶峰。为了解决这个问题,我决定无限期地脱离人工智能。

在休息期间,我离开了Tabby,花更多的时间享受我的暑假。实际上,我参与了一些较旧的 iOS 应用程序项目,并与家人共度时光。如今,我又重新开始开发 Tabby。由于人工智能炒作的消退,我以前参与的那些语音通话可能在很长一段时间内不会发生。这是一颗难以下咽的药丸,但我找到了继续开发的不同动机。

我学到的教训

Tabby 是我做过的第一个法学硕士项目。它不知何故在社区中成为了一个流行的名字,我也因此陷入了管理的深渊。了解了这一点,以下是我从这次经历中学到的一些想法。

知道你想迎合谁:任何人都可以使用开源项目。对于 Tabby,我优先考虑有利于项目的易用性、我的朋友和我自己的功能。通过控制这一理念,我可以管理我的日程安排,并且知道要处理哪些功能。

了解你的极限:倦怠并不好玩。不要像我一样,因为用户无数次遇到问题而让自己陷入困境。如果出现沮丧、愤怒或无聊的感觉,请休息一下。偶尔放松一下也不错。

不要为每个人都竭尽全力:一个想法在第一次提出时可能看起来不错,但人们不明白开发人员需要在之后维护这个功能。如果它很痛苦并且不经常使用,那么该功能就不会得到维护,并将成为技术债务。请记住,互联网上的随机陌生人总是有想法。由您或您的团队决定向哪些项目投入脑力。

创造你喜欢和享受的东西:开发人员经常会失去对项目的兴趣,因为维护可能很麻烦并且需要很长时间。如果开发人员不再积极使用该项目,则尤其如此。弄清楚你的动机是什么,如果它改变了,那也没关系。

我可能会在另一篇文章中详细阐述这些,因为这可能是它自己的主题,但我觉得在 Tabby 上工作让我对我希望我的项目如何工作有了更多的了解。另外,我对开源社区的了解也得到了扩展。

未来会怎样

我感谢所有每天为改进 TabbyAPI 和 ExllamaV2 做出贡献并提出建议的人们。每个人都帮助完善和改进程序,以便更好地用于一般用途。我是一个人,帮助别人会减轻我的负担。

在可预见的未来,我将减少在 Tabby 上的工作量。该项目仍在顺利进行,许多人都致力于改进它,但我的心理健康更重要,休息会有所帮助。

感谢您阅读这篇回顾展。如果您想了解更多关于我和我所做的事情,请访问 kingbri.dev。

Brian Dashore 的个人网站

Why I made TabbyAPI 治疗实验室 / 虎斑API

兼容 OAI 的 exllamav2 API,既轻量又快速

TabbyAPI

Why I made TabbyAPIWhy I made TabbyAPIWhy I made TabbyAPI

Why I made TabbyAPI

Why I made TabbyAPI

重要的

除了自述文件之外,请阅读 Wiki 页面以获取有关入门的信息!

笔记

需要帮助吗?加入 Discord 服务器并获得 Tabby 角色。提问时请保持礼貌。

基于 FastAPI 的应用程序,允许使用 Exllamav2 后端使用 LLM(大语言模型)生成文本

免责声明

该项目被标记为滚动发布。后续可能会出现错误和更改。请注意,如果需要,您可能需要重新安装依赖项。

TabbyAPI 是一个仅供少量用户使用的业余爱好项目。它不适合在生产服务器上运行。为此,请查看支持这些工作负载的其他后端。

入门

重要的

本自述文件不适用于入门。请阅读维基百科。

阅读 Wiki 了解更多信息。它包含面向用户的安装、配置、采样、API 使用等文档。

支持的型号

在 GitHub 上查看
版本声明 本文转载于:https://dev.to/kingbri/why-i-made-tabbyapi-385f?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 微服务项目
    微服务项目
    ⚙️微服务项目的灵感来自@sqshq“Alexander Lukyanchikov”的piggymetrics,但是这个实现使用了PostgreSQL和更简单的业务逻辑,这个项目的主要目标是展示微服务架构的示例。 TechStack:PostgreSQL、Spring、Docker 我正在考虑可以添...
    编程 发布于2024-11-06
  • 优化 AWS ECS 的 Java 堆设置
    优化 AWS ECS 的 Java 堆设置
    我们在 AWS Elastic Container Service(ECS) Fargate 上运行多个 Java 服务 (Corretto JDK21)。每个服务都有自己的容器,我们希望使用为每个进程支付的所有可能的资源。但这些步骤可以应用于 EC2 和其他云。 服务正在运行批处理作业,延迟并不重...
    编程 发布于2024-11-06
  • PHP 初学者必备知识:释放网站的全部潜力
    PHP 初学者必备知识:释放网站的全部潜力
    PHP基础知识:释放网站潜能简介PHP是一种强大的服务器端脚本语言,广泛用于创建动态网站。对于初学者来说,掌握PHP基础知识至关重要。本文将提供一个全面的指南,涵盖PHP编程的基本要素,并通过实战案例巩固理解。安装并配置PHP要开始使用PHP,您需要安装PHP解释器和相关的软件。遵循以下步骤:- 下...
    编程 发布于2024-11-06
  • 如何确定 PHP 标头的正确图像内容类型?
    如何确定 PHP 标头的正确图像内容类型?
    确定 PHP 标头的图像内容类型使用 Header() 函数从 Web 根目录之外显示图像时,用户可能会遇到困惑关于指定的内容类型:image/png。然而,尽管内容类型固定,但具有各种扩展名的图像(例如, JPG、GIF)仍然可以成功显示。要解决这种差异,动态确定正确的扩展名至关重要基于文件扩展名...
    编程 发布于2024-11-05
  • ByteBuddies:使用 Python 和 Tkinter 创建交互式动画宠物
    ByteBuddies:使用 Python 和 Tkinter 创建交互式动画宠物
    大家好! 我很高兴向大家介绍 ByteBuddies,这是一个用 Python 和 Tkinter 创建的个人项目,展示了交互式动画虚拟宠物。 ByteBuddies 将引人入胜的动画与用户交互相结合,提供了展示 GUI 编程强大功能的独特体验。该项目旨在通过提供交互式虚拟宠物来让您的屏幕充满活力...
    编程 发布于2024-11-05
  • 如何解决“TypeError:\'str\'对象不支持项目分配”错误?
    如何解决“TypeError:\'str\'对象不支持项目分配”错误?
    'str'对象项分配错误疑难解答尝试在 Python 中修改字符串中的特定字符时,您可能会遇到错误“类型错误:“str”对象不支持项目分配。”发生这种情况是因为 Python 中的字符串是不可变的,这意味着它们无法就地更改。解决此问题的一种常见方法是将字符串转换为可变列表,进行必要的...
    编程 发布于2024-11-05
  • 如何缓解 GenAI 代码和 LLM 集成中的安全问题
    如何缓解 GenAI 代码和 LLM 集成中的安全问题
    GitHub Copilot and other AI coding tools have transformed how we write code and promise a leap in developer productivity. But they also introduce new ...
    编程 发布于2024-11-05
  • Spring 中的 ContextLoaderListener:必要的邪恶还是不必要的复杂?
    Spring 中的 ContextLoaderListener:必要的邪恶还是不必要的复杂?
    ContextLoaderListener:必要的邪恶还是不必要的复杂?开发人员经常遇到在 Spring Web 应用程序中使用 ContextLoaderListener 和 DispatcherServlet。然而,一个令人烦恼的问题出现了:为什么不简单地使用 DispatcherServlet...
    编程 发布于2024-11-05
  • JavaScript 机器学习入门:TensorFlow.js 初学者指南
    JavaScript 机器学习入门:TensorFlow.js 初学者指南
    机器学习 (ML) 迅速改变了软件开发世界。直到最近,得益于 TensorFlow 和 PyTorch 等库,Python 仍是 ML 领域的主导语言。但随着 TensorFlow.js 的兴起,JavaScript 开发人员现在可以深入令人兴奋的机器学习世界,使用熟悉的语法直接在浏览器或 Node...
    编程 发布于2024-11-05
  • extjs API 查询参数示例
    extjs API 查询参数示例
    API 查询 参数是附加到 API 请求 URL 的键值对,用于向服务器发送附加信息。它们允许客户端(例如 Web 浏览器或应用程序)在向服务器发出请求时指定某些条件或传递数据。 查询参数添加到 URL 末尾问号 (?) 后。每个参数都是一个键值对,键和值之间用等号 (=) 分隔。如果有多个查询参数...
    编程 发布于2024-11-05
  • 如何解决Go中从不同包导入Proto文件时出现“Missing Method Protoreflect”错误?
    如何解决Go中从不同包导入Proto文件时出现“Missing Method Protoreflect”错误?
    如何从不同的包导入 Proto 文件而不遇到“Missing Method Protoreflect”错误在 Go 中,protobuf 常用于数据序列化。将 protobuf 组织到不同的包中时,可能会遇到与缺少 ProtoReflect 方法相关的错误。当尝试将数据解组到单独包中定义的自定义 p...
    编程 发布于2024-11-05
  • 为什么MySQL在查询“Field = 0”非数字数据时返回所有行?
    为什么MySQL在查询“Field = 0”非数字数据时返回所有行?
    不明确的查询:理解为什么 MySQL 返回“Field=0”的所有行在 MySQL 查询领域,一个看似无害的比较,例如“SELECT * FROM table WHERE email=0”,可能会产生意外的结果。它没有按预期过滤特定行,而是返回表中的所有记录,从而引发了对数据安全性和查询完整性的担忧...
    编程 发布于2024-11-05
  • 服务器发送事件 (SSE) 的工作原理
    服务器发送事件 (SSE) 的工作原理
    SSE(服务器发送事件)在 Web 开发领域并未广泛使用,本文将深入探讨 SSE 是什么、它是如何工作的以及它如何受益您的申请。 什么是上交所? SSE 是一种通过 HTTP 连接从服务器向客户端发送实时更新的简单而有效的方法。它是 HTML5 规范的一部分,并受到所有现代 Web ...
    编程 发布于2024-11-05
  • 如何从字符串 TraceID 创建 OpenTelemetry Span?
    如何从字符串 TraceID 创建 OpenTelemetry Span?
    从字符串 TraceID 构造 OpenTelemetry Span要建立 Span 之间的父子关系,必须在上下文传播不可行的情况下使用标头。在这种情况下,跟踪 ID 和跨度 ID 包含在消息代理的标头中,这允许订阅者使用父跟踪 ID 创建新的跨度。解决方案以下步骤可以使用跟踪 ID 在订阅者端构建...
    编程 发布于2024-11-05
  • 如何在gRPC中实现服务器到客户端的广播?
    如何在gRPC中实现服务器到客户端的广播?
    gRPC 中的广播:服务器到客户端通信建立 gRPC 连接时,通常需要将事件或更新从服务器广播到客户端连接的客户端。为了实现这一点,可以采用各种方法。Stream Observables一种常见的方法是利用服务器端流。每个连接的客户端都与服务器建立自己的流。然而,直接订阅其他服务器客户端流是不可行的...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3