1 简介

Google I/O ’23 大会上发布了一系列的 AI 产品,而这些产品背后的基础 AI 引擎便是 PaLM2 这个大言语模型了。

PaLM2 比较于其他的大言语模型不同的一点是,大言语模型在手机端运转的或许。其间 PaLM2 中最小的 Gecko(壁虎)模型能够直接运转在手机上。这对移动的开发者而言无疑是一个利好,一起对一般顾客而言也能更加方便快捷的运用到 AI 带来的各种才干。

下面咱们具体介绍下 PaLM2 模型的一些状况。

2 模型介绍

PaLM2 依据模型巨细分为了 4 版本,别离为:GeckoOtterBisonUnicorn

Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?

不过现在依据官方文档中 模型介绍 信息来看,揭露的模型巨细有 2 个,只支撑了 GeckoBison 两个模型巨细。

Model size Description 支撑接口
Bison PaLM API 最强大的模型。 对话、文本生成
Gecko PaLM API 最小、最高效的模型。 embeddings

其间 Bison 模型又分了 text-bison-001chat-bison-001,别离用于文本生成和对话。下面是各个模型的才干:

模型 text-bison-001 chat-bison-001 embedding-gecko-001
更新时刻 2023.05 2023.05 2023.05
模型巨细 Bison Bison Gecko
才干 文本生成 对话 生成文本的词向量
恳求约束 每分钟 30 个恳求 每分钟 30 个恳求 每分钟 300 个恳求

现在官方文档中供给的仅有 BisonGecko 两个模型,其间能够离线运转在手机上的 Gecko 模型并不支撑文本生成及对话的才干。

Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?

能够看出官方文档中的信息与 Google I/O ’23 中的信息是仍是有些收支的,想要让 Gecko 运转在手机本地应该还有一段路要走,当然也或许是文档还没有及时更新吧()。

下面咱们就看一下怎么运用 Rest API 以及 SDK 的方法实现文本生成以及对话的功用。

3 怎么运用 PaLM2

3.1 简介

PaLM2 API 现在首要是供给了 3 种才干:

  • Text:依据 Prompt 生成对应的文本,类似于 OpenAI 的 Completions 接口;
  • Chat:依据 Prompt 生成对应的答复,支撑上下文,类似于 OpenAI 的 Chat 接口;
  • Embedding:核算文本词词向量的接口;

PaLM2 不像 OpenAI 只供给了官方的 Web API 和 Python SDK,它供给了官方各个言语的 SDK,包括 PythonNode.jsJavaAndroid(Kotlin)Swift

下面的首要介绍下云端 API 接口的定义以及 API 相关示例以 Android(Kotlin)为主进行展开。如果你了解过 OpenAI 相关的一些接口定义,那么你对下面的内容会比较了解。

留意,现在想要拜访 PaLM2 相关的服务,需求先加入到 Waitlist 等候审阅经过。现在本人也没有拜访权限,相关数据是种官方文档中收拾。

3.2 REST API

3.2.1 文本生成:Text

针对 Prompt: “Write a story about a magic backpack.” 希望回来 2 条成果的恳求的 Curl 如下:

curl https://generativelanguage.googleapis.com/v1beta2/models/text-bison-001:generateText?key=$PALM_API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
        "prompt": {
              "text": "Write a story about a magic backpack."
              },
        "temperature": 1.0,
        "candidate_count": 2}'

其间 temperature 表明回来文本的“随机”程度,取值在 0 和 1 之间。值越大随机性越高,如果是希望琪答复以一些固件的文本格式(如 JSON)时,应将 temperature 值调小。

回来成果如下:

{
  "candidates": [
    {
      "output": "Once upon a time, there was a young girl named Lily...",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_DEROGATORY",
          "probability": "NEGLIGIBLE"
        }, ...
      ]
    {
      "output": "Once upon a time, there was a young boy named Billy...",
      "safetyRatings": [
         ...
      ]
    }
  ]
}

其间 output 便是回来的文本成果。其间和 OpenAI 接口不同的是 PaLM 供给了生成文本的安全相关的信息,这个能够应该解决 LLM “胡说八道”的一些问题。其间 category 和 probability 是两个枚举,别离操控回来内容的安全信息(比方黄赌毒信息)以及对应信息过滤的阈值。

3.2.2 生成对话:Chat

比方开端一个 Hi 的对话的 Curl 如下,prompt :

curl https://autopush-generativelanguage.sandbox.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=$PALM_API_KEY  \
  -H 'Content-Type: application/json' \
  -X POST \
  -d '{
      "prompt": {"messages": [{"content":"hi"}]}, 
      "temperature": 0.1, 
      "candidate_count": 1}'

这儿的 prompt 是一个列表,上下文的信息便是需求经过此列表来传输。回来 JSON 内容如下:

{
  "candidates": [
    {
      "author": "1",
      "content": "Hi there! How can I help you today?"
    }
  ],
  "messages": [
    {
      "author": "0",
      "content": "hi"
    }
  ]
}

candidates 表明的便是回来的答复内容,恳求中设置的 candidate_count 为 1,所以这儿只回来一条内容。messages 字段中的内容便是恳求中的前史对话信息。恳求和回来中都有这部分信息不知道是否是冗余的,除此之外这儿应该不会屡次核算 Token。

这些需求留意的一点是 author 这个字段,这个有点类似 OpenAI 接口中的 role 这个字段。不同的是 OpenAI 是一个枚举,包括 system,user, orassistant 三个内容;而 PaLM2 中的 author 则是一个可选值,任意的一个字符串都能够,或许是为了后面的群聊设计的(?)。这儿还没有看到怎么给当时这次对话设置一个人物,或者是给当时的对话设置一个上下文。

3.2.3 其他接口

除了上述的两个首要接口外,还有 核算 Token 数、获取模型列表、检查模型详情、生成 文本 Embedding 等接口,这儿就不具体展开了,感兴趣的能够点击链接检查。

3.3 Android SDK

上述的 API 接口并不杂乱,可是一步步编写关于的解析逻辑仍是需求一定的工作量的,还好现在官方现已供给了 SDK ,咱们下面看一下 Android 中如果运用。

现在官方并没有供给开箱即用的示例工程,我这边收拾的一个可运转的 Android 示例工程:palm2-android,感兴趣的能够检查完整项目。

3.3.1 Text

3.3.1.1 初始化 Client
private fun initializeTextServiceClient(
    apiKey: String
): TextServiceClient {
    // (This is a workaround because GAPIC java libraries don't yet support API key auth)
    val transportChannelProvider = InstantiatingGrpcChannelProvider.newBuilder()
        .setHeaderProvider(FixedHeaderProvider.create(hashMapOf("x-goog-api-key" to apiKey)
        .build()
    // Create TextServiceSettings
    val settings = TextServiceSettings.newBuilder()
        .setTransportChannelProvider(transportChannelProvider)
        .setCredentialsProvider(FixedCredentialsProvider.create(null))
        .build()
    // Initialize a TextServiceClient
    val textServiceClient = TextServiceClient.create(settings)
    return textServiceClient
}
3.3.1.2 创立 Prompt
private fun createPrompt(
    textContent: String
): TextPrompt {
    val textPrompt = TextPrompt.newBuilder()
        .setText(textContent)
        .build()
    return textPrompt
}
3.3.1.3 创立 Request
private fun createTextRequest(prompt: TextPrompt): GenerateTextRequest {
    return GenerateTextRequest.newBuilder()
        .setModel("models/chat-bison-001") // Required, which model to use to generate the result
        .setPrompt(prompt) // Required
        .setTemperature(0.5f) // Optional, controls the randomness of the output
        .setCandidateCount(1) // Optional, the number of generated texts to return
        .build()
}
3.3.1.4 发送恳求
private fun generateText(
    request: GenerateTextRequest
) {
    viewModelScope.launch(Dispatchers.IO) {
        try {
            val response = client.generateText(request)
            val returnedText = response.candidatesList.last()
            // display the returned text in the UI
        } catch (e: Exception) {
            // There was an error
        }
    }
}

3.3.2 Chat

3.3.2.1 初始化 Client
private fun initializeDiscussServiceClient(
    apiKey: String
): DiscussServiceClient {
    // (This is a workaround because GAPIC java libraries don't yet support API key auth)
    val transportChannelProvider = InstantiatingGrpcChannelProvider.newBuilder()
        .setHeaderProvider(FixedHeaderProvider.create(hashMapOf("x-goog-api-key" to apiKey)))
        .build()
    // Create DiscussServiceSettings
    val settings = DiscussServiceSettings.newBuilder()
        .setTransportChannelProvider(transportChannelProvider)
        .setCredentialsProvider(FixedCredentialsProvider.create(null))
        .build()
    // Initialize a DiscussServiceClient
    val discussServiceClient = DiscussServiceClient.create(settings)
    return discussServiceClient
}
3.3.2.2 创立 Prompt
private fun createPrompt(
    messageContent: String
): MessagePrompt {
    val palmMessage = Message.newBuilder()
        .setAuthor("0")
        .setContent(messageContent)
        .build()
    val messagePrompt = MessagePrompt.newBuilder()
        .addMessages(palmMessage) // required
        .setContext("Respond to all questions with a rhyming poem.") // optional
        .addExamples(createCaliforniaExample()) // use addAllExamples() to add a list of examples
        .build()
    return messagePrompt
}
3.3.2.3 创立 Request
private fun createMessageRequest(prompt: MessagePrompt): GenerateMessageRequest {
    return GenerateMessageRequest.newBuilder()
        .setModel("models/chat-bison-001") // Required, which model to use to generate the result
        .setPrompt(prompt) // Required
        .setTemperature(0.5f) // Optional, controls the randomness of the output
        .setCandidateCount(1) // Optional, the number of generated messages to return
        .build()
}
3.3.2.4 发送恳求
private fun generateMessage(
        request: GenerateMessageRequest
) {
    viewModelScope.launch(Dispatchers.IO) {
        try {
            val response = client.generateMessage(request)
            val returnedMessage = response.candidatesList.last()
            // display the returned message in the UI
        } catch (e: Exception) {
            // API returned an error
        }
    }
}
3.3.2.5 多轮对话
fun sendMessage(userInput: String) {
    val prompt = createPrompt(userInput)
    val request = createMessageRequest(prompt)
    generateMessage(request)
}

3.3.3 其他 API

除了上述的生成文本以及对话的 API 之外,官方文档中还供给了 Embedding 的接口,这儿就不具体展开了。文档中没有写的 API(如获取模型列表、获取模型详情)其实经过检查源码也能发现 SDK 中也现已供给对应的才干了。

3.4 示例

项目完整的项目示例能够到官方项目 generative-ai-docs 中进行检查,现在能够的示例根本都是 WEB 相关的。

其间也供给了 iOS Swift 版本的示例:generative-ai-swift ,现在官方并没有供给 Android 的完整示例,只要上述的一些代码片段。我这边自己收拾了一个 Android 的示例工程。作用大致如下:

Text Chat
Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?
Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?

4 图形化东西:MakerSuite

无论是 Text 仍是 Chat,输入的 Prompt 对成果的影响会很大,有时候想要到达咱们希望的作用需求调试很长一段时刻,如果仅仅是经过代码的方法进行调试会有一些局限性。针对这种状况,Google 也供给了一个图形化的东西:MakerSuite 来解决这个问题。

MakerSuite 这个东西类似于 OpenAI 的 playground,从介绍来看完成度会更高,交互会更友好些。MakerSuite 首要有 3 个运用场景:

Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?

  1. Text prompts:针对 Text 接口的调试页面;
  2. Chat prompts:针对 Chat 接口的调试页面,这儿会回一些上下文以及人物的定义,能够经过此方法检查官方是怎么定义 author 这个属性的;
  3. Data prompts:这是专门针对少样本学习这种场景的页面,这儿和上述两个不同的是能够上传一些表格类型的文本数据进行调试;

上述 3 个场景中包括一些根本的操作,比方设置恳求的具体参数信息(如设置模型/随机性等)、将调试的内容直接复制为各个平台的代码。

除了上述内容之外,官方也供给了一个 Prompt Gallery 功用,展现了各种场景的 Prompt,相当于官方给出的各个场景中的最佳实践了。

Google I/O ‘23 上的发布 PaLM2 是什么?如何在 Android 上使用?

5 常见问题

预览期将持续多长时刻?

咱们现在的估量是预览期将在 2023 年下半年完毕。

PaLM API 的定价是多少?

在预览期间,开发者能够免费试用 PaLM API。定价将在临近全面上市时发布。

公共预览版在哪里可用?

PaLM API 公共预览版现在仅在美国可用。咱们正在努力赶快开放对其他地区的拜访。

6 写在最后

6.1 小结

本文首要是依据官方文档介绍了运用 Web API 以及 Android SDK 拜访 PaLM2 的大致流程。具体内容大致如下:

  1. 到现在为止,PaLM2 中是有两个模型(GeckoBison)巨细可供运用。其间可用于移动端的 Gecko 模型仅支撑 Embedding 才干,没有看到对话相关的介绍;
  2. PaLM2 除了供给了根本的云端接口外,还供给了 PythonNode.jsJavaAndroidKotlin)以及 Swift 的 SDK,比较于 OpenAI 只供给了 Python 库比较更有诚意;
  3. PaLM2 供给的接口才干与 OpenAI 根本一致,可是完成度会差不少,感觉设计上会有更多的考虑(比方隐私安全相关的 API 设置),便于后期扩展;
  4. 现在 PaLM2 还处于预览阶段,需求加入 waitlist 并审阅经过后才干体会;

更多具体内容能够官网中进一步检查:PaLM API | Generative AI for Developers

6.2 个人考虑

其实,关于 PaLM2 最吸引我的当地仍是在与其能够离线布置在手机端运转,从现在的调研成果来看,想要拿到 SDK 测验其实在的作用应该还要等一点时刻。

为什么 PaLM2 在手机端本地运转那么重要?或者说关于 Google 是一个要点方向。个人拙见,从以下几个方面阐述:

  1. Google 比较于其他的 LLM 竞争者,Android 操作体系是 Google 的“护城河”,其他参与者无法快速在操作体系层面有深度的整合。当然,微软也或许会在 PC 市场上也测验从方法,可是 PC 的出货量和手机仍是有些差距的。
  2. 围绕 Android 体系的上下游的厂商也肯定不像错过这一场 AGI 的浪潮,肯定也想做些事情,那么在 Android 手机运转自己的大言语模型是一个不错的思路。
  3. 近些年,安迪-比尔规律 在手机上的逐步失效,手机硬件的升级现已不被顾客过度追求。除了现在手机的硬件现已足够快之外,另外便是没有新的超级 App 把这些新升级的硬件性能消耗掉,所以整体上人们换机的意愿比较低。

对顾客而言也是有好处的,运用自己的个人数据“练习”一个自己的智能助理,并且这个助理能够仅仅只存在自己的手机上。除了陈词滥调的隐私安全方面考虑外,便是大言语模型能够充沛了解手机中的上下文,而不是在每个应用/模型中别离屡次的输入上下信息。

以上是自己的个人拙见,现在看在手机端离线运转大言语模型还有一些挑战和不确定性,可是不管怎样,咱们现在只要活跃拥抱不确定性,才或许在未来拥有更多的确定性