first commit

This commit is contained in:
zhaojie
2025-09-06 21:06:18 +08:00
commit 8083f136c9
94 changed files with 20559 additions and 0 deletions

View File

@@ -0,0 +1,276 @@
import logging
from typing import Dict, List, Optional, Any
from datetime import datetime
import json
from ..core.database import db_manager
from ..core.models import WorkOrder, Conversation
from ..core.llm_client import QwenClient
from ..knowledge_base.knowledge_manager import KnowledgeManager
from ..vehicle.vehicle_data_manager import VehicleDataManager
logger = logging.getLogger(__name__)
class DialogueManager:
"""对话管理器"""
def __init__(self):
self.llm_client = QwenClient()
self.knowledge_manager = KnowledgeManager()
self.vehicle_manager = VehicleDataManager()
self.conversation_history = {} # 存储对话历史
def process_user_message(
self,
user_message: str,
work_order_id: Optional[int] = None,
user_id: Optional[str] = None,
vehicle_id: Optional[str] = None
) -> Dict[str, Any]:
"""处理用户消息"""
try:
# 搜索相关知识库(只搜索已验证的)
knowledge_results = self.knowledge_manager.search_knowledge(
user_message, top_k=3, verified_only=True
)
# 获取车辆实时数据
vehicle_data = None
if vehicle_id:
vehicle_data = self.vehicle_manager.get_latest_vehicle_data(vehicle_id)
# 构建上下文
context = self._build_context(work_order_id, user_id)
# 准备知识库信息
knowledge_context = ""
if knowledge_results:
knowledge_context = "相关知识库信息:\n"
for i, result in enumerate(knowledge_results[:2], 1):
knowledge_context += f"{i}. 问题: {result['question']}\n"
knowledge_context += f" 答案: {result['answer']}\n"
knowledge_context += f" 置信度: {result['confidence_score']:.2f}\n\n"
# 准备车辆数据信息
vehicle_context = ""
if vehicle_data:
vehicle_context = "车辆实时数据:\n"
for data_type, data_info in vehicle_data.items():
vehicle_context += f"- {data_type}: {json.dumps(data_info['value'], ensure_ascii=False)}\n"
vehicle_context += f" 更新时间: {data_info['timestamp']}\n"
vehicle_context += "\n"
# 生成回复
response_result = self.llm_client.generate_response(
user_message=user_message,
context=context,
knowledge_base=[knowledge_context] if knowledge_context else None,
vehicle_data=[vehicle_context] if vehicle_context else None
)
if "error" in response_result:
return response_result
# 保存对话记录
conversation_id = self._save_conversation(
work_order_id=work_order_id,
user_message=user_message,
assistant_response=response_result["response"],
knowledge_used=json.dumps([r["id"] for r in knowledge_results], ensure_ascii=False)
)
# 更新对话历史
if user_id:
if user_id not in self.conversation_history:
self.conversation_history[user_id] = []
self.conversation_history[user_id].append({
"role": "user",
"content": user_message,
"timestamp": datetime.now().isoformat()
})
self.conversation_history[user_id].append({
"role": "assistant",
"content": response_result["response"],
"timestamp": datetime.now().isoformat()
})
# 保持历史记录在限制范围内
if len(self.conversation_history[user_id]) > 20: # 10轮对话
self.conversation_history[user_id] = self.conversation_history[user_id][-20:]
return {
"response": response_result["response"],
"conversation_id": conversation_id,
"knowledge_used": knowledge_results,
"confidence_score": self._calculate_confidence(knowledge_results),
"timestamp": datetime.now().isoformat()
}
except Exception as e:
logger.error(f"处理用户消息失败: {e}")
return {"error": f"处理失败: {str(e)}"}
def _build_context(self, work_order_id: Optional[int], user_id: Optional[str]) -> str:
"""构建对话上下文"""
context_parts = []
# 添加工单信息
if work_order_id:
try:
with db_manager.get_session() as session:
work_order = session.query(WorkOrder).filter(
WorkOrder.id == work_order_id
).first()
if work_order:
context_parts.append(f"当前工单信息:")
context_parts.append(f"工单号: {work_order.order_id}")
context_parts.append(f"标题: {work_order.title}")
context_parts.append(f"描述: {work_order.description}")
context_parts.append(f"类别: {work_order.category}")
context_parts.append(f"优先级: {work_order.priority}")
context_parts.append(f"状态: {work_order.status}")
except Exception as e:
logger.error(f"获取工单信息失败: {e}")
# 添加用户历史对话
if user_id and user_id in self.conversation_history:
recent_history = self.conversation_history[user_id][-6:] # 最近3轮对话
if recent_history:
context_parts.append("最近的对话历史:")
for msg in recent_history:
role = "用户" if msg["role"] == "user" else "助手"
context_parts.append(f"{role}: {msg['content']}")
return "\n".join(context_parts) if context_parts else ""
def _save_conversation(
self,
work_order_id: Optional[int],
user_message: str,
assistant_response: str,
knowledge_used: str
) -> int:
"""保存对话记录"""
try:
with db_manager.get_session() as session:
conversation = Conversation(
work_order_id=work_order_id,
user_message=user_message,
assistant_response=assistant_response,
knowledge_used=knowledge_used,
timestamp=datetime.now()
)
session.add(conversation)
session.commit()
return conversation.id
except Exception as e:
logger.error(f"保存对话记录失败: {e}")
return 0
def _calculate_confidence(self, knowledge_results: List[Dict[str, Any]]) -> float:
"""计算回复置信度"""
if not knowledge_results:
return 0.5 # 默认置信度
# 基于知识库匹配度和置信度计算
max_similarity = max(result.get("similarity_score", 0) for result in knowledge_results)
avg_confidence = sum(result.get("confidence_score", 0) for result in knowledge_results) / len(knowledge_results)
# 综合评分
confidence = (max_similarity * 0.6 + avg_confidence * 0.4)
return min(confidence, 1.0)
def create_work_order(
self,
title: str,
description: str,
category: str,
priority: str = "medium"
) -> Dict[str, Any]:
"""创建工单"""
try:
with db_manager.get_session() as session:
work_order = WorkOrder(
order_id=f"WO{datetime.now().strftime('%Y%m%d%H%M%S')}",
title=title,
description=description,
category=category,
priority=priority,
status="open",
created_at=datetime.now()
)
session.add(work_order)
session.commit()
logger.info(f"创建工单成功: {work_order.order_id}")
return {
"work_order_id": work_order.id,
"order_id": work_order.order_id,
"status": "success"
}
except Exception as e:
logger.error(f"创建工单失败: {e}")
return {"error": f"创建失败: {str(e)}"}
def update_work_order(
self,
work_order_id: int,
status: Optional[str] = None,
resolution: Optional[str] = None,
satisfaction_score: Optional[float] = None
) -> bool:
"""更新工单"""
try:
with db_manager.get_session() as session:
work_order = session.query(WorkOrder).filter(
WorkOrder.id == work_order_id
).first()
if not work_order:
return False
if status:
work_order.status = status
if resolution:
work_order.resolution = resolution
if satisfaction_score is not None:
work_order.satisfaction_score = satisfaction_score
work_order.updated_at = datetime.now()
session.commit()
# 如果工单已解决,学习知识
if status == "resolved" and resolution:
self.knowledge_manager.learn_from_work_order(work_order_id)
logger.info(f"更新工单成功: {work_order_id}")
return True
except Exception as e:
logger.error(f"更新工单失败: {e}")
return False
def get_conversation_history(self, work_order_id: int) -> List[Dict[str, Any]]:
"""获取工单对话历史"""
try:
with db_manager.get_session() as session:
conversations = session.query(Conversation).filter(
Conversation.work_order_id == work_order_id
).order_by(Conversation.timestamp).all()
return [
{
"id": conv.id,
"user_message": conv.user_message,
"assistant_response": conv.assistant_response,
"timestamp": conv.timestamp.isoformat(),
"confidence_score": conv.confidence_score
}
for conv in conversations
]
except Exception as e:
logger.error(f"获取对话历史失败: {e}")
return []