File size: 3,278 Bytes
f6b05db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
API ์š”์ฒญ/์‘๋‹ต ๋ชจ๋ธ ์ •์˜ (Pydantic)
"""

from pydantic import BaseModel, Field
from typing import List, Dict, Optional, Any


class QueryRequest(BaseModel):
    """์งˆ๋ฌธ ์š”์ฒญ ๋ชจ๋ธ"""
    question: str = Field(..., description="์‚ฌ์šฉ์ž ์งˆ๋ฌธ")
    top_k: int = Field(default=5, ge=1, le=20, description="๊ฒ€์ƒ‰ํ•  ๋ฌธ์„œ ๊ฐœ์ˆ˜")
    enable_metacognition: bool = Field(default=True, description="๋ฉ”ํƒ€์ธ์ง€ ๊ณผ์ • ํ™œ์„ฑํ™” ์—ฌ๋ถ€")
    filter_metadata: Optional[Dict[str, str]] = Field(default=None, description="๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„ํ„ฐ")

    class Config:
        json_schema_extra = {
            "example": {
                "question": "๊ธˆ์œต์œ„๊ธฐ์˜ ์ฃผ์š” ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?",
                "top_k": 5,
                "enable_metacognition": True
            }
        }


class SourceDocument(BaseModel):
    """์ถœ์ฒ˜ ๋ฌธ์„œ ๋ชจ๋ธ"""
    text: str = Field(..., description="๋ฌธ์„œ ํ…์ŠคํŠธ")
    source_filename: str = Field(..., description="์ถœ์ฒ˜ ํŒŒ์ผ๋ช…")
    similarity: float = Field(..., description="์œ ์‚ฌ๋„ ์ ์ˆ˜")
    metadata: Dict[str, Any] = Field(default_factory=dict, description="๋ฌธ์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ")


class MetaCognitionInfo(BaseModel):
    """๋ฉ”ํƒ€์ธ์ง€ ์ •๋ณด ๋ชจ๋ธ"""
    thinking_history: List[Dict[str, Any]] = Field(..., description="์‚ฌ๊ณ  ๊ณผ์ • ํžˆ์Šคํ† ๋ฆฌ")
    iterations: int = Field(..., description="๊ฐœ์„  ๋ฐ˜๋ณต ํšŸ์ˆ˜")


class SearchStats(BaseModel):
    """๊ฒ€์ƒ‰ ํ†ต๊ณ„ ๋ชจ๋ธ"""
    documents_found: int = Field(..., description="๋ฐœ๊ฒฌ๋œ ๋ฌธ์„œ ์ˆ˜")
    top_similarity: float = Field(..., description="์ตœ๊ณ  ์œ ์‚ฌ๋„ ์ ์ˆ˜")


class QueryResponse(BaseModel):
    """์งˆ๋ฌธ ์‘๋‹ต ๋ชจ๋ธ"""
    question: str = Field(..., description="์›๋ณธ ์งˆ๋ฌธ")
    answer: str = Field(..., description="์ƒ์„ฑ๋œ ๋‹ต๋ณ€")
    sources: List[SourceDocument] = Field(..., description="์ฐธ๊ณ ํ•œ ์ถœ์ฒ˜ ๋ฌธ์„œ๋“ค")
    metacognition: Optional[MetaCognitionInfo] = Field(default=None, description="๋ฉ”ํƒ€์ธ์ง€ ์ •๋ณด")
    search_stats: SearchStats = Field(..., description="๊ฒ€์ƒ‰ ํ†ต๊ณ„")

    class Config:
        json_schema_extra = {
            "example": {
                "question": "๊ธˆ์œต์œ„๊ธฐ์˜ ์ฃผ์š” ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?",
                "answer": "2008๋…„ ๊ธˆ์œต์œ„๊ธฐ์˜ ์ฃผ์š” ์›์ธ์€...",
                "sources": [
                    {
                        "text": "๋…ผ๋ฌธ ๋‚ด์šฉ...",
                        "source_filename": "financial_crisis_2008.pdf",
                        "similarity": 0.89,
                        "metadata": {"author": "John Doe"}
                    }
                ],
                "search_stats": {
                    "documents_found": 5,
                    "top_similarity": 0.89
                }
            }
        }


class HealthResponse(BaseModel):
    """ํ—ฌ์Šค ์ฒดํฌ ์‘๋‹ต"""
    status: str = Field(..., description="์„œ๋ฒ„ ์ƒํƒœ")
    vector_store: Dict[str, Any] = Field(..., description="๋ฒกํ„ฐ ์Šคํ† ์–ด ์ •๋ณด")
    embedding_model: Dict[str, Any] = Field(..., description="์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์ •๋ณด")


class ErrorResponse(BaseModel):
    """์—๋Ÿฌ ์‘๋‹ต"""
    error: str = Field(..., description="์—๋Ÿฌ ๋ฉ”์‹œ์ง€")
    detail: Optional[str] = Field(default=None, description="์ƒ์„ธ ์ •๋ณด")