Semantic Kernel + Ollama ๊ธฐ๋ฐ์ ์์ ๋ฌด๋ฃ MES ์ ์ฉ ์ฑ๋ด ์์คํ ์ ๋๋ค.
์ด ํ๋ก์ ํธ๋ ์ ์กฐ์คํ์์คํ (MES)์ ์ํ AI ์ฑ๋ด์ผ๋ก, ์์ฐ์ด๋ฅผ ํตํด ์์ฐ์ค์ , ํ์ง๊ด๋ฆฌ, ์ฌ๊ณ ํํฉ ๋ฑ์ ์กฐํํ ์ ์์ต๋๋ค.
- ์์ ๋ฌด๋ฃ: Ollama ๋ก์ปฌ LLM ์ฌ์ฉ์ผ๋ก API ๋น์ฉ ์์
- ๋ฉํฐํ ๋ํธ: ์ฌ๋ฌ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์
- ํ๊ตญ์ด ์ต์ ํ: ์์ฐ์ค๋ฌ์ด ํ๊ตญ์ด ๋ํ ์ง์
- ํ ์ค ์คํ์ผ UI: ์ง๊ด์ ์ด๊ณ ํ๋์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค
- DevExpress ํตํฉ: ๊ธฐ์กด MES ์์คํ ๊ณผ ์๋ฒฝ ํธํ
MESChatBot/
โโโ MESChatBot.Core/ # ํต์ฌ AI ๋ฐ ๋น์ฆ๋์ค ๋ก์ง
โ โโโ Services/ # ์ฑ๋ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค, Ollama ์๋น์ค
โ โโโ Functions/ # Semantic Kernel ํจ์๋ค
โ โโโ Models/ # ๋ฐ์ดํฐ ๋ชจ๋ธ
โ โโโ Configuration/ # ์ค์ ํด๋์ค
โโโ MESChatBot.UI/ # DevExpress ๊ธฐ๋ฐ UI ์ปดํฌ๋ํธ
โ โโโ Controls/ # ์ฑ๋ด ์ปจํธ๋กค
โ โโโ Forms/ # ์ค์ ๋ฐ ์ด๋ ฅ ํผ
โโโ MESChatBot.Demo/ # ๋
๋ฆฝ ์คํ ํ
์คํธ ์ฑ
โโโ Forms/ # ๋ฉ์ธ ํผ
- .NET 8.0: ์ต์ .NET ํ๋ซํผ
- Semantic Kernel: Microsoft AI ์ค์ผ์คํธ๋ ์ด์ ํ๋ ์์ํฌ
- Ollama: ๋ก์ปฌ LLM ์๋ฒ
- DevExpress WinForms: ํ๋กํ์ ๋ UI ์ปดํฌ๋ํธ
- SQL Server: ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Serilog: ๊ตฌ์กฐํ๋ ๋ก๊น
# Windows์์ Ollama ์ค์น # https://ollama.ai/download์์ ๋ค์ด๋ก๋ ํ ์ค์น # ๋ชจ๋ธ ๋ค์ด๋ก๋ ollama pull llama3.1:8b
- .NET 8.0 SDK ๋ค์ด๋ก๋ ๋ฐ ์ค์น
# ์ ์ฅ์ ํด๋ก git clone <repository-url> cd MESChatBot # ํจํค์ง ๋ณต์ ๋ฐ ๋น๋ dotnet restore dotnet build
MESChatBot.Demo/appsettings.json ํ์ผ์ ํ๊ฒฝ์ ๋ง๊ฒ ์์ :
{
"ChatbotConfig": {
"OllamaEndpoint": "http://localhost:11434",
"ModelName": "llama3.1:8b",
"MaxTokens": 2048,
"Temperature": 0.7,
"TimeoutSeconds": 30
},
"DatabaseConfig": {
"ServerUrl": "your-sql-server,port",
"UserId": "your-username",
"Password": "your-password",
"Companies": [
{
"Name": "COMPANY_DB_NAME",
"DisplayName": "ํ์ฌ ํ์๋ช
",
"IsActive": true
}
]
}
}# ๋ฐ๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์คํ cd MESChatBot.Demo dotnet run
์ฌ์ฉ์: "์ค๋ ์์ฐ์ค์ ์๋ ค์ค"
์ฑ๋ด: ๐ 2024๋
08์ 22์ผ ์์ฐ์ค์
๐น ์ ํA: 150๊ฐ (์์
์ง์ 3๊ฑด)
๐น ์ ํB: 200๊ฐ (์์
์ง์ 2๊ฑด)
์ฌ์ฉ์: "ํ์ง ํํฉ์?"
์ฑ๋ด: ๐ 2024๋
08์ 22์ผ ํ์ง ๊ฒ์ฌ ๊ฒฐ๊ณผ
โ
์ ํA: ํฉ๊ฒฉ๋ฅ 98.5%
โ ๏ธ ์ ํB: ํฉ๊ฒฉ๋ฅ 95.2%
์ฌ์ฉ์: "์ฌ๊ณ ๋ถ์กฑํ ์ ํ ์์ด?"
์ฑ๋ด: ๐จ ์ฌ๊ณ ๋ถ์กฑ ์ ํ (2๊ฑด)
๐ฅ ์ ํC: ํ์ฌ๊ณ 0๊ฐ / ์์ ์ฌ๊ณ 50๊ฐ
โ ๏ธ ์ ํD: ํ์ฌ๊ณ 10๊ฐ / ์์ ์ฌ๊ณ 30๊ฐ
- ์ผ๋ณ/๊ธฐ๊ฐ๋ณ ์์ฐ์ค์ ์กฐํ
- ์์ฐ ๊ณํ ๋๋น ์ค์ ๋ถ์
- ์งํ ์ค์ธ ์์ ์ง์ ํํฉ
- ํ์ง ๊ฒ์ฌ ๊ฒฐ๊ณผ ์กฐํ
- ๋ถ๋ ์ ํ๋ณ ๋ถ์
- ํ์ง ๋ชฉํ ๋๋น ์ฑ๊ณผ
- ์ฌ๊ณ ํํฉ ์กฐํ
- ์ฌ๊ณ ๋ถ์กฑ ์ ํ ์๋ฆผ
- ์ ์ถ๊ณ ๋ด์ญ ์กฐํ
- ์ ์ฒด๋ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
- ์ค์๊ฐ ์ ์ฒด ๋ณ๊ฒฝ
- ์ ์ฒด๋ณ ์ค์ ๊ด๋ฆฌ
[KernelFunction, Description("์๋ก์ด ๊ธฐ๋ฅ ์ค๋ช ")] public async Task<string> NewFunction( [Description("๋งค๊ฐ๋ณ์ ์ค๋ช ")] string parameter) { // ๊ตฌํ return result; }
appsettings.json์ Companies ๋ฐฐ์ด์ ์ ์
์ฒด ์ถ๊ฐ:
{
"Name": "NEW_COMPANY_DB",
"DisplayName": "์ ์
์ฒด๋ช
",
"IsActive": true
}ChatbotControl.cs: ๋ฉ์ธ ์ฑํ ์ธํฐํ์ด์คApplyTossStyle()๋ฉ์๋์์ ์คํ์ผ ์์ - ํ ์ค ์ปฌ๋ฌ ํ๋ ํธ ์ฌ์ฉ ๊ถ์ฅ
- ์ฝ์ ๋ก๊ทธ: ์ค์๊ฐ ์ถ๋ ฅ
- ํ์ผ ๋ก๊ทธ:
logs/chatbot-yyyy-MM-dd.log - ๋ณด๊ด ์ ์ฑ : 7์ผ๊ฐ ๋ณด๊ด
- Information: ์ผ๋ฐ ์ ๋ณด
- Warning: ๊ฒฝ๊ณ (์ฐ๊ฒฐ ์คํจ ๋ฑ)
- Error: ์ค๋ฅ (์ฟผ๋ฆฌ ์คํจ ๋ฑ)
- Fatal: ์น๋ช ์ ์ค๋ฅ
- ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ๋ง ํ์ฉ
- ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ ์ฌ์ฉ
- SQL Injection ๋ฐฉ์ง
- ์ ๋ขฐํ ์ ์๋ ์๋ฒ ์ฐ๊ฒฐ๋ง ํ์ฉ
- ์ํธํ๋ ์ฐ๊ฒฐ ์ฌ์ฉ ๊ถ์ฅ
- ์ ๊ทผ ๊ถํ ์ต์ํ
# Ollama ์๋น์ค ์ํ ํ์ธ curl http://localhost:11434/api/tags # Ollama ์ฌ์์ ollama serve
- ์๋ฒ URL ๋ฐ ํฌํธ ํ์ธ
- ์ธ์ฆ ์ ๋ณด ํ์ธ
- ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ
- DevExpress ๋ผ์ด์ ์ค ์ ํจ์ฑ ํ์ธ
- DLL ๊ฒฝ๋ก ํ์ธ
- ๋ฒ์ ํธํ์ฑ ํ์ธ
# ์ต์ ๋ก๊ทธ ํ์ธ tail -f logs/chatbot-$(date +%Y-%m-%d).log # ์ค๋ฅ ๋ก๊ทธ๋ง ํํฐ๋ง grep "ERROR\|FATAL" logs/chatbot-*.log
- Visual Studio 2022 ๋๋ VS Code ์ค์น
- .NET 8.0 SDK ์ค์น
- DevExpress ๋ผ์ด์ ์ค ์ค์
- Ollama ์ค์น ๋ฐ ๋ชจ๋ธ ๋ค์ด๋ก๋
- C# ์ฝ๋ฉ ์ปจ๋ฒค์ ์ค์
- XML ๋ฌธ์ ์ฃผ์ ์์ฑ
- ๋จ์ ํ ์คํธ ์์ฑ ๊ถ์ฅ
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
๊ธฐ์ ์ง์์ด๋ ๋ฌธ์์ฌํญ์ด ์์ผ์๋ฉด:
- ์ด์ ํธ๋์ปค: GitHub Issues
- ์ด๋ฉ์ผ: support@snexis.com
- ๋ฌธ์: ์ด README ํ์ผ
Made with โค๏ธ by SNexis MES Team