背景与问题
语言学习需要高频互动和即时反馈,但传统一对一口语陪练成本高、时间受限。大语言模型(LLM)具备自然流畅的对话能力和文化知识储备,适合构建模拟对话、语法纠错、发音反馈等教学场景。然而,直接调用模型API仅能处理单轮文本,无法应对真实教学中多轮对话、语音输入、教学进度记录等需求。
构建一个AI语言教学智能体,通常要解决三个问题:
- 对话状态管理:如何记住学生上次说过的内容、当前水平和学习目标。
- 多模态输入输出:学生可能使用语音,需要自动语音识别(ASR)和语音合成(TTS)能力。
- 服务部署与弹性:教学应用有高峰低谷,要求低成本、快速伸缩,且运维简单。
阿里云函数计算(FC)提供事件驱动的Serverless运行环境,天然适配这种间歇性、弹性需求。百炼(Bailian)平台则提供大模型API、Prompt模板和知识库能力,两者结合可快速搭建稳定可靠的语言教学智能体。
方案设计
整体架构如下:
flowchart TD
Student[学生] -->|语音/文本| APIGateway[API Gateway]
APIGateway --> FC[函数计算]
FC --> ASR[百炼语音识别或OSS转写]
FC --> LLM[百炼大模型 / 通义千问]
LLM --> FC
FC --> TTS[语音合成]
FC --> APIGateway
APIGateway --> Student
核心设计原则:
- 无状态函数 + 外部会话存储:函数的每个实例不保存用户状态,会话历史存入Redis或表格存储,以便多实例下状态一致。
- 提示词工程:在系统提示中规定AI的“老师”角色、语言级别、纠错策略与回复格式。
- 异步处理:对于耗时的语音合成,采用异步任务与回调,避免API网关超时。
本文为简化演示,聚焦文本对话场景,并给出可扩展的语音入口设计。
实现步骤
1. 创建百炼应用与API Key
在阿里云百炼控制台开通大模型服务,创建API Key。选择基础模型qwen-plus(通义千问)或qwen-max,也可以利用百炼的应用中心创建自定义智能体应用,获得agent_key。
2. 准备函数计算环境
使用Python 3.10运行时,通过Serverless Devs或控制台创建函数。需在函数中配置环境变量:
DASHSCOPE_API_KEY:百炼API密钥MODEL_NAME:模型名称,如qwen-plus
3. 编写核心对话函数
函数接收HTTP请求,解析JSON,调用百炼SDK实现多轮对话。以下是完整示例代码:
import os
import json
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse
import dashscope
from dashscope import Generation
# 初始化百炼客户端
dashscope.api_key = os.environ.get("DASHSCOPE_API_KEY")
MODEL = os.environ.get("MODEL_NAME", "qwen-plus")
# 简易会话存储:使用全局字典演示,生产环境建议用Redis
session_history = {
}
# 系统提示词,定义语言教师的角色和教学策略
TEACHER_PROMPT = """你是一位耐心、专业的英语口语教师。你的学生是中级水平。
你的职责:
1. 用英语纠正学生的语法错误和用词不当,先给出正确表达,再简要解释。
2. 根据学生提到的兴趣话题,逐步引导对话深入。
3. 每次回复不超过5句,结尾用一个开放性问题鼓励学生继续。
4. 如果学生要求中文解释,可以使用少量中文。
当前对话历史:
{history}
学生:{user_input}
"""
class handler(BaseHTTPRequestHandler):
def do_POST(self):
# 读取请求体
content_length = int(self.headers.get('Content-Length', 0))
body = self.rfile.read(content_length)
try:
data = json.loads(body)
user_id = data.get('user_id', 'default')
user_input = data.get('text', '')
except Exception:
self._send_json({
"error": "Invalid request"}, 400)
return
if not user_input:
self._send_json({
"error": "text is required"}, 400)
return
# 获取该用户的历史对话(最多保留10轮)
history = session_history.get(user_id, [])
# 构造送给大模型的完整Prompt
history_str = "\n".join(history[-10:])
prompt = TEACHER_PROMPT.format(history=history_str, user_input=user_input)
# 调用百炼模型
try:
resp = Generation.call(
model=MODEL,
messages=[{
"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=500,
result_format="message"
)
if resp.status_code == 200:
answer = resp.output.choices[0].message.content
# 更新对话历史(用户输入 + AI回复)
history.append(f"学生: {user_input}")
history.append(f"教师: {answer}")
session_history[user_id] = history[-10:]
# 返回结果,包含语音合成标记(生产环境可调用TTS)
self._send_json({
"reply": answer,
"audio_url": None # 示意字段,可接阿里云语音合成
})
else:
self._send_json({
"error": f"Model error: {resp.code}"}, 500)
except Exception as e:
self._send_json({
"error": str(e)}, 500)
def _send_json(self, obj, status=200):
body = json.dumps(obj, ensure_ascii=False).encode('utf-8')
self.send_response(status)
self.send_header('Content-Type', 'application/json; charset=utf-8')
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
代码说明
dashscopeSDK:阿里云百炼官方Python SDK,需提前在requirements.txt中声明依赖:dashscope>=1.10。TEACHER_PROMPT:将角色设定放在系统提示中,使模型表现稳定。通过history变量注入多轮对话,让AI具备上下文记忆。session_history:为演示简单使用全局字典;生产环境务必使用Redis或云数据库,避免函数实例释放后丢失。- HTTP handler:函数计算自定义运行时支持BaseHTTPRequestHandler,或者您可以使用Flask依赖部署。这种方式直接在FC中运行,便于调试。
4. 部署到函数计算
使用serverless-devs命令行工具,定义s.yaml:
edition: 1.0.0
name: ai-language-tutor
services:
tutor:
component: devsapp/fc
props:
region: cn-hangzhou
service:
name: ai-tutor-service
description: AI语言教学智能体服务
internetAccess: true
function:
name: tutor-function
runtime: python3.10
handler: index.handler
environmentVariables:
DASHSCOPE_API_KEY: "${env(DASHSCOPE_API_KEY)}"
MODEL_NAME: "qwen-plus"
codeUri: ./code
triggers:
- type: http
name: http-trigger
description: API入口
authType: anonymous
methods: [POST]
customDomains:
- domain: auto
protocol: HTTP
routeConfigs:
- path: /tutor
serviceName: ai-tutor-service
functionName: tutor-function
部署命令:s deploy。部署后得到的HTTP触发器URL即为智能体API入口。客户端将用户输入POST到/tutor即可获得AI教师回复。
5. 扩展语音交互
在真实场景中,学生通常发送语音。您可以增加如下流程:
- 客户端将语音文件上传至OSS,并将
object_url发送给FC。 - FC调用百炼的语音识别能力(或使用阿里云智能语音交互服务)将音频转为文本。
- 文本进入上述大模型对话流程。
- 模型返回的文本再调用语音合成服务生成音频,并将URL返回给客户端。
该设计使智能体同时具备“听、说、评”能力,而无需修改核心对话逻辑。
注意事项
- 超时设置:函数计算HTTP触发默认超时时间为10秒,大模型推理有时较慢。建议将函数超时时间设置为60秒以上,或使用异步调用与回调机制。
- 密钥安全:API Key不能写在代码中,应使用环境变量或密钥管理服务KMS。如果使用Git仓库,务必忽略
.env文件。 - 成本控制:语言教学场景调用量大,可在百炼控制台设置限流,同时利用函数计算的按量付费和弹性伸缩。建议对
session_history定期清理,防止内存膨胀。 - 对话长度限制:大模型输入上下文有限,需设计历史截断策略。上述代码只保留最近10轮,避免超出模型上下文窗口。
- 数据合规:学生语音和聊天内容可能涉及个人信息,建议开启阿里云日志服务的审计功能,对敏感数据进行脱敏处理,并遵循当地的数据保护法规。
总结
本文以阿里云百炼和函数计算为核心,构建了一个可运行的AI语言教学智能体。通过函数计算解决服务弹性问题,依靠百炼大模型提供教学对话能力,再结合简单提示词工程实现教师角色。示例代码不仅展示了完整的文本对话流程,也预留了语音交互的扩展接口。开发者可在此基础上对接语音识别/合成、知识库、学习进度存储等,快速形成一个生产可用的智能语言教学产品。
这种Serverless + 大模型的组合,使开发者无需关注底层运维,即可将精力集中在教学体验优化上。未来若引入RAG技术存储学习资料,或使用强化学习优化纠错策略,智能体的教学效果还能进一步提升。