2024年五月月 发布的文章

那些可免费使用的在线大语言模型服务

本文永久链接 – https://tonybai.com/2024/05/06/those-free-to-use-online-llm-services

2022年底以ChatGPT为代表的大语言模型的出现掀起了人工智能应用的新浪潮。这些庞大的语言模型经过对海量文本数据的训练,能够理解和生成逼近人类水平的自然语言,在对话、问答、文本生成、代码编写等领域展现出了惊人的能力。

最初这种能力“垄断”在OpenAI公司的手里,世界各地的AI爱好者们为了能尽快拿到ChatGPT的使用账号,使出了浑身解数,国内朋友更是如此。

不过随着Google、MetaAnthropicxAI等公司的逐步赶上(当然国内像百度、阿里等巨头的也投入巨量研发和成本)以及开源大模型的持续涌现,时隔一年多以后,目前互联网上的大模型服务已成“百花齐放”之势。无论在推理能力还是模型数量上,都有极大的提升,而使用成本则大幅降低。我们再无需局限于OpenAI这一家公司的大模型了,通过一些免费的在线大模型服务即可享受到多样化、高质量的AI服务。

在这篇短文中,我就来简单说说我使用过的那些免费在线大模型服务,供各位读者参考。

对于国内的朋友来说,本文介绍的大多数国外在线大模型服务的使用前提是你拥有一个价位合理、连接稳定的加速器服务。

1. 大语言模型聚合平台

我们先来看看一类典型的大语言模型服务平台,它们被称作大语言模型聚合平台,在这类平台上,我们可以使用超过一种的专有模型或开源LLM模型服务。

1.1 poe.com

poe.com是我日常使用的大语言模型服务的第一选择。它由美版知乎Quora平台开发运营。平台上的人工智能服务由多个不同公司训练的模型提供支持,并针对不同的任务进行了优化。Poe目前支持的机器人包括:OpenAI的ChatGPT、GPT-4和DALL-E 3,Anthropic的Claude Instant、Claude 2和Claude 3,Stability AI的StableDiffusionXL,Google的PaLM 和Gemini-Pro,Meta的Llama 3,Playground的Playground-v2,Mistral的Mistral-Medium,以及大量由社区用户自己创建的机器人。

poe.com提供的默认机器人Assistant由gpt-3.5-turbo和Claude 3 Haiku提供技术支持,这个是完全免费的。其他机器人如GPT4、Claude3 Opus、Mistral-Large、Gemini 1.5 Pro等顶级AI机器人则是使用受限的,需要付费订阅用户才能使用。而中间级别的机器人,如Claude-3-Sonnet、Mistral-Medium等则是有条数限制。开源模型的机器人,比如Llama3 70B则是免费使用的,至少我没碰到限制。

总之,poe.com上聚合的AI大模型通常足矣满足日常工作所需。

1.2 you.com

如果你就使用了poe.com的中级机器人,还达到的其条数限制的上限,我们还可以使用you.com作为备用的聚合大模型平台,当然如果你喜欢you.com的风格与交互方式,你完全可以将其作为你的第一选择。就像上面截图中那样,you.com支持大多数的主流的AI大模型,虽然品种不如poe.com多。

1.3 主流开源大模型的聚合平台

下面说一下以仅聚合开源大模型的一些平台,如果你只想体验、对比和使用开源大模型的话,也可以试试这些平台,目前这些平台没有设置使用条数等限制。

1.3.1 perplexity labs

1.3.2 huggingface chat

抱抱脸(huggingface)是AI界的github,他也提供了一些开源大模型的在线聚合服务:

1.3.3 together.ai

together.ai提供的开源ai大模型非常全面,并且如上图所示,用户可以自己调整大模型参数,比如Temperature、Top-P、Top-K等,非常适合一些开源大模型的深度研究者:

1.3.4 groq cloud

我们看到:groq cloud也提供一定的大模型参数调整能力(比如Temperature),但groq提供的开源大模型种类较少,可做备用之选。

2. 独立的大语言模型服务

各大AI大模型的先驱者和驱动主力,比如OpenAI、Google、Meta、Anthropic等也都提供了独立的官方大语言模型服务,我们逐一来看看:

2.1 ChatGPT

OpenAI的ChatGPT在今年提供了免费服务,即使你不注册OpenAI账号也可以在线免费使用chatgpt 3.5,只是不能保存历史:

2.2 Google gemini

Google是AI领军人物,但OpenAI的异军突起打了他一个“措手不及”,不过Google实力还在,从最先推出的bard,到目前全面升级为gemini后,与OpenAI的能力差距在日益缩小。

2.3 Claude

由多家巨头公司共同投资的Anthropic推出的Claude系列大模型能力是与日俱增,最新的Claude 3系列已经基本追上了OpenAI,Anthropic也在自己的官方站点提供了sonnet、haiku的免费服务,只有最高端的opus是需要付费的:

2.4 Meta

Meta(前身Facebook)是开源大语言模型世界的核心力量,它开源的Llama系列大模型已经成为开源界大模型的基石。Meta在其ai官网也提供了在线版的Llama的体验服务,最新版是Llama3。

2.5 mistral.ai

Mistral AI是一家销售人工智能产品的法国公司。它由 Meta Platforms 和 Google DeepMind 的前员工于 2023 年 4 月创立。他也提供了针对其自身产品mistral的在线免费体验服务:

3. 国内提供的大语言模型服务

国内的公司虽然在算力上受到了政治因素的制约,但大模型能力也是在不断进步的,并且国内大模型大多都提供了在线体验服务以及app。但由于工作原因,国内大模型用的较少,这里就仅给出一个列表和访问方式,大家可以自行体验。

4. 小结

随着时间的推移,越来越多的公司和开源项目加入了大语言模型的竞争,使得互联网上的大模型服务变得百花齐放。本文列举了一些免费的在线大语言模型服务供读者参考。

首先介绍了大语言模型聚合平台,如poe.com和you.com,它们集成了多种专有模型和开源模型,可以满足日常工作需求。然后文章还提到了一些仅聚合开源模型的平台,如perplexity labs、huggingface chat、together.ai和groq cloud,它们适合体验、对比和使用开源模型。

接下来是独立的大语言模型服务,包括一些知名公司和项目。我们提到了OpenAI的ChatGPT,提供免费的在线使用;Google gemini,与OpenAI能力逐渐接近;Anthropic的Claude,提供免费的sonnet和haiku服务;Meta的Llama,作为开源界的核心力量;以及Mistral AI的在线免费体验服务。

对于国内大模型,笔者使用较少,这里仅提供列表和链接。

如果你要是拥有一个Google gmail账号,无论是前面提到的聚合平台,还是专有大模型服务(国内大模型服务除外),基本都可以sign with google account快速注册和登录到平台并开启大模型体验之旅。


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Go未用代码消除与可执行文件瘦身

本文永久链接 – https://tonybai.com/2024/05/05/dead-code-elimination-and-executable-file-slimming-in-go

在日常编写Go代码时,我们会编写很多包,也会在编写的包中引入了各种依赖包。在大型Go工程中,这些直接依赖和间接依赖的包数目可能会有几十个甚至上百个。依赖包有大有小,但通常我们不会使用到依赖包中的所有导出函数或类型方法。

这时Go初学者就会有一个疑问:这些直接依赖包和间接依赖包中的所有代码是否会进入到最终的可执行文件中呢?即便我们只是使用了某个依赖包中的一个导出函数。

这里先给出结论:不会!在这篇文章中,我们就来探索一下这个话题,了解一下其背后的支撑机制以及对Go可执行文件Size的影响。

1. 实验:哪些函数进入到最终的可执行文件中了?

我们先来做个实验,验证一下究竟哪些函数进入到最终的可执行文件中了!我们建立demo1,其目录结构和部分代码如下:

// dead-code-elimination/demo1
$tree -F .
.
├── go.mod
├── main.go
└── pkga/
    └── pkga.go

// main.go
package main

import (
    "fmt"

    "demo/pkga"
)

func main() {
    result := pkga.Foo()
    fmt.Println(result)
}

// pkga/pkga.go

package pkga

import (
    "fmt"
)

func Foo() string {
    return "Hello from Foo!"
}

func Bar() {
    fmt.Println("This is Bar.")
}

这个示例十分简单!main函数中调用了pkga包的导出函数Foo,而pkga包中除了Foo函数,还有Bar函数(但并没有被任何其他函数调用)。现在我们来编译一下这个module,然后查看一下编译出的可执行文件中都包含pkga包的哪些函数!(本文实验中使用的Go为1.22.0版本)

$go build
$go tool nm demo|grep demo

在输出的可执行文件中,居然没有查到关于pkga的任何符号信息,这可能是Go的优化在“作祟”。我们关闭掉Go编译器的优化后,再来试试:

$go build -gcflags '-l -N'
$go tool nm demo|grep demo
 108ca80 T demo/pkga.Foo

关掉内联优化后,我们看到pkga.Foo出现在最终的可执行文件demo中,但并未被调用的Bar函数并没有进入可执行文件demo中。

我们再来看一下有间接依赖的例子:

// dead-code-elimination/demo2
$tree .
.
├── go.mod
├── main.go
├── pkga
│   └── pkga.go
└── pkgb
    └── pkgb.go

// pkga/pkga.go
package pkga

import (
    "demo/pkgb"
    "fmt"
)

func Foo() string {
    pkgb.Zoo()
    return "Hello from Foo!"
}

func Bar() {
    fmt.Println("This is Bar.")
}

在这个示例中,我们在pkga.Foo函数中又调用了一个新包pkgb的Zoo函数,我们来编译一下该新示例并查看一下哪些函数进入到最终的可执行文件中:

$go build -gcflags='-l -N'
$go tool nm demo|grep demo
 1093b40 T demo/pkga.Foo
 1093aa0 T demo/pkgb.Zoo

我们看到:只有程序执行路径上能够触达(被调用)的函数才会进入到最终的可执行文件中!

在复杂的示例中,我们也可以通过带有-ldflags=’-dumpdep’的go build命令来查看这种调用依赖关系(这里以demo2为例):

$go build -ldflags='-dumpdep' -gcflags='-l -N' > deps.txt 2>&1

$grep demo deps.txt
# demo
main.main -> demo/pkga.Foo
demo/pkga.Foo -> demo/pkgb.Zoo
demo/pkga.Foo -> go:string."Hello from Foo!"
demo/pkgb.Zoo -> math/rand.Int31n
demo/pkgb.Zoo -> demo/pkgb..stmp_0
demo/pkgb..stmp_0 -> go:string."Zoo in pkgb"

到这里,我们知道了Go通过某种机制保证了只有真正使用到的代码才会最终进入到可执行文件中,即便某些代码(比如pkga.Bar)和那些被真正使用的代码(比如pkga.Foo)在同一个包内。这同时保证了最终可执行文件大小在可控范围内。

接下来,我们就来看看Go的这种机制。

2. 未用代码消除(dead code elimination)

我们先来复习一下go build的构建过程,以下是 go build 命令的步骤概述:

  1. 读取go.mod和go.sum:如果当前目录包含go.mod文件,go build会读取该文件以确定项目的依赖项。它还会根据go.sum文件中的校验和验证依赖项的完整性。

  2. 计算包依赖图:go build 分析正在构建的包及其依赖项中的导入语句,以构建依赖图。该图表示包之间的关系,使编译器能够确定包的构建顺序。

  3. 决定要构建的包:基于构建缓存和依赖图,go build 确定需要构建的包。它检查构建缓存,以查看已编译的包是否是最新的。如果自上次构建以来某个包或其依赖项发生了更改,go build将重新构建这些包。

  4. 调用编译器(go tool compile):对于每个需要构建的包,go build调用Go编译器(go tool compile)。编译器将Go源代码转换为特定目标平台的机器码,并生成目标文件(.o 文件)。

  5. 调用链接器(go tool link):在编译所有必要的包之后,go build 调用 Go 链接器(go tool link)。链接器将编译器生成的目标文件合并为可执行二进制文件或包归档文件。它解析包之间的符号和引用,执行必要的重定位,并生成最终的输出。

上述的整个构建过程可以由下图表示:

在构建过程中,go build 命令还执行各种优化,例如未用代码消除和内联,以提高生成二进制文件的性能和降低二进制文件的大小。其中的未用代码消除就是保证Go生成的二进制文件大小可控的重要机制。

未用检测算法的实现位于$GOROOT/src/cmd/link/internal/ld/deadcode.go文件中。该算法通过图遍历的方式进行,具体过程如下:

  1. 从系统的入口点开始,标记所有可通过重定位到达的符号。重定位是两个符号之间的依赖关系。
  2. 通过遍历重定位关系,算法标记所有可以从入口点访问到的符号。例如,在主函数main.main中调用了pkga.Foo函数,那么main.main会有对这个函数的重定位信息。
  3. 标记完成后,算法会将所有未被标记的符号标记为不可达的未用。这些未被标记的符号表示不会被入口点或其他可达符号访问到的代码。

不过,这里有一个特殊的语法元素要注意,那就是带有方法的类型。类型的方法是否进入到最终的可执行文件中,需要考虑不同情况。在deadcode.go,用于标记可达符号的函数实现将可达类型的方法的调用方式分为三种:

  1. 直接调用
  2. 通过可到达的接口类型调用
  3. 通过反射调用:reflect.Value.Method(或 MethodByName)或 reflect.Type.Method(或 MethodByName)

第一种情况,可以直接将调用的方法被标记为可到达。第二种情况通过将所有可到达的接口类型分解为方法签名来处理。遇到的每个方法都与接口方法签名进行比较,如果匹配,则将其标记为可到达。这种方法非常保守,但简单且正确。

第三种情况通过寻找编译器标记为REFLECTMETHOD的函数来处理。函数F上的REFLECTMETHOD意味着F使用反射进行方法查找,但编译器无法在静态分析阶段确定方法名。因此所有调用reflect.Value.Method 或reflect.Type.Method的函数都是REFLECTMETHOD。调用reflect.Value.MethodByName或reflect.Type.MethodByName且参数为非常量的函数也是REFLECTMETHOD。如果我们找到了REFLECTMETHOD,就会放弃静态分析,并将所有可到达类型的导出方法标记为可达。

下面是一个来自参考资料中的示例:

// dead-code-elimination/demo3/main.go

type X struct{}
type Y struct{}

func (*X) One()   { fmt.Println("hello 1") }
func (*X) Two()   { fmt.Println("hello 2") }
func (*X) Three() { fmt.Println("hello 3") }
func (*Y) Four()  { fmt.Println("hello 4") }
func (*Y) Five()  { fmt.Println("hello 5") }

func main() {
    var name string
    fmt.Scanf("%s", &name)
    reflect.ValueOf(&X{}).MethodByName(name).Call(nil)
    var y Y
    y.Five()
}

在这个示例中,类型*X有三个方法,类型*Y有两个方法,在main函数中,我们通过反射调用X实例的方法,通过Y实例直接调用Y的方法,我们看看最终X和Y都有哪些方法进入到最后的可执行文件中了:

$go build -gcflags='-l -N'

$go tool nm ./demo|grep main
 11d59c0 D go:main.inittasks
 10d4500 T main.(*X).One
 10d4640 T main.(*X).Three
 10d45a0 T main.(*X).Two
 10d46e0 T main.(*Y).Five
 10d4780 T main.main
... ...

我们看到通过直接调用的可达类型Y只有代码中直接调用的方法Five进入到最终可执行文件中,而通过反射调用的X的所有方法都可以在最终可执行文件找到!这与前面提到的第三种情况一致。

3. 小结

本文介绍了Go语言中的未用代码消除和可执行文件瘦身机制。通过实验验证,只有在程序执行路径上被调用的函数才会进入最终的可执行文件,未被调用的函数会被消除。

本文解释了Go编译过程,包括包依赖图计算、编译和链接等步骤,并指出未用代码消除是其中的重要优化策略。具体的未用代码消除算法是通过图遍历实现的,标记可达的符号并将未被标记的符号视为未用。文章还提到了对类型方法的处理方式。

通过这种未用代码消除机制,Go语言能够控制最终可执行文件的大小,实现可执行文件瘦身。

本文涉及的源码可以在这里下载。

4. 参考资料


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats