์ค์๊ฐ AI ์ฑ๋ด ์๋ฒ๋ก, Clean Architecture์ ๋ฉํฐ ๋ชจ๋ ์ํคํ ์ฒ๋ฅผ ์ ์ฉํ์ฌ WebSocket๊ณผ HTTP API๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ํต์ ํ๋ฉฐ LLM(Large Language Model)๊ณผ ๋ฒกํฐ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์๋ฅผ ์ฐ๋ํ๋ ์์คํ ์ ๋๋ค.
ProjectVG๋ ๊ฐ์ธํ๋ AI ์ด์์คํดํธ๋ฅผ ๊ตฌํํ ์ค์๊ฐ ์ฑ๋ด ์๋ฒ์ ๋๋ค. Clean Architecture ์์น์ ๋ฐ๋ผ ๋๋ฉ์ธ ์ค์ฌ์ ์ค๊ณ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ฌ์ฉ์์์ ๋ํ๋ฅผ ๊ธฐ์ตํ๊ณ , ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ ๋ง์ถคํ ์๋ต์ ์ ๊ณตํฉ๋๋ค.
- Clean Architecture: ๋๋ฉ์ธ ์ค์ฌ์ ๊ณ์ธตํ๋ ์ํคํ ์ฒ
- ๋ฉํฐ ๋ชจ๋ ๊ตฌ์กฐ: ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ํตํ ๋ชจ๋ํ
- ์ค์๊ฐ WebSocket ํต์ : ์๋ฐฉํฅ ์ค์๊ฐ ํต์
- ๋ฒกํฐ ๊ธฐ๋ฐ ์ฅ๊ธฐ ๊ธฐ์ต ์์คํ : ์๋ฏธ ๊ธฐ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
- ์ธ์ ๋ณ ๋ํ ๊ธฐ๋ก ๊ด๋ฆฌ: ๊ฐ์ธํ๋ ๋ํ ์ปจํ ์คํธ
- ๊ฐ์ธํ๋ AI ํ๋ฅด์๋ ์ง์: ์บ๋ฆญํฐ ๊ธฐ๋ฐ AI ์๋ต
Client โ WebSocket/HTTP API โ ProjectVG.Api โ ProjectVG.Application โ ProjectVG.Domain
โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ LLM API โ Memory API โ
โ (Port 5601) โ (Port 5602) โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Presentation Layer โ
โ ProjectVG.Api (Controllers, Middlewares) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Application Layer โ
โ ProjectVG.Application (Services, DTOs, Commands) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Domain Layer โ
โ ProjectVG.Domain (Entities, Enums, Common) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Infrastructure Layer โ
โ ProjectVG.Infrastructure (Repositories, External APIs) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Common Layer โ
โ ProjectVG.Common (Constants, Exceptions, Extensions) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ProjectVG/
โโโ ProjectVG.Api/ # ํ๋ ์ ํ
์ด์
๋ ์ด์ด
โ โโโ Controllers/ # API ์๋ํฌ์ธํธ
โ โ โโโ ChatController.cs # ์ฑํ
์์ฒญ ์ฒ๋ฆฌ
โ โ โโโ CharacterController.cs # ์บ๋ฆญํฐ ๊ด๋ฆฌ
โ โ โโโ HealthController.cs # ํฌ์ค์ฒดํฌ
โ โโโ Middlewares/ # ๋ฏธ๋ค์จ์ด
โ โ โโโ WebSocketMiddleware.cs # WebSocket ์ฒ๋ฆฌ
โ โโโ Models/ # API ๋ชจ๋ธ
โ โ โโโ Character/ # ์บ๋ฆญํฐ ๊ด๋ จ ๋ชจ๋ธ
โ โ โโโ Chat/ # ์ฑํ
๊ด๋ จ ๋ชจ๋ธ
โ โโโ Program.cs # ์ ํ๋ฆฌ์ผ์ด์
์ง์
์
โ
โโโ ProjectVG.Application/ # ์ ํ๋ฆฌ์ผ์ด์
๋ ์ด์ด
โ โโโ Services/ # ๋น์ฆ๋์ค ๋ก์ง ์๋น์ค
โ โ โโโ Chat/ # ์ฑํ
์๋น์ค
โ โ โโโ Character/ # ์บ๋ฆญํฐ ์๋น์ค
โ โ โโโ Conversation/ # ๋ํ ๊ด๋ฆฌ ์๋น์ค
โ โ โโโ LLM/ # LLM ์ฐ๋ ์๋น์ค
โ โ โโโ Session/ # ์ธ์
๊ด๋ฆฌ ์๋น์ค
โ โโโ Models/ # DTO ๋ฐ Command ๋ชจ๋ธ
โ โ โโโ Character/ # ์บ๋ฆญํฐ DTO/Command
โ โ โโโ Chat/ # ์ฑํ
DTO/Command
โ โ โโโ User/ # ์ฌ์ฉ์ DTO/Command
โ โโโ Middlewares/ # ์ ํ๋ฆฌ์ผ์ด์
๋ฏธ๋ค์จ์ด
โ โโโ DTOs/ # ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด
โ
โโโ ProjectVG.Domain/ # ๋๋ฉ์ธ ๋ ์ด์ด
โ โโโ Entities/ # ๋๋ฉ์ธ ์ํฐํฐ
โ โ โโโ Character/ # ์บ๋ฆญํฐ ์ํฐํฐ
โ โ โโโ Chat/ # ์ฑํ
์ํฐํฐ
โ โ โโโ ConversationHistory/ # ๋ํ ๊ธฐ๋ก ์ํฐํฐ
โ โ โโโ User/ # ์ฌ์ฉ์ ์ํฐํฐ
โ โโโ Enums/ # ๋๋ฉ์ธ ์ด๊ฑฐํ
โ โ โโโ ChatRole.cs # ์ฑํ
์ญํ ์ ์
โ โโโ Common/ # ๋๋ฉ์ธ ๊ณตํต ์์
โ โโโ BaseEntity.cs # ๊ธฐ๋ณธ ์ํฐํฐ ํด๋์ค
โ
โโโ ProjectVG.Infrastructure/ # ์ธํ๋ผ์คํธ๋ญ์ฒ ๋ ์ด์ด
โ โโโ ExternalApis/ # ์ธ๋ถ API ํด๋ผ์ด์ธํธ
โ โ โโโ LLM/ # LLM API ํด๋ผ์ด์ธํธ
โ โ โโโ MemoryClient/ # ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์ ํด๋ผ์ด์ธํธ
โ โโโ Repositories/ # ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต
โ โ โโโ InMemory/ # ์ธ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์ ๊ตฌํ
โ โ โโโ ICharacterRepository.cs # ์บ๋ฆญํฐ ์ ์ฅ์ ์ธํฐํ์ด์ค
โ โ โโโ IConversationRepository.cs # ๋ํ ์ ์ฅ์ ์ธํฐํ์ด์ค
โ โ โโโ ISessionRepository.cs # ์ธ์
์ ์ฅ์ ์ธํฐํ์ด์ค
โ โ โโโ IUserRepository.cs # ์ฌ์ฉ์ ์ ์ฅ์ ์ธํฐํ์ด์ค
โ โโโ Services/ # ์ธํ๋ผ ์๋น์ค
โ โโโ Session/ # ์ธ์
๊ด๋ จ ์๋น์ค
โ
โโโ ProjectVG.Common/ # ๊ณตํต ๋ ์ด์ด
โโโ Constants/ # ์์ ์ ์
โ โโโ AppConstants.cs # ์ ํ๋ฆฌ์ผ์ด์
์์
โ โโโ ErrorCodes.cs # ์๋ฌ ์ฝ๋
โ โโโ LLMSettings.cs # LLM ์ค์ ์์
โโโ Exceptions/ # ์ปค์คํ
์์ธ
โ โโโ ProjectVGException.cs # ๊ธฐ๋ณธ ์์ธ ํด๋์ค
โ โโโ NotFoundException.cs # ๋ฆฌ์์ค ์์ ์์ธ
โ โโโ ValidationException.cs # ๊ฒ์ฆ ์์ธ
โ โโโ ExternalServiceException.cs # ์ธ๋ถ ์๋น์ค ์์ธ
โโโ Extensions/ # ํ์ฅ ๋ฉ์๋
โ โโโ ExceptionExtensions.cs # ์์ธ ํ์ฅ ๋ฉ์๋
โโโ Configuration/ # ์ค์ ํด๋์ค
โโโ LLMSettings.cs # LLM ์ค์
- ์ญํ : HTTP API ์๋ํฌ์ธํธ์ WebSocket ์ฐ๊ฒฐ ์ฒ๋ฆฌ
- ์ฃผ์ ๊ตฌ์ฑ์์:
- Controllers: REST API ์๋ํฌ์ธํธ
- Middlewares: WebSocket ๋ฐ ์ธ์ฆ ๋ฏธ๋ค์จ์ด
- Models: API ์์ฒญ/์๋ต ๋ชจ๋ธ
- ์ญํ : ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ฐ ๋๋ฉ์ธ ์๋น์ค ์กฐ์จ
- ์ฃผ์ ๊ตฌ์ฑ์์:
- Services: ๋น์ฆ๋์ค ๋ก์ง ์๋น์ค
- Models: DTO, Command, Query ๋ชจ๋ธ
- Middlewares: ์ ํ๋ฆฌ์ผ์ด์ ๋ฏธ๋ค์จ์ด
- ์ญํ : ํต์ฌ ๋น์ฆ๋์ค ์ํฐํฐ์ ๋๋ฉ์ธ ๋ก์ง
- ์ฃผ์ ๊ตฌ์ฑ์์:
- Entities: ๋๋ฉ์ธ ์ํฐํฐ (Character, ChatMessage, User ๋ฑ)
- Enums: ๋๋ฉ์ธ ์ด๊ฑฐํ
- Common: ๊ณตํต ๋๋ฉ์ธ ์์
- ์ญํ : ์ธ๋ถ ์๋น์ค ์ฐ๋ ๋ฐ ๋ฐ์ดํฐ ์ ๊ทผ
- ์ฃผ์ ๊ตฌ์ฑ์์:
- ExternalApis: ์ธ๋ถ API ํด๋ผ์ด์ธํธ (LLM, Memory)
- Repositories: ๋ฐ์ดํฐ ์ ๊ทผ ๊ตฌํ์ฒด
- Services: ์ธํ๋ผ ์๋น์ค
- ์ญํ : ๋ชจ๋ ๋ ์ด์ด์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์์
- ์ฃผ์ ๊ตฌ์ฑ์์:
- Constants: ์ ํ๋ฆฌ์ผ์ด์ ์์
- Exceptions: ์ปค์คํ ์์ธ ํด๋์ค
- Extensions: ํ์ฅ ๋ฉ์๋
- Configuration: ์ค์ ํด๋์ค
- WebSocket์ ํตํ ์๋ฐฉํฅ ์ค์๊ฐ ํต์
- ์ธ์ ๊ธฐ๋ฐ ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋ฐ ์๋ ์ฌ์ฐ๊ฒฐ
- ๋น๋๊ธฐ ๋ฉ์์ง ์ฒ๋ฆฌ
- ์ธ์ ๋ณ ๋ํ ๊ธฐ๋ก ์ ์ฅ (์ต๋ 50๊ฐ ๋ฉ์์ง)
- ์๊ฐ์ ์ ๋ ฌ ๋ฐ ํจ์จ์ ์ธ ๊ฒ์
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์์ ์ ์ฅ
- ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋
- ์๋ฏธ ๊ธฐ๋ฐ ๊ด๋ จ ๊ธฐ์ต ๊ฒ์
- ๋ํ ๋ด์ฉ ์๋ ์ ์ฅ ๋ฐ ์ธ๋ฑ์ฑ
- ์ธ๋ถ LLM API์์ HTTP ํต์
- ์ปจํ ์คํธ ๊ธฐ๋ฐ ์๋ต ์์ฑ
- ํ ํฐ ์ฌ์ฉ๋ ์ถ์
- AI ํ๋ฅด์๋ ์ ์ ๋ฐ ๊ด๋ฆฌ
- ์บ๋ฆญํฐ๋ณ ๊ฐ์ฑ๊ณผ ๋ฐฐ๊ฒฝ ์ค์
- ๋์ ๋ฉํ๋ฐ์ดํฐ ์ง์
- ์ธ์ ์ฐ๊ฒฐ: WebSocket์ ํตํ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ
- ๋ฉ์์ง ์์ : HTTP POST๋ก ์ฑํ ์์ฒญ ์ฒ๋ฆฌ
- ์ปจํ
์คํธ ์์ง:
- ๋ฒกํฐ ๋ฉ๋ชจ๋ฆฌ์์ ๊ด๋ จ ๊ธฐ์ต ๊ฒ์
- ์ต๊ทผ ๋ํ ๊ธฐ๋ก ์กฐํ (์ต๋ 10๊ฐ)
- LLM ์์ฒญ: ์ปจํ ์คํธ์ ํจ๊ป ์ธ๋ถ LLM API ํธ์ถ
- ์๋ต ์์ฑ: LLM์ผ๋ก๋ถํฐ ์๋ต ์์ ๋ฐ ์ฒ๋ฆฌ
- ์ค์๊ฐ ์ ์ก: WebSocket์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ต ์ ์ก
- ๊ธฐ์ต ์ ์ฅ: ๋ํ ๋ด์ฉ์ ์ฅ๊ธฐ ๊ธฐ์ต์ ์ ์ฅ
- .NET 8.0: ๋ฐฑ์๋ ํ๋ ์์ํฌ
- ASP.NET Core: ์น API ๋ฐ WebSocket ์ง์
- Clean Architecture: ๋๋ฉ์ธ ์ค์ฌ ์ํคํ ์ฒ
- Dependency Injection: ์์กด์ฑ ์ฃผ์
- Windows Authentication: ์ธ์ฆ ์์คํ
- Swagger: API ๋ฌธ์ํ
- Docker: ์ปจํ ์ด๋ํ ์ง์
- .NET 8.0 SDK
- ์ธ๋ถ ์๋น์ค:
- LLM API ์๋ฒ (ํฌํธ 5601)
- ๋ฒกํฐ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์ (ํฌํธ 5602)
-
์ ์ฅ์ ํด๋ก
git clone [repository-url] cd ProjectVG
-
์์กด์ฑ ๋ณต์
dotnet restore
-
์ ํ๋ฆฌ์ผ์ด์ ์คํ
dotnet run --project ProjectVG.Api
-
Docker ์คํ (์ ํ์ฌํญ)
docker build -t projectvg-api . docker run -p 5000:5000 projectvg-api
ProjectVG.Api/appsettings.json
์์ ์ธ๋ถ ์๋น์ค URL ์ค์ :
{
"ExternalServices": {
"LLMApi": "http://localhost:5601",
"MemoryApi": "http://localhost:5602"
}
}
์ฑํ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์์ฒญ:
{
"session_id": "session_123",
"actor": "user",
"message": "์๋
ํ์ธ์",
"action": null
}
์๋ต:
{
"session_id": "session_123",
"response": "์๋ต ๋ฉ์์ง"
}
๋ชจ๋ ์บ๋ฆญํฐ๋ฅผ ์กฐํํฉ๋๋ค.
์๋ต:
[
{
"id": "guid",
"name": "์บ๋ฆญํฐ๋ช
",
"description": "์ค๋ช
",
"role": "์ญํ ",
"personality": "์ฑ๊ฒฉ",
"background": "๋ฐฐ๊ฒฝ",
"isActive": true,
"metadata": {}
}
]
์ ์บ๋ฆญํฐ๋ฅผ ์์ฑํฉ๋๋ค.
์์ฒญ:
{
"name": "์บ๋ฆญํฐ๋ช
",
"description": "์ค๋ช
",
"role": "์ญํ ",
"personality": "์ฑ๊ฒฉ",
"background": "๋ฐฐ๊ฒฝ",
"metadata": {}
}
์๋ฒ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
์๋ต:
{
"status": "ok",
"serverTime": "2024-01-01T00:00:00Z",
"message": "ProjectVG API is running."
}
์ค์๊ฐ ํต์ ์ ์ํ WebSocket ์ฐ๊ฒฐ
์ฐ๊ฒฐ ํ๋ผ๋ฏธํฐ:
sessionId
(์ ํ์ฌํญ): ๊ธฐ์กด ์ธ์ ID
์ฐ๊ฒฐ ์ ์๋ต:
{
"type": "session_id",
"session_id": "session_123"
}
์ฑํ ์์ฒญ์ ์ ์ฒด ์ฒ๋ฆฌ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ํต์ฌ ์๋น์ค์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ:
- ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ ๋ฐ ์ปจํ ์คํธ ์์ง
- LLM ์์ฒญ ์ฒ๋ฆฌ
- ๋ํ ๊ธฐ๋ก ์ ์ฅ
- ์ค์๊ฐ ์๋ต ์ ์ก
์บ๋ฆญํฐ ๊ด๋ฆฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ:
- ์บ๋ฆญํฐ CRUD ์์
- ์บ๋ฆญํฐ ๊ฒ์ฆ ๋ฐ ๋น์ฆ๋์ค ๊ท์น ์ ์ฉ
- ์บ๋ฆญํฐ ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ
WebSocket ์ธ์ ์ ๊ด๋ฆฌํ๋ ์๋น์ค์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ:
- ์ธ์ ๋ฑ๋ก/ํด์
- ํด๋ผ์ด์ธํธ๋ณ ๋ฉ์์ง ์ ์ก
- ์ฐ๊ฒฐ ์ํ ๋ชจ๋ํฐ๋ง
๋ํ ๊ธฐ๋ก์ ๊ด๋ฆฌํ๋ ์๋น์ค์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ:
- ์ธ์ ๋ณ ๋ํ ๊ธฐ๋ก ์ ์ฅ
- ์ต๊ทผ ๋ฉ์์ง ์กฐํ
- ๋ฉ์์ง ์ ์ ํ ๊ด๋ฆฌ
WebSocket ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ ๋ฏธ๋ค์จ์ด์ ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ:
- WebSocket ์์ฒญ ๊ฒ์ฆ
- ์ธ์ ID ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ์ฐ๊ฒฐ ์ ์ง ๋ฐ ์ ๋ฆฌ
๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ์ง๋ฌธ์ด ์์ผ์๋ฉด ์ด์ ํ์ด์ง๋ฅผ ํตํด ๋ฌธ์ํด ์ฃผ์ธ์.