지난 포스팅에서 내 컴퓨터에 올라마를 설치하고 사용하는 방법을 소개했습니다. 이번 블로그에서는 터미널에서 명령어로 올라마를 사용하는 것보다 확장성이 뛰어난 코드로 올라마를 사용하는 방법을 소개합니다. 코드로 올라마를 사용하게 되면 웹이나 앱에서 올라마 API를 이용해 AI 서비스를 제공할 수 있습니다. 올라마를 이용하는 대부분의 서비스는 코드 방식을 이용하고 있습니다. 환경 설정법을 소개하고, 지난 포스팅에서 했던 예시와 동일하게 질문을 해보겠습니다. 사용하는 언어는 파이썬이고 라이브러리는 올라마에서 제공하는 공식 라이브러리를 사용하겠습니다.
✨ 소개 🦙
코드로 올라마를 사용하기 위한 가장 빠른 방법은 공식 라이브러리를 사용하는 것 입니다. 파이썬은 3.8 이상을 지원합니다. 이 블로그에서는 다음 환경에서 올라마를 테스트를 진행하겠습니다.
- 파이썬: python 3.12
- 가상환경 이름: pilot-ollama
- 라이브러리: ollama == 0.3
- 데모 코드: https://github.com/jyje/pilot-ollama/blob/main/src/lv1.ipynb
실행 결과는 깃헙 리포지토리의 노트북을 참고해 주세요!
이 블로그에서 실험할 경우는 3가지 입니다
- 일괄 응답: 질문 "인생이란 무엇인가요?"
- 스트리밍 응답: 질문 "인생이란 무엇인가요?"
- 이미지에 대한 응답: 고양이 사진 + 질문 "사진 속 동물은 무엇인가요?"
🧑💻 코드 예제: 일괄 응답
먼저 환경 설정을 하겠습니다.
pip install -qq --upgrade pip
pip install --upgrade ollama
이 때 로컬에 ollama가 설치될 수 있습니다.
그리고 다음 코드를 실행합니다.
import sys
assert (sys.version_info.major, sys.version_info.minor) == (3, 12)
# ---
import ollama
ollama.pull('gemma2')
response = ollama.chat(
model = 'gemma2',
messages = [
{
'role': 'user',
'content': '인생이란 무엇일까요?',
}
],
stream = False,
)
print(response['message']['content'])
`ollama.chat()` 함수는 올라마 API를 호출해 메시지를 바로 보냅니다. 내 컴퓨터에 실행 중인 올라마는 "localhost:11434" 주소로 서비스 중입니다. 파이썬 코드의 올라마 라이브러리는 이 주소로 API 요청을 보내고 응답을 후속 코드에 전달합니다. 만약 올라마가 실행 중이 아니라면 오류가 날 수 있습니다.
결과는 다음과 같은 마크다운의 형태로 한 번에 출력됩니다.
저는 챗봇이기 때문에 인생의 의미에 대한 명확한 답을 드릴 수 없습니다. 인생의 의미는 개인마다 다르고, 철학적 고찰과 경험을 통해 발견되는 주관적인 질문입니다. 하지만 여러 사람들의 생각과 관점을 바탕으로 몇 가지 아이디어를 제시해 드릴 수 있습니다.
* **성장과 학습**: 인생은 계속해서 배우고 성장하며 세상을 이해하는 여정이라고 할 수 있습니다. 새로운 경험, 관계, 지식을 통해 스스로를 발전시키고 더 풍요롭게 살아갈 수 있다는 의미를 가질 수 있습니다.
* **관계와 연결**: 인간은 사회적 동물이며, 다른 사람들과의 관계에서 의미와 행복을 찾는 경향이 있습니다. 사랑하는 사람들과의 유대감, 우정, 공동체에 대한 소속감 등이 우리에게 삶의 목적과 가치를 부여할 수 있습니다.
* **창조와 기여**: 세상에 새로운 것을 만들고, 다른 사람들에게 도움을 주는 활동은 인생에 의미를 더하는 요소가 될 수 있습니다. 예술, 과학, 기술 등 다양한 분야에서 자신의 능력을 발휘하고 사회에 기여함으로써 삶의 목적과 가치를 찾을 수 있습니다.
* **즐거움과 행복 추구**: 인생은 단순히 고통과 어려움만으로 이루어지는 것이 아니라, 즐거움과 행복을 경험하는 것도 중요합니다. 우리가 좋아하는 활동, 취미, 여행 등을 통해 삶의 의미와 가치를 느낄 수 있습니다.
결국 인생의 의미는 각자 스스로 찾아나가야 할 질문입니다. 다양한 관점과 경험을 통해 자신에게 맞는 답을 찾고, 그에 따라 행복하고 의미 있는 삶을 살아갈 수 있기를 바랍니다.
출력 전체를 후속 코드에 전달해야 한다면 `stream = False`으로 응답을 요청하시면 됩니다.
🧑💻 코드 예제: 스트리밍 응답
만약 응답을 스트리밍의 형태로 받고 싶다면 `stream = True`로 설정한 다음과 같은 코드로 작성하시면 됩니다.
ollama.pull('gemma2')
stream = ollama.chat(
model = 'gemma2',
messages = [
{
'role': 'user',
'content': '인생이란 무엇일까요?',
}
],
stream = True,
)
for chunk in stream:
print(chunk['message']['content'], end='', flush=True)
위 코드의 `print(..., end='', ...)` 함수에서 알 수 있듯이 줄 나눔없이 출력을 이어가면서, GPT가 응답하듯이 결과를 보여줄 수 있습니다.
🧑🎨 코드 예제: 이미지에 대한 응답
이미지를 입력하고 이미지에 대한 응답을 받고 싶다면 다음과 같은 코드로 작성하시면 됩니다. 이를 위해 vision 기능을 지원하는 모델을 사용해야 합니다. 최근에 공개된 'llama3.2-vision' 모델을 사용하겠습니다.
ollama.pull('llama3.2-vision')
stream = ollama.chat(
model='llama3.2-vision',
messages=[
{
'role': 'user',
'content': '이 사진에 나온 동물 대해서 설명해주세요. 답변은 한국어로 해주세요.',
'images': ['../assets/tolga-ahmetler-d6lbhI_ekBk-unsplash.jpg'], # 이미지 경로 혹은 BASE64로 인코딩 된 이미지 데이터
}
],
stream=True,
)
for chunk in stream:
print(chunk['message']['content'], end='', flush=True)
이미지 크기가 크다면 응답에 오랜 시간이 걸릴 수 있습니다. 적절한 크기의 이미지를 선택하시는 게 좋습니다. 위 코드의 응답은 다음과 같습니다.
사진 속 동물은 고양이라는 것이 분명합니다. 고양이는 식육목에 속하는 포유류의 일종으로, 몸길이는 23~30cm, 무게는 3~6kg입니다. 고양이의 등에는 짧고 격자 모양의 털이 많으며, 발가락은 매우 길어 휠체어가 가능합니다.
사진 속 고양이는 주로 야생에서 살고 있는 것으로 보입니다. 사진 속 고양이가 자주 나타나는 환경을 보면 주변에 많은 낙엽이 있고, 나무와 그늘 아래로 이동하고 있기 때문에 야생 고양이라는 것을 짐작할 수 있습니다.
사진 속 고양이는 검은색과 흰색의 얼룩무늬를 띄고 있습니다. 이러한 색상은 주변에 많은 낙엽이 떨어진 환경에서 자연스러운 것이며, 사진 속 고양이의 털 또한 길고 거칠게 보입니다. 이것도 야생 고양이가 아닌 것을 알 수 있는 기준점 중 하나입니다.
사진 속 고양이는 매우 청순하고 아름다운 모습을 드러내고 있습니다. 고양이라는 종은 모든 사람들의 마음속에 반드시 남기는 자리를 차지하는 동물로 알려져 있으며, 인간의 삶에도 많은 도움을 주는 동물이기도 합니다.
여기까지 내 컴퓨터 환경에서 코드로 올라마를 실행하는 예제를 소개했습니다. 소개한 기능은 아주 간단하지만 이 응답을 바탕으로 다양한 생성형 AI 서비스를 만들 수 있는 핵심기능입니다. 위 코드에 대한 데모는 이 링크를 통해 살펴보실 수 있습니다. 여러분의 LLM 개발에 도움이 되기를 바라며 마치겠습니다. 읽어주셔서 감사합니다.
'LLMOps' 카테고리의 다른 글
🦙 올라마(Ollama)#5: 사설망에서 올라마(Ollama) LLM 사용하기 (0) | 2024.11.23 |
---|---|
🦙 올라마(Ollama)#3: 내 컴퓨터에서 도커로 올라마 사용하기 (4) | 2024.11.17 |
🦙 올라마(Ollama): 나만의 GPT를 서비스 할 수 있는 도구를 소개합니다 (3) | 2024.11.15 |
어제보다 오늘 더 공부 잘하는 코딩냥이. 어제보다 오늘 더 일 잘하는 코딩냥이.
포스팅이 좋았다면, 오류를 발견했다면, 더 좋은 아이디어가 있다면 댓글 부탁드립니다!