Coverage for ai_integration/models.py: 100%

45 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-07-05 02:45 +0800

1from django.db import models 

2from django.contrib.auth.models import User 

3from pgvector.django import VectorField 

4 

5 

6class ChatSession(models.Model): 

7 """用户聊天会话记录""" 

8 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='chat_sessions') 

9 session_id = models.CharField(max_length=50, unique=True) 

10 title = models.CharField(max_length=200, blank=True) 

11 created_at = models.DateTimeField(auto_now_add=True) 

12 updated_at = models.DateTimeField(auto_now=True) 

13 

14 class Meta: 

15 ordering = ['-updated_at'] 

16 verbose_name = '聊天会话' 

17 verbose_name_plural = '聊天会话' 

18 

19 def __str__(self): 

20 return f"{self.user.username} - {self.title or 'Chat Session'}" 

21 

22 

23class QueryLog(models.Model): 

24 """AI查询日志""" 

25 QUERY_TYPES = [ 

26 ('memory_discovery', '记忆探索'), 

27 ('health_pattern', '健康模式'), 

28 ('event_planning', '事件规划'), 

29 ('cultural_heritage', '文化传承'), 

30 ('relationship_discovery', '关系发现'), 

31 ('general', '一般查询'), 

32 ] 

33 

34 session = models.ForeignKey(ChatSession, on_delete=models.CASCADE, related_name='queries') 

35 query_text = models.TextField() 

36 query_type = models.CharField(max_length=30, choices=QUERY_TYPES, default='general') 

37 response_text = models.TextField() 

38 sources_used = models.JSONField(default=list) # 使用的数据源 

39 confidence_score = models.FloatField(null=True, blank=True) 

40 processing_time = models.FloatField(null=True, blank=True) # 响应时间(秒) 

41 api_tokens_used = models.IntegerField(default=0) 

42 language = models.CharField(max_length=10, default='zh-CN') 

43 

44 created_at = models.DateTimeField(auto_now_add=True) 

45 

46 class Meta: 

47 ordering = ['-created_at'] 

48 verbose_name = '查询日志' 

49 verbose_name_plural = '查询日志' 

50 

51 def __str__(self): 

52 return f"{self.query_text[:50]}..." 

53 

54 

55class EmbeddingCache(models.Model): 

56 """嵌入向量缓存""" 

57 content_hash = models.CharField(max_length=64, unique=True) # 内容的SHA256哈希 

58 content_type = models.CharField(max_length=50) # 'story', 'event', 'heritage' etc. 

59 content_id = models.PositiveIntegerField() 

60 embedding = VectorField(dimensions=1536) # OpenAI text-embedding-3-small 

61 created_at = models.DateTimeField(auto_now_add=True) 

62 

63 class Meta: 

64 indexes = [ 

65 models.Index(fields=['content_type', 'content_id']), 

66 models.Index(fields=['content_hash']), 

67 ] 

68 verbose_name = '嵌入缓存' 

69 verbose_name_plural = '嵌入缓存' 

70 

71 def __str__(self): 

72 return f"{self.content_type}:{self.content_id}"