MBE 多语言训练与交互处理方案
概述
本文档说明 MBE 系统在训练和用户交互时如何处理多语言场景。
一、训练时的多语言处理
1.1 当前实现
MBE 系统在训练时已经支持多语言:
多语言文本编码器
训练时使用 paraphrase-multilingual-MiniLM-L12-v2 模型:
# training/titans_expert_trainer.py
from sentence_transformers import SentenceTransformer
text_encoder = SentenceTransformer(
'paraphrase-multilingual-MiniLM-L12-v2', # 多语言模型
device=str(self.device)
)
支持的语言:
- 中文(简体/繁体)
- 英语
- 日语
- 韩语
- 法语
- 德语
- 西班牙语
- 俄语
- 阿拉伯语
- 等 50+ 种语言
训练数据处理流程
# 1. 加载多语言训练数据
qa_pairs = [
ExpertQAPair(question="什么是面包?", answer="面包是..."), # 中文
ExpertQAPair(question="What is bread?", answer="Bread is..."), # 英文
ExpertQAPair(question="パンとは?", answer="パンは..."), # 日文
]
# 2. 使用多语言编码器转换为嵌入向量
embeddings = text_encoder.encode(texts) # 自动处理多语言
# 3. 训练模型(模型本身语言无关)
model.train(embeddings, labels)
1.2 多语言训练数据准备
方法 1: 混合多语言数据
# 训练数据可以包含多种语言
training_data = [
{"question": "什么是面包?", "answer": "面包是...", "language": "zh-CN"},
{"question": "What is bread?", "answer": "Bread is...", "language": "en"},
{"question": "パンとは?", "answer": "パンは...", "language": "ja"},
]
方法 2: 翻译增强数据
# 使用翻译服务将单语言数据扩展为多语言
from shared.src.chat.translation import get_translation_service
translator = get_translation_service()
# 原始中文数据
chinese_data = [{"question": "什么是面包?", "answer": "面包是..."}]
# 翻译为其他语言
for lang in ["en", "ja", "ko"]:
translated_q = await translator.translate(chinese_data[0]["question"], lang)
translated_a = await translator.translate(chinese_data[0]["answer"], lang)
training_data.append({
"question": translated_q["translated_text"],
"answer": translated_a["translated_text"],
"language": lang
})
1.3 训练最佳实践
- 数据平衡:确保各语言数据量相对平衡
- 质量优先:优先使用高质量的原生语言数据,而非翻译数据
- 语言标记:在训练数据中保留语言标记,便于后续分析
- 验证集:为每种语言准备独立的验证集
二、用户交互时的多语言处理
2.1 当前实现
翻译服务 (TranslationService)
系统已实现翻译服务,支持:
from shared.src.chat.translation import get_translation_service
translator = get_translation_service()
# 1. 语言检测
detected_lang = await translator.detect_language("Hello, how are you?")
# 返回: "en"
# 2. 文本翻译
result = await translator.translate(
text="Hello, how are you?",
target_language="zh-CN",
source_language="en"
)
# 返回: {"translated_text": "你好,你好吗?", ...}
# 3. 自动翻译(根据用户偏好)
translated = await translator.auto_translate_for_user(
message={"content": "Hello"},
user_preferred_language="zh-CN"
)
翻译专家 (TranslationExpert)
系统包含专门的翻译专家,可以处理翻译任务。
2.2 改进方案:集成到引擎流程
方案 A: 前置语言检测和翻译
在引擎处理前检测用户语言,统一转换为系统默认语言:
# src/core/engine.py (改进建议)
async def process(
self,
user_input: str,
device_id: str,
user_id: Optional[str] = None,
user_language: Optional[str] = None # 新增:用户偏好语言
) -> MisesAnalyzeResult:
"""处理用户输入"""
# 1. 检测用户输入语言
from shared.src.chat.translation import get_translation_service
translator = get_translation_service()
detected_lang = await translator.detect_language(user_input)
# 2. 如果用户指定了偏好语言,且输入语言不同,则翻译
if user_language and detected_lang != user_language:
# 翻译用户输入到偏好语言
translated = await translator.translate(
user_input,
target_language=user_language,
source_language=detected_lang
)
user_input = translated["translated_text"]
logger.info(f"Translated input from {detected_lang} to {user_language}")
# 3. 继续正常处理流程
result = await self._process_stage(...)
# 4. 如果用户偏好语言不是系统默认语言,翻译回复
if user_language and user_language != "zh-CN":
result.answer = await translator.translate(
result.answer,
target_language=user_language,
source_language="zh-CN"
)["translated_text"]
return result
方案 B: 多语言原生处理(推荐)
保持用户输入语言,让模型直接处理多语言:
# src/core/engine.py (改进建议)
async def process(
self,
user_input: str,
device_id: str,
user_id: Optional[str] = None,
user_language: Optional[str] = None
) -> MisesAnalyzeResult:
"""处理用户输入(多语言原生支持)"""
# 1. 检测语言(用于日志和统计)
from shared.src.chat.translation import get_translation_service
translator = get_translation_service()
detected_lang = await translator.detect_language(user_input)
# 2. 在上下文中添加语言信息
context = {
"user_language": detected_lang,
"user_preferred_language": user_language or detected_lang
}
# 3. 使用多语言编码器处理(模型本身支持多语言)
# 由于使用了 paraphrase-multilingual-MiniLM-L12-v2,
# 模型可以直接理解多语言输入
# 4. 处理流程(语言无关)
result = await self._process_stage(
session=session,
user_input=user_input, # 保持原始语言
profile=profile,
context=context
)
# 5. 如果用户指定了偏好语言,且回复语言不同,则翻译回复
if user_language and detected_lang != user_language:
result.answer = await translator.translate(
result.answer,
target_language=user_language,
source_language=detected_lang
)["translated_text"]
return result
2.3 用户语言偏好管理
存储用户语言偏好
# 在用户画像中存储语言偏好
class UserProfile:
preferred_language: str = "zh-CN" # 默认中文
detected_languages: List[str] = [] # 历史检测到的语言
API 支持语言参数
# src/mcp/server.py
class AnalyzeRequest(BaseModel):
user_input: str
device_id: str
user_id: Optional[str] = None
preferred_language: Optional[str] = None # 新增:用户偏好语言
auto_detect: bool = True # 是否自动检测语言
2.4 专家路由的多语言支持
专家路由系统已经使用多语言编码器,可以处理多语言查询:
# src/knowledge/expert_router.py
# 专家路由使用相同的多语言编码器
# 因此可以匹配多语言查询到专家
expert_router.route_and_answer(
query="What is bread?", # 英文查询
context={"language": "en"}
)
# 可以匹配到中文训练的专家(因为嵌入空间是共享的)
三、实施建议
3.1 短期改进(立即实施)
在引擎入口添加语言检测
# 在 engine.process() 开始时检测语言 detected_lang = await translator.detect_language(user_input) logger.info(f"User input language: {detected_lang}")添加用户语言偏好参数
# API 请求中添加 preferred_language 参数 # 用户画像中存储语言偏好翻译回复(如果需要)
# 如果用户偏好语言与回复语言不同,翻译回复
3.2 中期改进(1-2周)
完善语言检测和翻译集成
- 在专家路由中考虑语言
- 在知识库检索中支持多语言
- 优化翻译质量
多语言训练数据增强
- 为现有专家添加多语言训练数据
- 使用翻译服务扩展训练集
性能优化
- 缓存语言检测结果
- 批量翻译优化
3.3 长期改进(1个月+)
多语言知识库
- 支持多语言知识库存储
- 跨语言知识检索
语言特定优化
- 为不同语言优化提示词
- 语言特定的专家
用户语言学习
- 记录用户语言使用模式
- 自动适应语言偏好
四、代码示例
4.1 训练多语言专家
# scripts/train_multilingual_expert.py
from training.titans_expert_trainer import ExpertTrainer, ExpertTrainingConfig
from shared.src.chat.translation import get_translation_service
async def train_multilingual_expert():
# 1. 准备多语言训练数据
qa_pairs = []
# 中文数据
qa_pairs.extend([
ExpertQAPair(question="什么是面包?", answer="面包是..."),
ExpertQAPair(question="如何制作面包?", answer="制作面包需要..."),
])
# 英文数据
qa_pairs.extend([
ExpertQAPair(question="What is bread?", answer="Bread is..."),
ExpertQAPair(question="How to make bread?", answer="To make bread..."),
])
# 2. 训练(使用多语言编码器)
config = ExpertTrainingConfig(
expert_id="bread_master_multilingual",
expert_name="面包大师(多语言)",
kb_id="bread_kb",
epochs=100
)
trainer = ExpertTrainer(config)
await trainer.train(qa_pairs)
print("✅ 多语言专家训练完成")
4.2 多语言用户交互
# src/api/multilingual_chat.py
from fastapi import APIRouter
from shared.src.chat.translation import get_translation_service
from src.core.engine import get_engine
router = APIRouter()
@router.post("/chat")
async def multilingual_chat(
user_input: str,
user_id: str,
preferred_language: Optional[str] = None
):
"""多语言聊天接口"""
translator = get_translation_service()
engine = get_engine()
# 1. 检测用户输入语言
detected_lang = await translator.detect_language(user_input)
# 2. 获取用户偏好语言(从用户画像或参数)
if not preferred_language:
# 从用户画像获取
profile = await get_user_profile(user_id)
preferred_language = profile.preferred_language or detected_lang
# 3. 处理(保持原始语言,模型支持多语言)
result = await engine.process(
user_input=user_input,
device_id=user_id,
user_id=user_id
)
# 4. 如果用户偏好语言不同,翻译回复
if preferred_language != detected_lang:
translated = await translator.translate(
result.answer,
target_language=preferred_language,
source_language=detected_lang
)
result.answer = translated["translated_text"]
return {
"answer": result.answer,
"detected_language": detected_lang,
"preferred_language": preferred_language
}
五、测试建议
5.1 训练测试
# tests/test_multilingual_training.py
def test_multilingual_training():
"""测试多语言训练"""
# 1. 准备多语言数据
# 2. 训练模型
# 3. 测试各语言查询
# 4. 验证回答质量
pass
5.2 交互测试
# tests/test_multilingual_interaction.py
async def test_multilingual_chat():
"""测试多语言交互"""
# 1. 发送中文查询
# 2. 发送英文查询
# 3. 发送日文查询
# 4. 验证语言检测
# 5. 验证翻译质量
pass
六、总结
当前状态
✅ 已实现:
- 多语言文本编码器(训练时)
- 翻译服务(
TranslationService) - 翻译专家(
TranslationExpert) - 语言检测功能
⚠️ 待改进:
- 引擎流程中未集成语言检测和翻译
- 用户语言偏好未存储和使用
- API 未支持语言参数
推荐方案
方案 B(多语言原生处理):
- 保持用户输入原始语言
- 利用多语言编码器的能力直接处理
- 仅在用户明确要求时翻译回复
- 记录语言偏好供后续使用
这样既保持了多语言的灵活性,又避免了不必要的翻译开销。