지난 2개월간 프로그래밍이 점진적 발전이 아닌 급격한 변화를 겪었으며, 특히 직전 12월이 결정적 전환점이었음
모델들의 품질, 장기 일관성(long-term coherence), 끈기(tenacity) 가 크게 향상되어 크고 긴 작업을 끝까지 처리 가능
이로 인해 기존 기본 프로그래밍 워크플로우에 매우 파괴적인 변화가 발생
일례로, 주말에 자택 카메라용 로컬 비디오 분석 대시보드를 구축했음
에이전트에게 내린 지시 내용
“DGX Spark의 로컬 IP와 사용자명/비밀번호를 줄 테니 로그인하고, SSH 키 설정, vLLM 설정, Qwen3-VL 다운로드 및 벤치마크, 비디오 추론용 서버 엔드포인트 구축, 기본 웹 UI 대시보드 구축, 전체 테스트, systemd 서비스 설정, 메모리 노트 기록, 마크다운 리포트 작성까지 할 것”
에이전트가 약 30분간 자율적으로 작업 수행: 여러 문제에 부딪히면서 온라인으로 해결책을 조사하고, 하나씩 해결하며 코드 작성, 테스트, 디버깅, 서비스 설정까지 완료 후 보고서를 제출함
직접 손댄 것은 아무것도 없었으며, 불과 3개월 전만 해도 주말 전체가 필요한 프로젝트였지만 이제는 30분 동안 잊고 기다리면 완료되는 작업이 되었음
컴퓨터 발명 이래 에디터에 코드를 직접 타이핑하던 시대는 끝났음
이제는 AI 에이전트를 실행하고, 영어로 작업을 지시한 뒤 그 작업을 병렬로 관리하고 검토하는 시대
가장 큰 보상은 추상화 계층을 계속 높여가는 것, 즉 올바른 도구, 메모리, 지시를 갖춘 장기 실행 오케스트레이터가 여러 병렬 Code 인스턴스를 생산적으로 관리하도록 설계하는 것
최상위 수준의 “에이전틱 엔지니어링” 을 통해 달성할 수 있는 레버리지가 현재 매우 높음
물론, 아직 완벽하지 않으며, 고수준 방향 설정, 판단력, 감각(taste), 감독, 반복 작업, 힌트와 아이디어 제공이 필요함
일부 시나리오에서 훨씬 잘 작동하며, 특히 작업 명세가 명확하고 기능을 검증/테스트할 수 있는 경우에 효과적임
핵심은 작업을 적절히 분해하여 잘 작동하는 부분은 에이전트에 위임하고 나머지 부분에서 도움을 주는 직관을 기르는 것
현재 소프트웨어 업계는 “평소와 다름없는 시기(business as usual)”가 전혀 아닌 상황임
콜린스와 메리엄 웹스터 등 해외의 유명 사전들은 올해의 단어로 각각 ‘바이브 코딩(wibe coding)’과 ‘슬롭(Slop)’을 선정했다. AI가 이제는 전문 영역을 넘어 일상에 파고들었다는 증거로 볼 수 있다.
AI타임스도 올 한해를 정리하며 대표적인 AI 키워드를 뽑아봤다. 이를 통해 올해 기술 트렌드를 되돌아본다. 그리고 이는 2026년에도 주요한 어젠다가 될 가능성이 크다.
1. 에이전트(Agentic)
AI가 단순한 챗봇을 넘어 인간을 대신해 업무를 자동화해 줄 것이라는 기대감이 반영된 단어다. 올해 초에는 샘 알트먼 오픈AI CEO도 연말쯤 에이전트가 기업에 본격 투입될 것으로 봤다. 그리고 월 2만달러의 사용료를 부과할 것이라는 말까지 나왔다.
그런 에이전트는 아직 등장하지 않았다. 현재는 상담사를 대신하는 정도로, 대부분은 테스트 단계로 볼 수 있다. 그리고 이 용어는 이제 AI 자체를 뜻하거나 마케팅용으로 활용되고 있다.
더 중요한 것은 에이전트 역할을 수행하기 위해서는 모델 성능의 향상은 물론, 기존 워크플로우의 적용과 기업 문화와의 충돌, 거버넌스 등의 문제를 해결해야 한다는 점이 드러났다는 것이다. 기술의 완성도보다 비즈니스 통합 난이도가 AI 확산의 병목이 된다는 교훈을 얻은 해였다.
내년에도 에이전트는 업계의 화두가 될 것으로 보인다. 또 이는 모델이 성능 자체만큼이나 애플리케이션으로서의 유용성이 점점 중요해질 것을 예고한다.
2. 바이브 코딩
AI가 현실 문제 해결에 가장 큰 도움을 준 사례로 꼽을 수 있는 것이 바로 AI 코딩이다. 즉, 바이브 코딩이 인기를 끈 것은 AI의 가장 성공적인 사례로 꼽혔다는 것으로 볼 수 있다.
연초부터 빅테크의 수장들이 자체 업무에 이를 적극 도입했다고 밝혔고, 이 영향으로 마이크로소프트가 코더 수천명을 해고하는 일까지 일어났다.
AI는 글쓰기처럼 추상적인 분야보다는, 정확한 답이 있고 이를 자체적으로 검증할 수 있는 수학이나 코딩 등에 강할 수밖에 없다. 이에 따라 AI 코딩의 성능은 앞으로도 크게 발전할 가능성이 크다. 그리고 이는 성공적인 에이전트 사례로 확장될 가능성이 크다.
3. 데이터센터
지난해까지 주요 AI 업체가 ‘모델’ 중심으로 움직였다면, 올해는 ‘인프라’에 집중했다. 1월부터 오픈AI는 ‘스타게이트’라는 초대형 프로젝트로 포문을 열었으며, 1년 내내 관련 발표를 내놓았다. 빅테크들도 일제히 투자 확대를 선언했다.
이는 첨단 모델 개발을 위한 컴퓨팅 확보라는 측면과 동시에 폭발적인 사용자 확대에 따른 추론(inference) 능력, 즉 서비스 확대라는 측면이 반영돼 있다.
이와 맞물려 에너지 문제도 크게 주목받았다. 동시에 엔비디아는 세계에서 가장 가치가 높은 기업으로 올라섰다. 미국과 중국과의 기술 갈등의 핵심도 데이터센터를 이루는 칩이었다.
또 이는 ‘AI 버블’ 논란의 핵심이 됐다. 이제는 우주 데이터센터까지 거론되고 있다.
이제 인프라 구축은 일부 빅테크의 문제를 넘어, 소버린 AI라는 추세를 타고 전 세계로 확대되고 있다. 국내도 알트먼 CEO와 젠슨 황 CEO가 잇달아 방문, 데이터 센터와 GPU 공급을 약속했다.
(사진=메타)
4. 초지능(Superintelligence)
인공일반지능(AGI)에 대한 논의는 올해에도 활발했다. 이미 일부 분야에서는 AI가 인간의 능력을 넘어섰다는 분위기가 형성됐으며, 오픈AI 등은 이를 넘어 ‘초지능’을 새로운 목표로 내세웠다.
특히, LLM으로는 AGI에 도달하기 어렵다는 점이 자주 지적됐다. 이 때문에 월드 모델이 보완책으로 제시됐다. 얀 르쿤 메타 전 수석 과학자까지 합류, 내년에는 이 분야에서도 빠른 발전이 기대된다.
초지능과 관련해 가장 눈길을 끌었던 것은 메타가 MSL을 설립한 것이다. 이름부터 ‘메타 초지능 연구실(meta superintelligence lab)’로, 이를 조직하기 위해 막대한 자금을 퍼부으며 인재 경쟁에 불을 댕겼다. 이 때문에 일부 AI 연구원들은 프로 스포츠 스타에 맞먹는 몸값을 기록했다.
5. 추론(reasoning)과 강화 학습(RL)
추론은 지난해 출시된 오픈AI의 ‘o1’으로 새로운 AI 성능 향상의 기준이 됐다. 이는 AI 모델의 학습을 위한 데이터 고갈과 스케일링 법칙의 한계를 넘는 돌파구로 여겨졌다.
모델 학습 측면에서는 RL이 새로운 대세가 됐다. 이는 에이전틱 AI를 위해서도 핵심 메커니즘으로 꼽힌다.
AI 전문 기술 용어로 유행이 된 것으로는 ‘증류(Distillation)’와 ‘전문가 혼합(MoE)’ 등을 꼽을 수 있다. 이는 올해 초 세계적인 충격을 안겼던 딥시크의 핵심 기술이라는 점 때문에 부각됐다.
이는 또 오픈 소스가 주류로 올라서는 기반을 마련했다. 특히 중국의 모델은 이제 미국을 따라잡았다는 평가를 받을 정도로 성장했다.
6. 피지컬 AI (Physical AI)
AI의 최종 애플리케이션으로 꼽히는 휴머노이드 로봇은 올해부터 본격적인 과대광고가 시작됐다. 일론 머스크 CEO는 테슬라를 로봇 회사로 광고했고, 정부의 드라이브로 중국에서는 로봇 체육대회와 화려한 데모 영상이 쏟아졌다. 엔비디아도 이런 흐름에 기름을 부었다.
물론, 휴머노이드는 두뇌 역할을 하는 AI의 완성은 물론, 엔지니어링 문제 해결과 비용 효율 등이 모두 해결돼야 한다. 단기간의 확장은 무리라는 평이다.
하지만 이는 산업 현장에 AI와 디지털 트윈, 엔지니어링의 결합을 통한 자동화, 즉 피지컬 AI를 화두로 끌어 올렸다. 광범위하게는 자율주행도 여기에 포함된다.
피지컬 AI는 앞서 언급한 AI의 추론과 멀티모달 모델, 월드 모델, 에이전틱 AI 등과 연결된다. 특히 올해는 텍스트를 넘어 이미지, 비디오, 음성 등 모든 데이터를 이해하고 생성하는 멀티모달 모델이 보편화된 해로 볼 수 있다.
이는 앞으로도 몇년간 중요하게 다뤄질 것으로 예상된다. 이는 AI를 실물 경제와 통합하는 핵심이기 때문이다.
7. AI 정신병과 아첨
올해는 AI의 정확도 말고도 사용자에게 미치는 ‘영향’이 강조됐다. AI 챗봇 사용자의 폭발적인 증가에 따라 이제까지 숨겨진 문제가 드러난 것이기도 하지만, 수익 확대를 위한 사용자 참여 확대를 위해 모델을 손 본 AI 기업의 탓이 크다.
지난해에는 챗봇이 청소년의 자살을 유도했다는 사례가 처음 등장한 데 이어, 올해에는 아부와 망상 부추김 등이 잇달아 보고됐다.
이 문제는 AI 기업이 연구실에서 서비스 기업으로 확장 중이라는 것을 보여주기도 한다. 사용자가 9억명을 넘어서며, 과거 소셜 미디어 등이 겪었던 문제를 반복하는 것으로 볼 수 있다.
또 이제까지는 환각이나 편향 등 기술적인 문제로 치부했던 AI의 문제를 사회적인 차원으로 끌어 올린 것으로 볼 수 있다. 즉, AI 안전 문제가 인류 멸망과 같은 극단적인 디스토피아에 머물지 않고 규제 등의 논의를 이끈 구체적인 사례다.
(사진=과기정통부)
8. 국가대표 모델
국내에서는 독자 AI 파운데이션 모델 즉, ‘국가대표 모델’ 선정이 최고의 이슈였다. 지난해부터 거론됐던 이 프로젝트는 새 정부 출범으로 본격화했고, 지난여름 내내 화제가 됐다. 그 결과, 5개의 컨소시엄이 선정됐다.
기업들은 국가대표라는 타이틀을 놓치지 않기 위해 애를 썼다. 선정 직전에는 기업들이 일제히 자체 모델을 선보였다. 지난 몇년간 국내에서 출시된 모델보다 올해 선보인 모델이 더 많다고 꼽힐 정도였다.
이처럼 이번 프로젝트는 미국이나 중국에 비해 잠잠하던 파운데이션 모델 출시에 불을 댕겼고, 기업의 기술 경쟁을 유발했다는 점에서는 긍정적으로 볼 수 있다.
앞으로 등장할 국대 모델의 성능은 물론, 활용성이 더 중요하다. 글로벌 프론티어 모델이나 해외 오픈 소스에 맞서 경쟁력을 확보할 수 있을지의 문제다.
하지만, 올해 국내 AI 업계에 실질적인 영향을 미친 것은 B2B 중심의 버티컬 AI로 볼 수 있다. 산업별 특화 LLM을 통해 금융과 제조, 헬스케어 등 특정 도메인의 문제를 해결하는 데 집중했다. 범용성보다는 전문성으로 이동했다고 보는 것이 맞다.
소비자 시장에서는 ‘제타’나 ‘크랙’ 등 캐릭터 챗봇이 젊은 층을 중심으로 상업 성공의 조짐을 보였다.
또 정부는 국내의 AI 반도체(NPU) 스타트업을 중심으로 소버린 AI 전략을 결합해 하드웨어 국산화를 위해 드라이브를 걸었다.
9. 기타 – AI의 경계 확장과 충돌
올해 AI 챗봇의 폭발적인 성장을 견인한 것은 이미지 생성 기능이었다. 지난 3월 챗GPT의 ‘지브리 스타일’과 9월 구글의 ‘나노 바나나’ 등이 주인공이다.
이는 기존 모델의 성능에 집중하던 AI 업계의 분위기에도 큰 영향을 미쳤다. 오픈AI는 이달 초 ‘코드 레드’를 발령했는데, 여기에는 사용자의 챗봇 활용 경험을 개선하는 데 집중하는 것이 목표로 제시됐다. 그리고 새로운 이미지 생성 모델도 내놓았다.
이처럼 AI로 생성한 이미지와 영상은 AI 슬롭이라는 단어를 만들어 냈다. 오픈AI의 동영상 생성 앱 ‘소라’의 인기와 메타의 ‘바이브’ 출시 등이 이를 부채질했다.
저작권에 대한 논쟁도 거세졌다. 특히 앤트로픽은 업계에서 처음으로 저작권을 인정하는 소송 합의안을 내놓았다. ‘공정 사용(Fair Use)’은 내년에도 쟁점 사항이 될 것으로 보인다.
‘검색 엔진 최적화(SEO)’에 이어 ‘생성 엔진 최적화(GEO)’라는 용어가 등장한 것도 두드러졌다. 이는 20여년이 넘도록 정보 획득의 주요한 방법으로 자리 잡은 검색이 이제는 AI 챗봇으로 이동하고 있다는 것을 보여주는 사례이기 때문이다.
이 밖에도 ‘AI 안경’으로 대표된 웨어러블도 주목할 만하다. 특히 오픈AI가 챗GPT 전용 장치를 준비 중으로, 이는 내년의 주요 키워드로 떠오를 가능성이 크다.
이전 포스트에서 테스트 해봤던 Ollama를 쫌 더 다양하게 활용하기 위해 Python에서 사용하는 실습을 진행해보았다. 이번에는 예제 코드를 활용한 간단한 기능한 구현해보고 앞으로 HuggingFace 모델 가져오기, LangChain과 함께 사용하기 등 추가 실습을 더 진행해볼 예정이다.
실습은 파이썬 가상환경을 만들어서 진행했고, 한국어로 사용할 수 있는 모델을 찾기 위해서 여러 모델들을 테스트 해보았다. 한국어 채팅은 Gemma의 성능이 가장 좋았다. 아래 실습에서는 여러 모델을 섞어서 진행하겠다.
Llama2
Mistral
Solar
Gemma
구글의 Gemma만 제대로된 답변을 주고 있다. (역시 따끈따끈한 모델..) Solar는 한국에서 만들었는데(Upstage) 학습할 때 한국어 데이터셋을 많이 안 포함 시킨 건지 왜 성능이..? (10.7B size 기준)
.
.
.
우선 Ollama를 설치한다. (가상환경에서 진행하므로 이전에 terminal에서 설치해 준 것과 무관하게 다시 설치해줘야 한다)
import ollama
ollama.pull('llama2')
ollama를 import하고 모델을 설치해준다. 터미널에서 ollama run gemma를 통해 모델을 다운로드하고 바로 실행할 수 있지만, python에는 모델을 pull해온다. ollama.list()를 통해서 설치한 모델 리스트를 확인할 수 있고 ollama.delete('llama2')를 통해 모델을 삭제할 수도 있다.
response = ollama.chat(model='solar', messages=[{'role':'user','content':'Why is the sky blue?',},])print(response['message']['content'])
content에 input prompt를 작성하면 답변이 생성된다. model을 바꿔가면서 테스트해봤는데, 모델에 따라서 답변의 길이, 응답 특성 등이 살짝씩 달랐다.
임베딩 벡터 얻기 + 검색(with ChromaDB)
Ollama에 이 기능이 공개된 건 꽤 최근인 것 같은데, 답변을 출력할 뿐만 아니라 답변의 embedding vector를 제공한다는 것이다. 공식 문서에서는 RAG를 구축하는데 사용할 수 있다고 설명하고 있고 (1)임베딩 (2)DB저장 (3)검색 (4)답변생성 의 과정을 실습해볼 수 있는 예시를 제공한다. 코드는 모두 Ollama에서 제공한 것이며, 사용 모델만 내가 설치한 모델로 바꿔서 진행하였다.
ollama.embeddings(model='mistral', prompt='The sky is blue because of rayleigh scattering')
위 코드를 실행하면 출력 결과로 답변과 함께 embedding vector가 나온다.
다음으로는 Ollama와 ChromaDB를 각각 사용해서 임베딩 벡터를 생성하고 저장한 뒤 검색하는 과정을 진행해보겠다.
pip install chromadb
우선 ChromaDB를 설치한다.
import ollama
import chromadb
documents =["Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels","Llamas were first domesticated and used as pack animals 4,000 to 5,000 years ago in the Peruvian highlands","Llamas can grow as much as 6 feet tall though the average llama between 5 feet 6 inches and 5 feet 9 inches tall","Llamas weigh between 280 and 450 pounds and can carry 25 to 30 percent of their body weight","Llamas are vegetarians and have very efficient digestive systems","Llamas live to be about 20 years old, though some only live for 15 years and others live to be 30 years old",]
client = chromadb.Client()
collection = client.create_collection(name="docs2")# store each document in a vector embedding databasefor i, d inenumerate(documents):
response = ollama.embeddings(model="mistral", prompt=d)
embedding = response["embedding"]
collection.add(
ids=[str(i)],
embeddings=[embedding],
documents=[d])
documents에는 임베딩을 진행한 문서를 넣어주고, embedding model은 mistral을 사용했다. 데이터양이 적어서 금방 실행된다.
# an example prompt
prompt ="What animals are llamas related to?"# generate an embedding for the prompt and retrieve the most relevant doc
response = ollama.embeddings(
prompt=prompt,
model="mistral")
results = collection.query(
query_embeddings=[response["embedding"]],
n_results=1)
data = results['documents'][0][0]
prompt에 질문을 넣어주면 해당 질문의 답변을 얻을 수 있는 가장 유사한 문장을 documents에서 찾는다. (embedding vector로 가장 유사도가 높은 문장을 찾는 걸로 알고 있는데, 정확한 방법은 알지 못한다. 추후 Langchain과 함께 사용하는 부분에 추가하겠다)
output = ollama.generate(
model="mistral",
prompt=f"Using this data: {data}. Respond to this prompt: {prompt}")print(output['response'])
가장 유사성이 높은 문장을 찾아오는 것까지도 유용하지만, 그 문장을 가지고 다시 model에 넣어서 매끄러운 답변을 생성하는 과정이다.
여기까지 하면 거의 ChatGPT와 같은 모델을 뚝딱 만들어 낸 것이다! 좀 더 많은 기능들을 붙이거나 미세한 조정(chunk size 조정 등) LangChain을 사용하는 것이 유용하겠지만, 이렇게 간단한 작업은 각각 불러와서 진행해도 충분할 것 같다.
Spring AI는 다양한 LLM 제공자(OpenAI, Azure, Ollama 등)와 연동할 수 있습니다.
저는 이 포스팅에서 로컬에서 실행 가능한 오픈소스 플랫폼인 Ollama를 기준으로 설명하겠습니다.
참고: Spring AI는 Java 17 이상부터 지원됩니다.
Ollama는 다양한 오픈소스 LLM을 PC에 직접 다운로드하여 실행할 수 있는 플랫폼입니다.
따라서 외부로 유출되면 안 되는 개인정보나 대외비 문서를 처리할 때 적합한 선택이 될 수 있습니다.
- 의존성 추가 (Maven 기준)
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>
- 설정 파일 기본적인 설정
# Ollama 서버 주소
spring.ai.ollama.base-url=http://localhost:11434 # 모델 다운로드 전략(always, when_missing, never)
spring.ai.ollama.init.pull-model-strategy=when_missing
# 기본 셋팅 llm모델
spring.ai.ollama.chat.model= qwen3:1.7b# 창의성 조절: 높을수록 자유로운 응답
spring.ai.ollama.chat.temperature= 0.8# 최대 응답 토큰 수
spring.ai.ollama.chat.max-tokens= 1024# Embedding 모델
spring.ai.ollama.embedding.model=bona/bge-m3-korean
스트리밍 출력 방식 (Flux): LLM 응답을 실시간으로 조각 단위로 받기
예제를 통해 두 방식의 사용법과, JSON 구조화된 출력 방식까지 함께 살펴보겠습니다.
???? ChatModel과 ChatClient의 차이
Spring AI에는 ChatModel과 ChatClient라는 두 개의 주요 구성 요소가 있습니다.
ChatModel: LLM과의 저수준 통신 역할을 합니다.
ChatClient: ChatModel을 래핑한 상위 레벨 API로, 프롬프트 구성, 응답 처리, Advisor, RAG 등 다양한 확장 기능을 제공합니다.
단일 출력 방식
@AllArgsConstructor@RestControllerpublicclassModelClient{
// Spring이 OllamaChatModel 구현체 자동 주입private final ChatModel chatModel;
@GetMapping("/v1/model-client")
public ChatResponse modelClientV1(@RequestParam("text") String text) {
// 시스템 메시지는 LLM이 반드시 지켜야 할 지침// 유저 메시지는 사용자의 입력
Prompt prompt = new Prompt(
List.of(
new SystemMessage("너는 친절한 AI 비서야. 절대 추론 과정을 보여주지 말고 요약만 응답해."),
new UserMessage(text)
));
return ChatClient.create(chatModel)
.prompt(prompt)
.call()
.content(); // 전체 응답을 한 번에 반환
}
}
스트리밍 출력 방식 (Flux)
스트리밍 방식은 채팅처럼 실시간으로 응답이 필요한 UI에 적합합니다.
@AllArgsConstructor@RestControllerpublicclassModelClient{
private final ChatModel chatModel;
@GetMapping(value = "/v2/model-client", produces = "text/plain;charset=UTF-8")
public Flux<String> getModelClientV2(@RequestParam("text") String text) {
// 시스템 메시지는 LLM이 반드시 지켜야 할 지침// 유저 메시지는 사용자의 입력
Prompt prompt = new Prompt(
List.of(
new SystemMessage("너는 친절한 AI 비서야"),
new UserMessage(text)
));
return ChatClient.create(this.chatModel)
.prompt(prompt)
.stream() // 스트리밍 응답 시작
.content(); // Flux<String>으로 실시간 조각 응답 수신
}
}
구조화된 출력 받기 (JSON → DTO)
내부적으로는 LLM에게 “이런 구조로 응답해줘”라고 명시한 후 결과를 DTO에 바인딩합니다.
하지만 LLM이 해당 형식대로 정확하게 응답하지 않으면 파싱 에러가 발생할 수 있습니다.
안정성을 높이기 위해 시스템 메시지에 형식을 반복적으로 명확히 명시하거나, 구조 유도 프롬프트 예제를 함께 제공하는 것이 좋습니다.
@AllArgsConstructor
@RestController
publicclassModelClient{
privatefinal ChatModel chatModel;
@GetMapping("/v3/model-client")
public ActorFilms modelClientV3(@RequestParam("text") String text) {
// 사용자 입력을 이용해 프롬프트 템플릿 구성String template = """
Generate the filmography of 5 movies for {actor}.
""";
Prompt prompt = new Prompt(
List.of(
new SystemMessage("너는 친절한 AI 비서야. 절대 추론 과정을 보여주지 말고 요약만 응답해."),
new UserMessage(new PromptTemplate(template).render(Map.of("actor", text)))
));
ChatModel gemma = OllamaChatModel.builder()
.ollamaApi(OllamaApi.builder().build())
.defaultOptions(
OllamaOptions.builder()
.model("gemma3n:e4b")
.temperature(0.4)
.build())
.build();
return ChatClient.create(gemma)
.prompt(prompt)
.call()
.entity(ActorFilms.class); // 결과를 DTO로 구조화
}
record ActorFilms(String actor, List<String> movies) {}
}
프롬프트 요청 예시 (내부 동작 확인용)
Spring AI가 구조화 출력을 위해 내부적으로 LLM에게 다음과 같이 요청을 구성합니다.
request: ChatClientRequest[
- 저희가 입력한 명령 프롬프트 입력입니다.
prompt=Prompt{
messages=[SystemMessage{textContent='너는 친절한 AI 비서야. 절대 추론과정을 보여주지 말고 요약만 응답해', messageType=SYSTEM, metadata={messageType=SYSTEM}},
UserMessage{content='Generate the filmography of 5 movies for 하정우.', properties={messageType=USER}, messageType=USER}], modelOptions=org.springframework.ai.ollama.api.OllamaOptions@48e29a2c},
- 여기에 해당 DTO 객체의 정의가 들어갑니다.
context={spring.ai.chat.client.output.format=Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
"properties" : {
"actor" : {
"type" : "string"
},
"movies" : {
"type" : "array",
"items" : {
"type" : "string"
}
}
},
"additionalProperties" : false
}```
}]
마치며
AI를 실제 프로젝트에 도입하는 것은 어렵고 복잡할 것 같다는 막연한 생각이 있었지만,
Spring AI를 통해 Java 환경에서도 LLM을 손쉽게 연결하고 활용할 수 있다는 가능성을 확인할 수 있었습니다.
물론 성능, 속도, 프롬프트 설계, 적절한 모델 선택 등 실무에서 고려할 요소들은 많지만,
이번 실습을 통해 LLM을 실제 서비스에 적용하는 출발점을 잡을 수 있었습니다.
다음 포스팅에서는 Advisor 기능을 활용해 LLM 응답을 가공하고,
간단한 RAG(Retrieval-Augmented Generation) 기능을 구현해보겠습니다.
이 기능은 Logging, 크롤링된 문서, RDBMS 정보 등 다양한 외부 지식 소스를 LLM과 연결해
더 정확하고 신뢰도 높은 응답을 생성하도록 도와주는 방식입니다.
개발자 PC에 로컬 LLM을 구축하는 가장 쉬운 방법, Ollama 설치 및 사용법을 소개합니다. Windows, Mac, Linux 설치부터 Modelfile 커스텀, REST API 연동까지 실용적인 예제를 통해 로컬 AI 개발의 첫걸음을 안내합니다.
Sep 18, 2025
클라우드 API를 호출할 때마다 드는 비용 걱정, 사내 코드를 외부 AI 서비스에 보내는 찜찜함, 인터넷이 불안정할 때마다 멈춰버리는 개발 환경. 생성형 AI를 적극적으로 활용하고 싶은 개발자라면 누구나 한 번쯤 겪어봤을 불편함입니다. 만약 이 모든 제약 없이, 내 PC 안에서 자유롭게 LLM을 실행하고 테스트할 수 있다면 어떨까요?
이러한 개발자들의 갈증을 해소해 주는 최고의 솔루션으로 ‘Ollama’가 부상하고 있습니다. Ollama는 Llama 3, Mistral 등 강력한 오픈소스 LLM을 단 몇 줄의 명령어로 내 컴퓨터에 설치하고 실행할 수 있게 해주는 놀라운 도구입니다. 데이터는 내 PC 밖으로 절대 나가지 않으며, 비용도, 인터넷 연결도 필요 없습니다.
이 글에서는 개발자의 관점에서 Ollama를 설치하고, 핵심 기능을 익히고, 나만의 모델로 커스터마이징하여 최종적으로 내 애플리케이션과 연동하는 기초까지, 로컬 LLM 개발의 전체적인 그림을 완벽하게 마스터할 수 있도록 안내합니다.
Ollama 공식 홈페이지
1. Ollama, 3분 만에 설치하고 시작하기
Ollama의 가장 큰 장점은 압도적으로 간단한 설치 과정입니다. 복잡한 환경 설정 없이 각 운영체제에 맞는 방법으로 설치를 진행하세요.
1-1. Windows에 설치하기
Ollama 공식 홈페이지에 접속하여 ‘Download for Windows’ 버튼을 클릭해 설치 파일을 다운로드합니다.
다운로드한 OllamaSetup.exe 파일을 실행하고 안내에 따라 설치를 완료합니다.
설치가 완료되면 Ollama는 백그라운드 서비스로 자동 실행됩니다. 터미널(CMD 또는 PowerShell)을 열고 다음 명령어를 입력해 보세요.
앱을 실행하면 메뉴 막대에 Ollama 아이콘이 나타나며 백그라운드에서 실행됩니다. 터미널을 열고 동일하게 버전 확인 명령어를 실행합니다.
ollama --version
MacOS 터미널에서 Ollama 실행 화면
1-3. Linux에 설치하기
Linux에서는 터미널에 아래 명령어 한 줄만 입력하면 설치가 완료됩니다.
curl -fsSL <https://ollama.com/install.sh> | sh
이제 모든 준비가 끝났습니다. 본격적으로 LLM을 다뤄볼 시간입니다.
2. 터미널에서 LLM 조련하기: Ollama 핵심 명령어
Ollama는 직관적인 CLI(Command-Line Interface)를 통해 모델을 관리합니다. 가장 중요한 명령어 4가지만 기억하면 됩니다.
2-1. 모델 실행 및 다운로드: run
가장 기본이 되는 명령어입니다. 원하는 모델을 지정하여 실행하면, 해당 모델이 로컬에 없는 경우 자동으로 다운로드한 후 실행합니다. 가장 인기 있는 Meta의 Llama 3 모델을 실행해 보겠습니다.
ollama run llama3
명령을 실행하면 모델 다운로드가 시작되고, 완료되면 >>> Send a message (/? for help) 라는 프롬프트가 나타납니다. 이제 자유롭게 질문을 던져보세요.
llama3 설치 화면
2-2. 모델 미리 다운로드: pull
run 명령어는 다운로드와 실행을 한 번에 처리하지만, 미리 필요한 모델을 받아두고 싶을 때도 있습니다. 이때 pull 명령어를 사용합니다.
# 코딩에 특화된 codellama 모델을 미리 다운로드
ollama pull codellama
2-3. 설치된 모델 목록 확인: list
내 PC에 어떤 모델들이 설치되어 있는지 확인하고 싶다면 list 명령어를 사용하세요. 모델 이름, ID, 크기, 수정 시간 등의 정보를 한눈에 볼 수 있습니다.
ollama list
2-4. 모델 삭제: rm
더 이상 사용하지 않는 모델을 삭제하여 디스크 공간을 확보하려면 rm 명령어를 사용합니다.
ollama rm codellama
Ollama로 llama3 설치 및 대화
3. 나만의 AI 비서 만들기: Modelfile 커스터마이징
Ollama의 진정한 강력함은 모델을 내 입맛에 맞게 커스터마이징할 수 있다는 점에서 드러납니다. Docker 사용 경험이 있다면 Dockerfile과 매우 유사한 Modelfile을 통해 이 작업을 수행할 수 있습니다.
Modelfile은 기반이 될 모델을 지정하고, 시스템 프롬프트나 파라미터 등을 사전에 설정하여 새로운 커스텀 모델을 만드는 설계도입니다. 예를 들어, 파이썬 코드 리뷰만 전문적으로 수행하는 ‘리뷰어 봇’을 만들어 보겠습니다.
1단계: Modelfile 개념 이해
Modelfile을 ‘AI를 위한 맞춤 설정 레시피’ 또는 ‘AI 캐릭터 설정집’이라고 생각하면 완벽합니다.
기존 방식: ollama run llama3를 실행하면, 우리는 매번 대화를 시작할 때마다 “너는 이제부터 친절한 개발자 비서야. 한국어로만 대답해.” 와 같은 지시사항을 반복해서 입력해야 합니다.
Modelfile 방식: 이 ‘캐릭터 설정집’ 파일 안에 “너의 기본 모델은 llama3이고, 너의 역할은 친절한 개발자 비서이며, 항상 한국어로만 대답해야 해” 라는 설정을 미리 저장해 둡니다. 그리고 이 설정집을 바탕으로 **나만의 AI 모델*을 새로 만드는 것입니다.
핵심 장점: 한번 만들어두면, 매번 긴 지시사항을 입력할 필요 없이, 내가 만든 AI를 불러내기만 하면 항상 똑같은 설정으로 작동합니다.
2단계: Modelfile 만들기 (실제 파일 생성)
이제 ‘레시피’를 담을 빈 파일을 만들어 보겠습니다.
프로젝트 폴더로 이동: 터미널에서 현재 작업 중인 프로젝트 폴더로 이동합니다.
빈 파일 생성: 아래 명령어를 터미널에 입력하여 Modelfile이라는 이름의 빈 파일을 만듭니다. (가장 중요: 확장자가 없습니다. Modelfile.txt가 아니라 그냥 Modelfile 입니다.)
touch Modelfile
(또는 VS Code와 같은 코드 에디터에서 직접 ‘새 파일 만들기’로 Modelfile을 생성해도 됩니다.)
Modelfile 실행화면
3단계: Modelfile 안에 내용 작성하기
Modelfile이 있는 폴더 혹은 VS Code로 Modelfile을 열고, 그 안에 AI에게 내릴 지시사항을 적어줍니다. 가장 기본적이고 필수적인 3가지 명령어가 있습니다.
A. FROM (기반 모델 지정)
의미: “어떤 기본 AI 모델을 커스텀할 것인가?”를 정합니다. 레시피의 가장 기본 재료와 같습니다.
작성법: (이것은 ‘최신 버전의 llama3 모델을 기반으로 만들겠다’는 뜻입니다.)
FROM llama3:latest
B. SYSTEM (역할 및 지시사항 부여)
의미: AI에게 영구적으로 적용될 기본 지시사항이나 역할을 부여합니다. AI의 ‘성격’이나 ‘세계관’을 정해주는 것과 같습니다.
작성법: (따옴표 세 개(""")를 사용하면 여러 줄의 긴 지시사항을 쓸 수 있어 편리합니다.)
SYSTEM """
You are a professional front-end developer assistant.
Your primary role is to help users with React, TypeScript, and Git.
Always provide answers in Korean.
Provide clear, concise code examples when necessary.
"""
C. PARAMETER (세부 설정 조정)
의미: AI의 행동을 미세하게 조정하는 ‘설정값’입니다. 예를 들어 AI의 ‘창의성’ 수치를 조절할 수 있습니다.
작성법 (가장 많이 쓰는 temperature 예시):
PARAMETER temperature 0.7
temperature (온도): AI의 답변이 얼마나 창의적이고 무작위적일지를 결정합니다.
0에 가까울수록: 매우 사실적이고 결정론적인 답변을 합니다. (보고서 작성 등)
1에 가까울수록: 매우 창의적이고 예측 불가능한 답변을 합니다. (소설 쓰기 등)
보통 0.5 ~ 0.7 사이를 많이 사용합니다.
Modelfile 내 내용 입력 화면
4단계: ‘나만의 AI’ 생성하기
이제 완성된 Modelfile을 저장 후 Ollama에게 주고, 새로운 모델을 만들어달라고 요청할 차례입니다.
명령어:
ollama create {my-assistant} -f ./Modelfile
명령어 분석:
ollama create: “새로운 모델을 만들어줘!”
my-assistant: 내가 새로 만들 AI 모델의 이름입니다. (원하는 대로 지으면 됩니다.)
f ./Modelfile: f는 file을 의미하며, “이 레시피(Modelfile)를 사용해서 만들어줘!” 라는 뜻입니다.
이 명령어를 실행하면, 터미널에 진행 상태가 표시되면서 새로운 모델이 생성됩니다.
터미널에서 Modelfile 실행 화면
5단계: ‘나만의 AI’ 사용하기 (모델 실행)
이제 모든 준비가 끝났습니다! 터미널에 아래 명령어를 입력해 보세요.
ollama run my-assistant
이제 나타나는 채팅창에서 AI에게 말을 걸면, Modelfile에 저장했던 모든 지시사항(개발자 비서 역할, 한국어 사용, 창의성 0.7 등)이 자동으로 적용된 상태로 대답할 것입니다. 더 이상 매번 긴 프롬프트를 입력할 필요가 없습니다.
Modelfile 적용 시 대화 화면
이제 당신의 아이디어를 펼칠 시간
지금까지 Ollama를 통해 로컬 PC에 강력한 LLM을 설치하고, 터미널 명령어로 자유롭게 다루며, Modelfile로 나만의 AI를 만드는 첫걸음까지 내디뎠습니다.
Ollama는 데이터 프라이버시, 비용, 인터넷 제약으로부터 개발자를 해방시키는 강력한 도구입니다. 개인용 코드 조수부터 복잡한 자연어 처리 기능이 필요한 애플리케이션의 프로토타이핑까지, 이제 여러분의 손에는 상상하는 무엇이든 만들어볼 수 있는 강력한 ‘엔진’이 쥐어졌습니다.
물론 오늘 다룬 내용은 로컬 LLM의 무한한 가능성을 향한 시작점일 뿐입니다. 이 강력한 엔진을 활용해 실제 프로덕션 수준의 시스템을 구축하는 여정에는 더 많은 기술적 과제들이 기다리고 있을 것입니다.
AI요약 ☞ 깃허브가 2025년 연례 보고서를 통해 지난 1년간 1억8000만명 이상의 개발자가 신규 유입됐으며, 총 프로젝트 수가 6억3000만개를 돌파했다고 밝혔다. 프로그래밍 언어 순위에서는 타입스크립트가 파이썬을 제치고 1위를 차지했으며, 국가별 순위에서는 인도가 중국을 넘어 2위로 올라섰다.
깃허브가 2025년 연례 보고서를 발표했다. [사진: 깃허브]
[디지털투데이 AI리포터] 글로벌 개발 플랫폼 깃허브(GitHub)가 2025년 연례 보고서 ‘옥토버스 2025′(Octoverse 2025)를 발표하며, 플랫폼 내 개발자 증가와 프로그래밍 언어 트렌드를 공개했다.
17일(현지시간) IT매체 아이티미디어에 따르면, 2025년 8월 기준 깃허브 프로젝트 수는 6억3000만개로 집계됐으며, 지난 1년간 1억8000만명 이상의 개발자가 새롭게 유입됐다. 총 기여자 수는 11억2000만명을 돌파하며, 깃허브의 개발자 생태계가 더욱 확장되고 있음을 보여줬다.
국가별 개발자 수 순위에서는 미국이 1위를 유지했으며, 지난해 2위였던 중국을 제치고 인도가 2위에 올랐다. 이어 3위는 중국, 6위는 일본이 차지했다. 깃허브는 3년 내 인도가 미국을 넘어 최대 개발자 국가가 될 것으로 전망했다.
프로그래밍 언어 순위에서는 타입스크립트(TypeScript)가 1위를 차지했다. 2023년까지 깃허브에서 가장 많이 사용된 언어는 자바스크립트(JavaScript)였으나, 지난해 파이썬(Python)이 1위에 올랐고, 올해는 타입스크립트가 다시 선두를 차지하며 빠르게 변화하는 트렌드를 보여주고 있다.
인공지능(AI) 도입 역시 가속화되고 있다. 새롭게 깃허브에 가입한 개발자의 80%가 가입 후 1주일 내 깃허브 코파일럿(GitHub Copilot)을 사용하는 것으로 나타났으며, 이는 AI 기반 개발 지원이 점점 더 보편화되고 있음을 의미한다.
파이토치에서 학습 루프를 정의하는 건 보다 간단하고 직관적이다. 변수를 생성하고 동적 그래프를 그때그때 정의하면서 모델을 학습할 수 있다. 데이터와 타겟을 디바이스(CPU/GPU)에 할당하고 순전파를 연산한다.
모델이 순전파(feed-forward) 연산을 마치고 나면, pytorch의 사전 정의된 개체들을 통해 역전파 과정을 수행할 수 있다. 그래디언트를 계산하고, 역전파 방법론을 적용함으로써 파라미터를 업데이트 한다.
for epoch inrange(epochs):
for batch, (data, target) inenumerate(train_loader):
# cuda 파라미터 가져오기
data = data.to(device=device)
target = target.to(device=device)
# 순전파
score = model(data)
loss = criterion(score, target)
# 역전파
optimizer.zero_grad()
loss.backward()
optimizer.step()
4. MNIST로 파이토치 이해하기
필요한 라이브러리를 불러온다
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
import numpy as np
import matplotlib.pyplot as plt