ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【零基础入门 LLM 开发 · Day 1】:第一次调用大模型——你的第一个 AI 程序

【零基础入门 LLM 开发 · Day 1】:第一次调用大模型——你的第一个 AI 程序 为什么从这一篇开始学 LLM 开发就像学做菜第一步不是研究火候而是先把锅端起来——成功调用一次 API拿到一句 AI 的回复。今天的目标就这一个。先搞懂三个概念1. API 是什么大白话你把一段话寄给大模型服务商的服务器它算完把回复寄回来。一来一回就是一次 API 调用。2. 密钥为什么要放.env文件里密钥就是你的钱包密码写死在代码里一旦上传 GitHub 就等于把卡号密码贴在小区门口。所以我们都放在.env文件里再用python-dotenv加载fromdotenvimportload_dotenvimportos load_dotenv()# 把 .env 文件里的内容读进环境变量api_keyos.getenv(YUMC_MODEL_API_KEY)# 从环境变量取密钥base_urlos.getenv(YUMC_MODEL_BASE_URL)# 服务商的接口地址3.base_url是干嘛的OpenAI 的 SDK 是行业通用标准几乎所有模型服务包括国产模型都兼容这套协议。只要换个base_url同一套代码就能调用不同的模型。这就是一处学习处处能用。完整代码fromopenaiimportOpenAIimportosfromdotenvimportload_dotenv load_dotenv()# 1. 创建客户端带上密钥和服务地址clientOpenAI(api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)# 2. 发起对话请求responseclient.chat.completions.create(modelyumcode-pro,# 模型名称messages[{role:system,content:你是一个极其幽默的程序员助手。},{role:user,content:你是谁请用一句话介绍你自己。}])# 3. 从响应对象里取出回复文本print(-----完整响应对象)print(response)# 先看看它长什么样一大坨print(\n回复文本 )replyresponse.choices[0].message.content# 真正想要的就这一行print(reply)逐段拆解messages对话的剧本重点展开讲先看今天传的这两条消息messages[{role:system,content:你是一个极其幽默的程序员助手。},{role:user,content:你是谁请用一句话介绍你自己。}]messages是一个列表列表里每一项是一个字典字典只有两个必需字段role这条话是谁说的content这条话的内容。就这么简单——整个 LLM 对话的基石就是一堆{role: ..., content: ...}字典排成队。把 API 调用想象成一场话剧模型是演员messages是递给它的剧本。剧本里每行台词都要标明说话人演员才知道该怎么接戏角色剧场比喻是谁特点system导演的幕后指令开发者你用户看不见AI 开演前必读权重最高user观众递的纸条使用程序的人每轮对话的提问assistant演员的台词AI 自己它说过的话Day 6 讲记忆时会用到system给人设和规矩它不是聊天内容而是开演前对演员的嘱咐你是谁、什么语气、什么能说什么不能说。你是一个极其幽默的程序员助手。 → 回复自带段子手气质 你是一个说话非常简洁的数学老师。 → 回复短促、精确、爱列公式 你是一个资深法务回答必须谨慎严谨。 → 回复处处建议咨询专业律师同一个问题你是谁三种 system 会得到三种完全不同的人设回答。system 是你控制 AI 行为的第一杠杆写好它后面能省一半提示词功夫。另外注意两点system不是必须的。不传它AI 就用默认人设一个客气但无聊的通用助手它通常放在列表第一个——开演前先念导演指令嘛。user观众递的纸条今天例子里的问题就是一条 user 消息。它是唯一真正的输入——前面所有铺垫system都是为了这句话能得到你想要的回答。assistant今天的配角未来的主角你会发现今天的代码里没有assistant 消息——因为对话还没开始AI 还没说过话。它的台词从哪来从response.choices[0].message.content里来。Day 6 实现多轮记忆时我们会亲手把 AI 的回答以assistant角色塞回列表——到那时这三兄弟才算凑齐。预告角色其实不止这三种。Day 8 学 Function Calling 时会登场第四位tool工具执行结果的汇报。消息的顺序就是剧本的页码模型按列表顺序理解对话。system放最前user跟在后面。如果你把 user 放前面、system 放后面模型虽然大概率也能理解但行为可能变得不可预测——按规范来别给演员加戏。动手感受一下试着把 system 换成下面几种各跑一次对比回答# 实验 1换人设{role:system,content:你是一个 5 岁小朋友的启蒙老师。}# 实验 2加规矩{role:system,content:你是一个程序员助手回答永远不超过 20 个字。}# 实验 3删掉 system直接只留 usermessages[{role:user,content:你是谁请用一句话介绍你自己。}]做完这三个实验你对角色的理解就超过大多数初学者了。response一大坨但只需要一个字段直接print(response)会看到一大坨对象。别慌我们要的永远只是这一行response.choices[0].message.content拆开看choices是一个列表模型可能返回多个候选答案我们取第 0 个 →.message是消息对象 →.content是文本内容。运行效果回复文本 我是一个由 YumCode 驱动的、擅长讲程序员段子的 AI 助手今日踩坑点api_keyNone报错.env文件名拼错、或load_dotenv()没调用os.getenv会返回None。401 认证失败密钥复制时带了空格或引号。404 model not found模型名写错了明天教你一招直接问服务端你有哪些模型。千万别把.env传到 git在.gitignore里加一行.env。今日小练习把 system 改成你喜欢的任意人设毒舌影评人古代侠客观察回复风格变化。把print(response)的输出仔细看一遍找到model、usage字段——明天我们就用它们。明日预告Day 2调用之前先看看服务端到底部署了哪些模型避免报 404 两小时其实是名字写错的惨案。附录完整练习代码openAITest2.pyfromopenaiimportOpenAIimportosfromdotenvimportload_dotenv load_dotenv()clientOpenAI(api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)responseclient.chat.completions.create(modelyumcode-pro,messages[{role:system,content:你是一个极其幽默的程序员助手。},{role:user,content:你是谁请用一句话介绍你自己。}])print(-----完整响应对象)print(response)print(\n提前回复文本 )replyresponse.choices[0].message.contentprint(reply)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进