用API实现多轮对话

入门·10 分钟·通过可运行代码讲解「用API实现多轮对话」,覆盖环境准备、核心代码、参数说明、异常处理、工程化改造和练习任务,适合 AI 编程入门。

用API实现多轮对话

多轮对话不是简单地连续调用 API。模型本身不会自动记住你程序里的历史,你必须把必要的上下文组织进 messages 中。

单轮和多轮的区别

单轮调用只包含当前问题:

messages = [{'role': 'user', 'content': '什么是RAG?'}]

多轮对话需要保留历史:

messages = [
    {'role': 'user', 'content': '什么是RAG?'},
    {'role': 'assistant', 'content': 'RAG 是检索增强生成...'},
    {'role': 'user', 'content': '它和微调有什么区别?'}
]

第二个问题里的“它”依赖上一轮上下文,所以必须传历史。

基本实现结构

messages = [
    {'role': 'system', 'content': '你是一个耐心的 AI 学习助手'}
]
 
while True:
    user_input = input('你:')
    if user_input.lower() in ['exit', 'quit']:
        break
 
    messages.append({'role': 'user', 'content': user_input})
    answer = call_model(messages)
    print('AI:', answer)
    messages.append({'role': 'assistant', 'content': answer})

其中 call_model 是你封装的 API 调用函数。

控制上下文长度

历史消息越多,token 越多,成本越高,也可能超过模型上下文窗口。常见处理方式是只保留最近 N 轮、对较早历史做摘要、只保留和当前任务相关的信息。

给对话加状态

很多业务对话需要状态,例如用户已经选择了产品、填写了地址、确认了预算。不要只依赖模型从长文本里猜状态,最好在程序中维护结构化状态。

state = {
    'product': None,
    'budget': None,
    'confirmed': False
}

小结

多轮对话的关键是上下文管理。你要决定保存什么、丢弃什么、摘要什么,以及哪些状态必须由程序可靠保存。