背景与问题
在博物馆、科技馆、企业展厅等场景中,传统的讲解方式主要依赖人工讲解或预录音频。人工讲解成本高、水平参差不齐,且无法覆盖所有参观者;预录音频虽然成本低,但缺乏交互性,游客只能按固定顺序收听,无法针对自己感兴趣的内容进行深入提问。
随着大语言模型技术的成熟,我们完全可以构建一个 AI智能交互讲解系统:用户通过语音或文字提问,系统调用大模型生成自然、专业的回答,并根据上下文进行多轮对话。这样既能降低人工成本,又能实现“千人千面”的个性化讲解体验。
方案设计
本文以阿里云百炼(Model Studio)平台为基础,使用通义千问大模型(qwen-plus)构建系统的核心对话引擎。整体架构分为四层:
- 接入层:支持文本输入,也可扩展阿里云语音识别与语音合成,实现语音交互;
- 业务层:对话管理、会话保持、权限控制等逻辑,可部署在阿里云函数计算中;
- 模型层:通过 DashScope SDK 调用百炼上的千问模型,生成回答;
- 知识层:利用阿里云 OSS 存储讲解资料,结合向量数据库实现 RAG,让模型基于特定知识回答。
为了聚焦核心流程,本文将重点实现“模型层 + 对话管理”这一关键模块。通过一个可运行的 Python 程序,演示如何实现流式输出和上下文记忆。
实现步骤
1. 准备环境
首先在阿里云百炼控制台开通大模型服务,并获取 API Key。然后安装 DashScope SDK:
pip install dashscope
设置环境变量,避免在代码中硬编码密钥:
export DASHSCOPE_API_KEY="你的API-KEY"
2. 创建工作目录
创建一个 Python 文件,例如 interactive_guide.py,将下面的代码粘贴进去。
3. 代码实现
import os
import dashscope
from dashscope import Generation
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')
class InteractiveGuide:
def __init__(self, system_prompt):
self.system_prompt = system_prompt
self.history = []
def ask(self, user_input):
# 构造消息序列:系统提示 + 历史对话 + 当前输入
messages = [{
'role': 'system', 'content': self.system_prompt}]
messages.extend(self.history)
messages.append({
'role': 'user', 'content': user_input})
# 使用流式方式调用千问模型
response = Generation.call(
model='qwen-plus',
messages=messages,
stream=True,
result_format='message',
)
full_content = ''
print('讲解员:', end='', flush=True)
for chunk in response:
if chunk.status_code == 200:
delta = chunk.output.choices[0].message.content
full_content += delta
print(delta, end='', flush=True)
else:
print(f'[错误] {chunk.code}: {chunk.message}')
return None
print()
# 维护多轮对话历史
self.history.append({
'role': 'user', 'content': user_input})
self.history.append({
'role': 'assistant', 'content': full_content})
return full_content
if __name__ == '__main__':
guide = InteractiveGuide(
system_prompt='你是一位热情、专业的智能讲解员。请用通俗易懂的语言回答游客的问题。如果问题超出你的知识范围,请诚实说明。'
)
print('欢迎使用AI智能互动讲解系统,输入退出结束。')
while True:
user_input = input('游客:')
if user_input.strip() == '退出':
break
guide.ask(user_input)
4. 运行验证
在终端执行:
python interactive_guide.py
运行效果类似:
游客:这座建筑是什么时候建成的?
讲解员:这座建筑始建于1923年,是典型的民国风格...
游客:设计者是谁?
讲解员:设计者是著名建筑师梁思成先生...
注意,因为第二次提问省略了主语,系统通过“上下文记忆”正确理解了“设计者”是指“这座建筑的设计者”。这正是多轮对话的价值。
关键要点说明
- 系统提示词(System Prompt):我们给模型定义了“讲解员”角色,并限定了回答风格。提示词直接影响回答质量,生产环境中应进行精细化设计。
- 消息列表:
Generation.call中的messages参数支持system、user、assistant三种角色。把历史对话一并传给模型,才能实现多轮交互。 - 流式输出:设置
stream=True后,模型会逐片返回结果。这样用户无需等待全部生成,体验更接近实时对话。如果想简单获取完整结果,可以设置stream=False,然后从response.output.choices[0].message.content取文本。 - 上下文长度:随着对话推进,
history会越来越长,最终超过模型的 token 上限。实际应用中需要做截断或摘要,比如只保留最近 10 轮对话,或对早期对话做文本摘要。
扩展:接入知识库
如果讲解内容有严格的事实要求,可以引入 RAG(检索增强生成)能力。具体做法是:先将万字讲解资料在阿里云 OSS 中存储,然后切分为片段并向量化,存入阿里云向量检索产品。每次用户提问时,先用向量检索找到最相关的知识片段,将其拼接到 user 消息中,再让模型回答。
这样回答就有据可依,能显著减少大模型“幻觉”。本文中的系统提示词里也可以加上“如果知识库中没有相关信息,请直接告知用户,不要编造”。
注意事项
- API Key 安全:不要把 Key 提交到代码仓库,必须通过环境变量或密钥管理服务注入。
- 成本控制:大模型 API 按 Token 计费,对话越长成本越高。除了截断上下文,还可以设置温度参数
temperature降低随机性,或使用较小的qwen-turbo模型。 - 并发与部署:若服务面向公众,建议将对话服务部署到阿里云函数计算,利用其自动弹性伸缩能力,再配合 API 网关对外提供 RESTful 接口。
- 敏感内容过滤:不同场景可能需要启用百炼的敏感内容过滤能力,避免产生不合适的内容。
总结
本文介绍了如何基于阿里云百炼构建 AI 智能交互讲解系统。通过简洁的 Python 代码,我们实现了流式多轮对话,并讨论了上下文管理和知识库扩展。这套方案可以广泛应用于博物馆导览、企业接待、在线教育等场景。借助阿里云的服务化能力,开发者能够快速将原型变为生产系统,获得稳定、低成本的智能讲解服务。