Android开发转AI Agent:第1天——用Kotlin思维理解LLM API调用

作者:一位Android开发工程师 | 2026年5月24日
背景:零AI基础,熟悉Kotlin/Java,了解Python基本语法
目标:3个月转行AI Agent应用开发工程师


前言

做了几年Android开发,最近决定转行AI Agent方向。今天是我学习的第一天,目标是:用代码调通第一次LLM API

作为一个Android开发,我对Python并不熟练。但跑通之后发现——LLM API调用和我们在Android里调HTTP接口的逻辑完全一样。这篇文章就用Kotlin作对照,记录我的理解。


一、环境准备

只装了两个包:

pip install openai python-dotenv
  • openai:OpenAI兼容的HTTP客户端,负责发请求
  • python-dotenv:从.env文件读取配置,类似Android的BuildConfig

配置.env文件:

DEEPSEEK_API_KEY=sk-xxx
DEEPSEEK_BASE_URL=https://xxx.com/api/v1

二、核心代码(3行就够)

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

# ① 创建客户端
client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL"),
)

# ② 发送请求
response = client.chat.completions.create(
    model="turing/gpt-4o-mini",
    messages=[
        {"role": "system", "content": "你是一个Android开发助手"},
        {"role": "user", "content": "用一句话解释什么是Kotlin协程"},
    ],
)

# ③ 取结果
print(response.choices[0].message.content)

输出:

Kotlin协程是一种轻量级的并发编程机制,可以简化异步任务的编写...

三、用Kotlin思维逐行理解

作为Android开发者,如果你写过OkHttpRetrofit请求,Python这边做的事完全一样:

3.1 创建客户端

client = OpenAI(api_key="...", base_url="...")

等价于 Kotlin:

val client = OkHttpClient.Builder()
    .addInterceptor { chain ->
        chain.proceed(chain.request().newBuilder()
            .addHeader("Authorization", "Bearer $apiKey")
            .build())
    }
    .build()

本质就是创建一个带认证头的HTTP客户端。

3.2 构造请求

response = client.chat.completions.create(
    model="turing/gpt-4o-mini",
    messages=[
        {"role": "system", "content": "你是一个Android开发助手"},
        {"role": "user", "content": "用一句话解释什么是Kotlin协程"},
    ],
)

等价于 Kotlin 中的 Retrofit 请求体:

@POST("/chat/completions")
suspend fun chat(@Body request: ChatRequest): ChatResponse

data class ChatRequest(
    val model: String,
    val messages: List<Message>
)
data class Message(val role: String, val content: String)

其中messages数组里每个元素有两个字段:

字段 含义 Android类比
role: "system" 设定LLM的"人设"和行为规则 类似在build.gradle里配置项目属性
role: "user" 你真正的提问 类似API的请求参数

3.3 解析响应

response.choices[0].message.content

等价于:

response.body()?.choices?.firstOrNull()?.message?.content

注意这里的链式结构:

response
  └─ choices[0]        # 第一个候选回答(通常只有一个)
       └─ message       # 消息对象
            └─ content  # 实际文本内容

四、一个重要的概念:Token

运行代码后,控制台还输出了一行:

Token 用量:输入: 27 tokens,输出: 47 tokens,总计: 74 tokens

Token ≠ 字数

  • 一个英文单词可能占 1-2 个token
  • 一个中文字通常占 1.5-2 个token
  • 粗略估算:100 token ≈ 75个英文单词 ≈ 60个中文字

Token是LLM的计费单位,类似于Android开发中API调用的QPS配额。在后面的学习中,Token消耗会直接影响成本和Agent的性能优化。


五、今天的学习方法总结

作为有编程经验的开发者,我采用的方法是:

  1. 不求精通Python:只学到能跑通代码的程度
  2. 用已有知识类比对标:每行Python代码都找Kotlin对应写法
  3. 先跑通再理解:不是看完所有文档才动手,先看到结果再说
  4. 改一行验证理解:把问题内容换成自己的,重新运行看输出是否不同

六、写给自己的一句话总结

LLM API本质上就是一次HTTP POST请求——把messages数组发过去,从response.choices[0].message.content取回结果。后面所有Agent、RAG、多轮对话,都在这3行代码的基础上加花样。


下一篇预告

第2天:控制LLM的"创造力"——temperature参数实验。同一个问题,temperature=0和temperature=1.5,输出差异有多大?


本系列记录一位Android开发者转行AI Agent的完整学习过程,欢迎关注交流。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐