Multi-turn Chat(多轮对话) — KK Chat的上下文理解能力

前面我们已经学习了 SQLite,实现了聊天记录保存。
但是,仅仅保存聊天记录,并不意味着 AI 能够记住之前聊过的内容。
今天,我们学习了 Multi-turn Chat(多轮对话),真正让 Chatbot 拥有理解上下文的能力。


一、为什么需要多轮对话?

先举一个例子。
没有上下文:

你:我今年20岁

AI:好的。

你:那我明年多少岁?

AI:???

为什么 AI 不知道?
因为第二句话:

那我明年多少岁?

里面根本没有:

20岁

如果模型只收到:

那我明年多少岁?

它当然不知道。
所以AI 并不是"忘记"。
而是它根本没有收到上一句话。


二.为什么大模型没有上下文

因为OpenAI API,每一次请求,都是独立的。
例如:

第一次:
messages=[{"role":"user","content":"我今年20岁"}]


第二次:
如果:
messages=[{"role":"user","content":"我明年多少岁?"}]

模型看到的只有:

我明年多少岁?

所以不知道。


三、history 是什么?

Chatbot接下来需要把以前聊天记录,全部发送过去。
例如:

数据库:
user

assistant

user

assistant

load_history()
恢复:
history=[...]

然后组成:

messages=[system]+history

于是真正发送给模型的是:

messages=[{"role":"system",...},{"role":"user","content":"我今年20岁"},{"role":"assistant","content":"好的"},{"role":"user","content":"那我明年多少岁?"}]

这时候模型终于知道上一句话是什么了。


四、什么叫上下文(Context)

上下文就是之前发生的所有聊天。
例如:

用户:

介绍FastAPI

AI:
FastAPI......

下一句:

它和Flask有什么区别?

这里:

它

是谁?只有上下文才能知道:

它=FastAPI

如果没有history,AI根本不知道:"它"是谁。


五、Multi-turn Chat 是怎么实现的?

整个流程如下:

程序启动
      │
      ▼
SQLite
      │
SELECT
      │
history
      │
      ▼
messages = [system] + history
      │
      ▼
OpenAI SDK
      │
      ▼
GPT
      │
      ▼
返回回答
      │
      ▼
保存到SQLite

这里

  • SQLite负责保存历史。

  • history负责恢复历史。

  • messages负责发送历史。

  • OpenAI负责理解历史。


六、history 和 messages 有什么区别?

这是今天最容易混淆的地方。
其实history只是聊天记录。
例如:

history=[userassistantuserassistant]

而真正发送给模型的是:

messages=[system]+history

所以:

messages

=

system

+

history

七、总结

今天学习的其实也是聊天机器人的整个数据流

SQLite
      │
      ▼
SELECT
      │
      ▼
history
      │
      ▼
messages=[system]+history
      │
      ▼
OpenAI SDK
      │
      ▼
GPT
      │
      ▼
AI回答
      │
      ▼
SQLite

整个流程形成了闭环。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐