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
« 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
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)
14 class Meta:
15 ordering = ['-updated_at']
16 verbose_name = '聊天会话'
17 verbose_name_plural = '聊天会话'
19 def __str__(self):
20 return f"{self.user.username} - {self.title or 'Chat Session'}"
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 ]
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')
44 created_at = models.DateTimeField(auto_now_add=True)
46 class Meta:
47 ordering = ['-created_at']
48 verbose_name = '查询日志'
49 verbose_name_plural = '查询日志'
51 def __str__(self):
52 return f"{self.query_text[:50]}..."
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)
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 = '嵌入缓存'
71 def __str__(self):
72 return f"{self.content_type}:{self.content_id}"