【从零搭建聊天机器人】03 对接大语言模型:集成 云端AI赋予机器人智能大脑

写在前面
欢迎回到《从零搭建聊天机器人》系列教学的第三章!在上一章中,我们成功申请了 Telegram 机器人账号,并在本地通过 Python 虚拟环境实现了一个简单的“回声”功能。但如果只能一字不差地重复我们的话,它显然还不够聪明。
本章我们将完全基于课程实验大纲,为机器人接入大语言模型(LLM)API。本教程以云端AI的API为例进行深度集成(大家在实际操作中,也可以举一反三替换为 DeepSeek、OpenAI 等其他主流大模型 API)。我们将通过异步编程,让机器人真正学会“思考”与“对话”。


🎯 学习目标 (Intended Learning Outcomes)

在本章节结束时,你应当能够掌握以下核心技能:

  1. 成功集成 大语言模型(LLM)到你的聊天机器人系统架构中(Integrate a large language model into your chatbot)。
  2. 掌握 使用 Python 动态调用外部 RESTful API 的核心方法。
  3. 理解并应用 异步任务(Async/Await)处理耗时的大模型请求,优化用户交互体验。
  4. 实践 生产环境中的代码安全规范,彻底杜绝敏感密钥泄露。

01 获取大模型接入凭证 (Get Access Token)

在代码连接大模型之前,我们必须获取一个专属的 API 密钥(API Key),作为机器人与大模型服务器之间通信的身份凭证。

1. 生成 API Key

获取云端AI例如DeepSeek, ChatGPT的API密钥

2. 更新配置文件 config.ini

为了保障安全,我们绝不将密钥直接写在主程序中。请打开你在第二章创建的 config.ini 文件,在原有内容下方追加 [CHATGPT] 节点配置:

[TELEGRAM]
ACCESS_TOKEN = 8281349887:AAGr.............U-N8

[CHATGPT (选择的模型)]
API_KEY = 你的API密钥
BASE_URL = API网址
MODEL = 使用的模型
API_VER = 模型的版本

⚠️ 注意:请将 你的API密钥 替换为你刚刚真实生成的密钥字符串。


02 编写大模型对接模块

为了让代码结构更具模块化,通常会使用一个独立的封装类来处理与大模型底层的 HTTP 通信。在项目中,我们需要确保根目录下存在一个专门的工具文件(例如 ChatGPT_25.py),其中封装了发送请求的 submit(message) 方法。
使用 Python 访问 ChatGPT

现在,我们将更新聊天机器人程序以访问 ChatGPT。请按照以下步骤操作:

1. 打开终端(命令提示符)并激活虚拟环境:

Windows 系统:

cd <项目路径>
venv\Scripts\activate

macOS 系统:

cd <项目路径>
source venv/bin/activate

将 <路径>/ 替换为项目文件夹的实际路径。

2 安装所需的软件包:

python -m pip install requests

3 编写向AI发送请求的程序

import requests
import configparser
# ChatGPT REST API 的简单客户端
class ChatGPT:
    def __init__(self, config):
        # 从 ini 文件读取 API 配置值
        api_key = config['CHATGPT']['API_KEY']
        base_url = config['CHATGPT']['BASE_URL']
        model = config['CHATGPT']['MODEL']
        api_ver = config['CHATGPT']['API_VER']

        # 构建聊天自动补全的完整 REST 端点 URL
        self.url = f'{base_url}/deployments/{model}/chat/completions?api-version={api_ver}'

        # 设置身份验证和 JSON 负载所需的 HTTP 标头
        self.headers = {
            "accept": "application/json",
            "Content-Type": "application/json",
            "api-key": api_key,
        }

        # 定义系统提示词以指导AI的输出风格
        self.system_message = (
            'You are a helper! Your users are university students. '
            'Your replies should be conversational, informative, use simple words, and be straightforward.'
        )

    def submit(self, user_message: str):
        
        # 构建对话历史:系统消息 + 用户消息
        messages = [
            {"role": "system", "content": self.system_message},
            {"role": "user", "content": user_message},
        ]

        # 使用生成参数准备请求负载
        payload = {
            "messages": messages,
            "temperature": 1,     # 输出的随机性(越高越有创意)
            "max_tokens": 150,    # 回复的最大长度
            "top_p": 1,           # 核心采样参数
            "stream": False       # 禁用流式传输,等待完整回复
        }    

        # 向 ChatGPT REST 发送请求API
        response = requests.post(self.url, json=payload, headers=self.headers)

        # 如果成功,返回AI的回复文本
        if response.status_code == 200:
            return response.json()['choices'][0]['message']['content']
        else:
            # 否则返回错误详情
            return "Error: " + response.text
    

if __name__ == '__main__':
    # 从 ini 文件加载配置
    config = configparser.ConfigParser()
    config.read('config.ini')    

    # 初始化 ChatGPT 客户端
    chatGPT = ChatGPT(config)

    # 简单的 REPL 循环:读取用户输入,发送到 ChatGPT,打印回复
    while True:
        print('Input your query: ', end='')
        response = chatGPT.submit(input())
        print(response)

该模块的核心逻辑是:读取 config.ini 中的配置信息,构造符合标准的 HTTP POST 请求头(包含 api-key)与请求体(包含用户消息和指定的模型版本),并通过网络库发送给云端大模型服务器,最后解析并返回 AI 生成的文本。

4 测试请求和回复

激活虚拟环境

cd <项目路径>
venv\Scripts\activate
(venv) <路径> python ChatGPT_25.py

输出任意内容查看是否成功回复


03 核心业务逻辑升级 (Updating chatbot.py)

现在,我们需要修改主程序 chatbot.py,将原本的“大写回声”逻辑替换为“大模型智能对话”逻辑。同时,为了防止 AI 在思考时由于网络延迟导致用户以为机器人卡死,我们将引入一个 “思考中…” 的中间状态提示。

请打开 chatbot.py,将其中的核心内容修改并升级为以下严谨的代码:

1. 在顶部添加引用和创建全局变量

from ChatGPT import ChatGPT
gpt = None

2. 修改主函数在读取ini文件后初始化gpt客户端

global gpt
gpt = ChatGPT(config)

3. 替换回调函数callback()

异步回调函数:处理接收到的所有纯文本消息

async def callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # await update.message.reply_text(response)
    logging.info("UPDATE: " + str(update))
    loading_message = await update.message.reply_text('思考中...')

    try:
        # 将用户发送的文本投递给大模型客户端进行处理
        response = gpt.submit(update.message.text)
        
        # 动态更新:大模型生成完毕后,利用其异步通道编辑并替换原有的 "思考中..." 文本
        await loading_message.edit_text(response)
        
    except Exception as e:
        # 异常容错处理
        logging.error(f"调用大模型发生错误: {e}")
        await loading_message.edit_text("大模型调用错误,请检查模型配置是否正确")

4 最终完整代码如下

'''
This program requires the following modules:
- python-telegram-bot==22.5
- urllib3==2.6.2
'''
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, filters
# 引入大模型对接模块(确保 ChatGPT_25.py 在同级目录下)
from ChatGPT_25 import ChatGPT
gpt = None
import configparser
import logging

def main():
    # 配置底层的日志输出格式与级别
    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', 
        level=logging.INFO
    )
    
    # 初始化配置解析器并读取本地的 config.ini 配置文件
    config = configparser.ConfigParser()
    config.read('config.ini')
    
    # 【核心升级】在配置加载后、注册 Handler 之前,初始化大模型客户端对象
    global gpt
    gpt = ChatGPT(config)
    
    # 从配置中安全提取 Telegram Token 并构建 Application
    token = config['TELEGRAM']['ACCESS_TOKEN']
    app = ApplicationBuilder().token(token).build()
    
    # 注册消息处理器:过滤纯文本且排除斜杠命令
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, callback))
    
    # 启动机器人长轮询模式
    logging.info('机器人初始化成功!')
    app.run_polling()


# 异步回调函数:处理接收到的所有纯文本消息
async def callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # await update.message.reply_text(response)
    logging.info("UPDATE: " + str(update))
    loading_message = await update.message.reply_text('思考中...')

    try:
        # 将用户发送的文本投递给大模型客户端进行处理
        response = gpt.submit(update.message.text)
        
        # 动态更新:大模型生成完毕后,利用其异步通道编辑并替换原有的 "思考中..." 文本
        await loading_message.edit_text(response)
        
    except Exception as e:
        # 异常容错处理
        logging.error(f"调用大模型发生错误: {e}")
        await loading_message.edit_text("大模型调用错误,请检查模型配置是否正确")

if __name__ == '__main__':
    
    main()



04 运行测试与日志验证

在终端激活虚拟环境的状态下,输入以下命令让机器人跑起来:

python chatbot.py

📸 规范运行日志输出

当你在 Telegram 中向机器人发送诸如“请问什么是云计算?”等问题时,在你的本地终端里应该能流畅地观察到如下所示的调用日志链:

2026-05-22 11:15:22,341 - root - INFO - 初始化成功!
2026-05-22 11:15:40,112 - root - INFO - UPDATE: Update(...... text='什么是云计算'), update_id=xxxx)
2026-05-22 11:15:40,430 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot.../sendMessage "HTTP/1.1 200 OK"
2026-05-22 11:15:42,895 - httpx - INFO - HTTP Request: POST (你的AI模型API Base_URL...) "HTTP/1.1 200 OK"
2026-05-22 11:15:43,102 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot.../editMessageText "HTTP/1.1 200 OK"

从日志中可以明显清晰地看到:收到消息 ➔ 发送临时的 sendMessage(思考中…) ➔ 向大模型平台发送 POST 请求获取 AI 回复 ➔ 执行 editMessageText 动态修改消息。

输出结果:
在这里插入图片描述
在这里插入图片描述

测试完毕,恭喜你拥有智能聊天机器人了!!*


05 注意:不要忘记推送ChatGPT_25.py,以及推送修改后的chatbot.py到远程仓库!!!

06 踩坑实录:我遇到的错误与怎么解决的

在本章大模型集成的调试过程中,我踩了两个非常经典的坑,专门分享出来供大家避雷:

❌ 错误一:前面将虚拟环境删除后未重新下载Telegram模块

ModuleNotFoundError: No module named 'telegram'
  • 报错原因
    前面在错误的地方创建虚拟环境,删除虚拟环境后下载的模块都删除了,需要重新下载
  • 解决方案
cd <项目路径>
venv\Scripts\activate
python -m pip install -U pip
pip install -r requirements.txt

本文为《从零搭建聊天机器人》系列教程第三章。在下一章中,我们将离开本地开发机,正式迈向云原生:在 AWS 云端创建 EC2 虚拟服务器,并将我们的智能聊天机器人部署到真正的云端,实现 24 小时在线!欢迎持续关注!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐