본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 15. 13:18

로컬 LLM (Ollama)을 MAUI 앱에서 호출해 보았다

요약

Ollama를 사용하여 로컬 LLM을 MAUI 앱에서 호출하고 구현하는 방법을 다룹니다. API 엔드포인트별 응답 형식의 차이와 Stream 설정에 따른 데이터 처리 주의사항을 설명합니다.

핵심 포인트

  • Ollama를 활용해 비용 부담 없는 로컬 LLM 환경 구축 가능
  • /api/generate와 /api/chat 엔드포인트의 응답 구조 차이 주의
  • Stream 설정(true/false)에 따른 JSON 파싱 방식 결정 필요
  • 시스템 프롬프트 활용 시 /api/chat 엔드포인트 권장

AI를 사용하여 무언가 앱 개발을 해보려고 생각했습니다만, ChatGPT SDK를 이용하면 크레딧이 필요했기 때문에, 로컬 LLM (Local LLM)으로 시도해 볼 수 없을까 하여 구현해 보았습니다.

이번에는 Ollama를 사용하여, 앱 측에서 프롬프트 (Prompt)를 보내고 응답 (Response)을 취득하는 방법을 비망록으로서 여기에 기재합니다.

  • 아래 사이트에서 각각의 환경에 맞는 것을 설치한다

https://ollama.com/download - 앱을 실행하고 CLI에 대한 권한을 허가한다

  • 터미널 (Terminal) 앱에서 다음 명령어를 실행하여 모델을 기동한다
ollama run qwen3:8b

이를 통해 qwen3:8b 모델이 기동되어 대화 모드로 동작합니다.

이것으로 로컬 LLM 서버가 요청을 수락할 수 있는 상태가 됩니다.

public class OllamaRequest
{
public string Model { get; set; } = "";
...

Stream/api/chat의 응답 형식을 전환하는 파라미터 (Parameter)입니다.

true로 설정하면 응답이 생성 중인 토큰 (Token)마다 여러 줄의 JSON (NDJSON)으로 반환되기 때문에, ReadFromJsonAsync<T>로 단일 객체로서 파싱 (Parsing)할 수 없게 됩니다.

이번에는 완성된 답변을 한 번에 받고 싶기 때문에, bool 타입의 기본값인 false인 상태로 사용하고 있습니다.

Stream이 false인 경우의 응답

{
"model": "qwen3:8b",
"created_at": "2026-06-12T10:00:00Z",
...

Stream이 true인 경우의 응답

{"model":"qwen3:8b","created_at":"...","message":{"role":"assistant","content":"日本"},"done":false}
{"model":"qwen3:8b","created_at":"...","message":{"role":"assistant","content":"の"},"done":false}
{"model":"qwen3:8b","created_at":"...","message":{"role":"assistant","content":"首都"},"done":false}
...
public class OllamaMessage
{
public string Role { get; set; } = "";
...
using System.Text.Json.Serialization;
public class OllamaResponse
{
...

여기서 주의가 필요한 것은, Ollama에는 /api/generate/api/chat이라는 두 종류의 엔드포인트 (Endpoint)가 존재하며, 응답 형식이 다르다는 점입니다.

/api/generate: 생성 결과가 response 필드 (문자열)에 들어감

/api/chat: 생성 결과가 message 객체 (rolecontent)에 들어감

이번에는 /api/chat을 사용하기 때문에, Response 프로퍼티 (Property)가 아니라 Message 프로퍼티 (OllamaMessage 타입)를 갖게 해야 합니다.

이 부분을 틀리면, 요청은 성공했음에도 불구하고 본문이 항상 비어 있게 되는 현상이 발생하므로 주의하십시오.

시스템 프롬프트 (System Prompt)로 역할을 부여하여 사용자 입력을 처리하는 용도라면 /api/chat 쪽이 더 자연스럽고 다루기 쉽습니다.

using System.Net.Http.Json;
public class OllamaService
{
...
builder.Services.AddSingleton(new HttpClient());
builder.Services.AddSingleton<OllamaService>();

HttpClient의 등록은, 본래라면 AddHttpClient<OllamaService>() (IHttpClientFactory 경유)를 사용하는 방법이 .NET/MAUI의 베스트 프랙티스 (Best Practice)로서 권장되는 경우가 많습니다.

이번에는 로컬 검증을 위한 최소 구성으로서, 간단하게 AddSingleton으로 처리했습니다.

실제 운영 환경이나 HttpClient의 재사용 및 연결 관리 (Connection Management)를 의식해야 하는 경우에는 IHttpClientFactory로의 전환을 검토해 주세요.

builder.Services.AddHttpClient<OllamaService>();
// AI 코멘트 생성
var prompt = new OllamaRequest
{
...

이번에는 Ollama를 사용하여 로컬 LLM (Large Language Model)에 MAUI 앱에서 요청을 보내고, 응답을 받을 때까지의 최소 구성을 구현했습니다.

크레딧을 소비하지 않고 AI 기능을 프로토타이핑할 수 있으므로, 아이디어 검증 단계에서는 특히 유용하다고 느꼈습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0