올라마 실습

This commit is contained in:
2026-05-26 22:51:21 +09:00
parent 4e33fb82af
commit fad14b867b
9 changed files with 1554 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
python3
+1
View File
@@ -0,0 +1 @@
/usr/bin/python3
+1
View File
@@ -0,0 +1 @@
python3
+1
View File
@@ -0,0 +1 @@
lib
+5
View File
@@ -0,0 +1,5 @@
home = /usr/bin
include-system-site-packages = false
version = 3.12.3
executable = /usr/bin/python3.12
command = /usr/bin/python3 -m venv /home/cooney/source/ollama/.direnv/python-3.12.3
+1
View File
@@ -0,0 +1 @@
layout python3
+457
View File
@@ -0,0 +1,457 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "97b6e429",
"metadata": {},
"outputs": [],
"source": [
"### LLM 프레임워크"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ceaff2f6",
"metadata": {},
"outputs": [],
"source": [
"from langchain_ollama import ChatOllama\n",
"from langchain_ibm import ChatWatsonx\n",
"from langchain_core.prompts import PromptTemplate, ChatPromptTemplate\n",
"from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, PydanticOutputParser\n",
"from pydantic import BaseModel, Field\n",
"from typing import Literal\n",
"from dotenv import load_dotenv\n",
"import os\n",
"\n",
"type"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "2e83941f",
"metadata": {},
"outputs": [],
"source": [
"# .env 내용 가져오기\n",
"load_dotenv()\n",
"\n",
"apikey = os.getenv(\"WATSONX_API_KEY\")\n",
"project_id = os.getenv(\"WATSONX_PROJECT_ID\")\n",
"watsonx_ai_url = os.getenv(\"WATSONX_URL\")\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "dc504bf8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello! I'm an AI and don't have feelings, but I'm here and ready to assist you. How can I help you today?\n"
]
}
],
"source": [
"watson_lln = ChatWatsonx(\n",
" model_id = \"ibm/granite-4-h-small\",\n",
" url = f\"{watsonx_ai_url}\",\n",
" api_key = f\"{apikey}\",\n",
" project_id=f\"{project_id}\",\n",
" max_tokens = 2000\n",
")\n",
"\n",
"response = watson_lln.invoke(\"Hello, how are you?\")\n",
"print(response.content)"
]
},
{
"cell_type": "markdown",
"id": "fc2e1c88",
"metadata": {},
"source": [
"### langchain + ollama"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "cc8ed21d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"생성형 AI 는 데이터를 학습하여 새로운 콘텐츠 (문구, 이미지, 음악, 코드 등) 를 창조하는 인공지능 기술입니다. 기존의 인공지능이 데이터를 분석하거나 예측하는 데 중점을 둔 것과 달리, 생성형 AI 는 **창의적인 내용 생성**에 특화되어 있습니다. \n",
"\n",
"### 핵심 특징\n",
"1. **새로운 콘텐츠 생성**: 학습 데이터를 기반으로 질의에 따라 텍스트, 이미지, 오디오 등을 자동 만들어냅니다. \n",
" - 예: 글 작성, 그림 그리기, 노래 작곡, 코드 생성 등 \n",
"2. **패턴 학습**: 거대한 데이터셋을 분석하여 언어, 이미지, 행동 등의 패턴을 학습합니다. \n",
" - 예: GPT 시 계열의 언어 모델은 millions of texts 를 기반으로 문맥과 문법을 파악합니다. \n",
"3. **맥락 이해**: 요청 사항의 의미나 맥락을 이해하여 답변을 생성합니다. \n",
"\n",
"### 주요 기술 및 예시\n",
"- **LLM (Large Language Models)**: 텍스트를 생성하거나 답변을 제공합니다. (예: GPT-4, Llama, ChatGLM) \n",
"- **GANs (Generative Adversarial Networks)**: 이미지나 객체를 생성합니다. (예: StyleGAN) \n",
"- **Diffusion Models**: 이미지 생성에 주로 쓰입니다. (예: DALL-E 3, Stable Diffusion) \n",
"\n",
"### 활용 분야\n",
"- 콘텐츠 작성 (글, 마케팅, 스토리텔링) \n",
"- 디자인 및 예술 창작 \n",
"- 프로그래밍 및 코드 생성 \n",
"- 고객 서비스 (챗봇, 고객 문의 응답) \n",
"- 의료/교육 등 전문 분야 (의사 추천, 학습 대안 생성 등) \n",
"\n",
"### 한계 및 도전과제\n",
"- **정확성 문제 (Hallucination)**: 학습 데이터에 없는 사실을 허구적으로 생성할 수 있습니다. \n",
"- **데이터 편향**: 학습 데이터에 내재된 편향이나 민감한 정보 반영 가능. \n",
"- **윤리적 문제**: 저작권, 개인 정보 보호, 가짜 뉴스 등 고려 필요. \n",
"- **성능 최적화**: 고비용의 컴퓨팅 리소스와 에너지 소비 문제. \n",
"\n",
"생성형 AI 는 인간의 창작 활동을 보완하거나 확장하는 도구로, 기술 발전이 계속되면 더 다양한 분야에서 활용될 것으로 예상됩니다. 다만, 윤리적 문제와 안전성 관리가 함께 고려되어야 합니다.\n"
]
}
],
"source": [
"qwen_llm = ChatOllama(model=\"qwen3.5:4b\")\n",
"\n",
"response = qwen_llm.invoke(\"생성형 AI를 설명해줘\")\n",
"print(response.content)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "c1f464da",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"생성형 AI, 또는 생성적 인공지능(Generative AI)은 주로 딥러닝 기반의 모델로, 주로 데이터 생성과 변형에 특화되어 있습니다. 주요 특징과 적용 분야는 다음과 같습니다:\n",
"\n",
"1. **데이터 생성**: 생성형 AI는 텍스트, 이미지, 오디오, 비디오 등 다양한 형태의 데이터를 생성합니다. 예를 들어, 텍스트 생성 모델인 GPT 시리즈나 이미지 생성 모델인 DALL-E나 Stable Diffusion은 학습된 패턴을 바탕으로 새로운 내용이나 시각적 표현을 만들어냅니다.\n",
"\n",
"2. **텍스트 생성**:\n",
" - **GPT (Generative Pre-trained Transformer)**: 광범위한 텍스트 데이터를 학습하여 자연스러운 언어를 생성합니다. 다양한 대화형 시나리오나 창작 글쓰기에 활용됩니다.\n",
" - **BART (BERT + Transformer)**: 대화형 AI나 다중 작업에서 높은 성능을 보이며, 텍스트 생성과 변형에 효과적입니다.\n",
"\n",
"3. **이미지 생성**:\n",
" - **DALL-E**: 텍스트 설명을 기반으로 정교한 이미지를 생성합니다. 예를 들어, \"빨간색의 현대적인 건물\"이라는 문구로 해당 스타일의 이미지를 만들 수 있습니다.\n",
" - **Stable Diffusion**: 사용자 친화적인 인터페이스를 제공하며, 다양한 스타일과 해상도의 이미지를 생성할 수 있습니다.\n",
"\n",
"4. **음성 생성**:\n",
" - **Wav2Vec 2.0**: 텍스트를 자연스러운 음성으로 변환하는 데 사용됩니다. 음성 합성 및 대화형 AI 시스템에서 중요한 역할을 합니다.\n",
"\n",
"5. **응용 분야**:\n",
" - **콘텐츠 제작**: 게임, 영화, 음악 산업에서 새로운 콘텐츠 생성에 활용됩니다.\n",
" - **마케팅 및 광고**: 개인화된 콘텐츠 생성, 광고 문구 제작 등에 활용됩니다.\n",
" - **교육**: 맞춤형 학습 자료 제공 및 퀴즈 생성 등 교육 도구로 활용됩니다.\n",
" - **의료**: 질병 진단 지원이나 환자 데이터 분석 등에서 보조 역할을 합니다.\n",
"\n",
"생성형 AI는 창의성과 자동화를 결합하여 다양한 분야에서 혁신적인 변화를 가져오고 있습니다. 그러나 윤리적 고려 사항과 데이터 편향성 문제 등도 함께 고려해야 합니다.\n"
]
}
],
"source": [
"qwen_llm = ChatOllama(model=\"exaone3.5:2.4b\")\n",
"\n",
"response = qwen_llm.invoke(\"생성형 AI를 설명해줘\")\n",
"print(response.content)"
]
},
{
"cell_type": "markdown",
"id": "b5fbd806",
"metadata": {},
"source": [
"### prompttemplate\n",
"- 하나의 문자열 프롬프트 생성"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "38e55510",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"초급자 수준으로 재귀함수를 설명해줘. 예시 포함\n"
]
}
],
"source": [
"# 기본 생성\n",
"template = PromptTemplate(input_variables=['topic', 'level'], template=\"{level} 수준으로 {topic}를 설명해줘. 예시 포함\")\n",
"prompt_text = template.format(topic = \"재귀함수\", level = \"초급자\")\n",
"print(prompt_text)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "aeea9e13",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['level', 'topic']\n",
"초급자 수준으로 재귀함수를 설명해줘. 예시 포함\n"
]
}
],
"source": [
"template = PromptTemplate.from_template(\"{level} 수준으로 {topic}를 설명해줘. 예시 포함\")\n",
"print(template.input_variables)\n",
"prompt_text = template.format(topic = \"재귀함수\", level = \"초급자\")\n",
"print(prompt_text)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "95d3e237",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SQL Injection은 데이터베이스를 공격하는 한 방법으로, 공격자가 웹 애플리케이션의 데이터베이스에 악의적인 SQL 쿼리를 삽입하여 데이터를 조회, 변경, 삭제, 혹은 실행할 수 있는 위협입니다. 주로 사용자 입력을 통해 데이터베이스에 접근하는 웹 애플리케이션에 위험이 있습니다. 예를 들어, 로그인 폼에서 사용자 이름과 비밀번호를 입력할 때, 공격자가 SQL 쿼리를 조작하여 원하지 않은 데이터에 접근할 수 있습니다.\n",
"\n",
"SQL Injection 공격을 방지하기 위해서는 사용자 입력을 적절하게 검증하고, 파라미터화된 쿼리(statements)를 사용하며, 데이터베이스의 접근 권한을 최소화하는 등의 보안 조치가 필요합니다. 또한, 웹 애플리케이션에서 출력 데이터를 검증하고 정제하여 크로스 사이트 스크립팅(XSS) 공격 방지에도 도움이 됩니다.\n"
]
}
],
"source": [
"template = PromptTemplate.from_template(\"\"\"\\\n",
"다음 질문에 답하시오.\n",
"\n",
"질문:\n",
"{question}\n",
"\"\"\")\n",
"\n",
"formatted_prompt = template.format(question=\"SQL Injection 이란?\")\n",
"response = watson_lln.invoke(formatted_prompt)\n",
"print(response.content)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "9537894c",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'exaone_llm' is not defined",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[38]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m response = exaone_llm.invoke(formatted_prompt)\n\u001b[32m 2\u001b[39m print(response.content)\n",
"\u001b[31mNameError\u001b[39m: name 'exaone_llm' is not defined"
]
}
],
"source": [
"response = exaone_llm.invoke(formatted_prompt)\n",
"print(response.content)"
]
},
{
"cell_type": "markdown",
"id": "da37a8ec",
"metadata": {},
"source": [
"### ChatPromptTemplate\n",
"\n",
"- 채팅 메시지 형식\n",
"- from_template() : Human 메시지만 생성\n",
"- from_messages() : 여러 메시지를 구성할 수 있음"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "b7a9dbc0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SQL Injection은 웹 애플리케이션에 발생할 수 있는 보안 취약점 중 하나로, 해커가 악의적인 SQL 코드를 삽입하여 데이터베이스에 대한 비인가된 접근을 시도하거나 데이터베이스에 악의적인 명령을 실행하는 공격을 의미합니다. 이는 사용자 입력 데이터에 대한 충분한 검증이 이루어지지 않거나, 웹 애플리케이션의 SQL 쿼리가 외부 입력을 직접 포함하고 이를 검증하지 않을 때 발생할 수 있습니다.\n",
"\n",
"예를 들어, 웹 애플리케이션이 사용자로부터 입력받은 데이터를 SQL 쿼리에 직접 사용한다면, 해커는 이를 통해 부적절한 데이터를 삽입하거나, 이미 존재하는 SQL 쿼리에 추가적인 조건이나 명령을 포함시켜 데이터베이스에 악의적인 작업을 수행할 수 있습니다.\n",
"\n",
"SQL Injection 공격의 예로는 다음과 같은 것들이 있습니다:\n",
"1. 사용자 인증 회피: 로그인 폼에서 평범한 SQL 쿼리를 사용하는 경우, 해커는 ' OR '1'='1'과 같은 문자열을 입력함으로써 SQL 쿼리를 조작하여 인증 절차를 우회할 수 있습니다.\n",
"2. 데이터 삭제나 변경: DELETE, UPDATE 등의 명령을 사용하여 데이터를 삭제하거나 변경하는 공격이 가능합니다.\n",
"3. 데이터베이스 스키마 조사: UNION 명령어를 사용하여 데이터베이스의 구조나 다른 테이블의 정보를 탐색할 수 있습니다.\n",
"\n",
"SQL Injection 공격을 방지하기 위한 방법으로는 다음과 같은 것들이 있습니다:\n",
"1. 사용자 입력 데이터의 정규화와 검증: 입력 데이터가 올바른 형식과 크기를 가지고 있는지 확인해야 합니다.\n",
"2. 파라미터화된 쿼리 사용: 쿼리를 파라미터화하여 사용하면, 데이터베이스가 외부 입력을 직접 SQL 명령으로 해석하는 것을 방지할 수 있습니다.\n",
"3. 최소 권한 원칙 적용: 웹 애플리케이션의 데이터베이스 연결에 필요한 권한을 최소한으로 제한하여, 공격자가 얻을 수 있는 정보를 제한합니다.\n",
"4. 웹 애플리케이션 방어 기술 사용: Web Application Firewall (WAF)와 같은 보안 기술을 사용하여 SQL Injection 공격을 탐지하고 차단할 수 있습니다.\n",
"\n",
"SQL Injection 공격은 웹 애플리케이션의 보안에 심각한 위협이므로, 개발자와 보안 전문가들은 이를 예방하기 위해 신중한 설계와 철저한 검증을 수행해야 합니다.\n"
]
}
],
"source": [
"template = ChatPromptTemplate.from_template(\"\"\"\\\n",
"다음 질문에 답하시오.\n",
"\n",
"질문:\n",
"{question}\n",
"\"\"\")\n",
"\n",
"formatted_prompt = template.format(question=\"SQL Injection 이란?\")\n",
"response = watson_lln.invoke(formatted_prompt)\n",
"print(response.content)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "24d4bcdb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"파이썬에서 리스트 컴프리헨션은 리스트를 생성하는 간단하고 직관적인 방법입니다. 리스트 컴프리헨션을 사용하면, 기존 리스트나 반복 가능한 객체로부터 새로운 리스트를 만들 수 있으며, 이 과정에서 조건문과 함수를 적용할 수도 있습니다.\n",
"\n",
"리스트 컴프리헨션의 일반적인 형태는 다음과 같습니다:\n",
"\n",
"```python\n",
"[expression for item in iterable if condition]\n",
"```\n",
"\n",
"여기서, \n",
"- `expression`은 새로운 리스트의 요소를 만들어주는 표현식(expression)입니다.\n",
"- `item`은 반복 가능한 객체로부터 하나씩 가져오는 변수입니다.\n",
"- `iterable`은 반복 가능한 객체입니다.\n",
"- `condition`은 선택적인 조건문으로, 이 조건을 만족하는 `item`들만 새로운 리스트에 포함됩니다.\n",
"\n",
"예를 들어, 다음과 같이 리스트 컴프리헨션을 사용하면 1부터 10까지의 제곱 값을 가진 리스트를 만들 수 있습니다:\n",
"\n",
"```python\n",
"squares = [x**2 for x in range(1, 11)]\n",
"print(squares)\n",
"# Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n",
"```\n",
"\n",
"또한, 조건을 추가하여 홀수의 제곱만을 리스트에 포함시킬 수도 있습니다:\n",
"\n",
"```python\n",
"odd_squares = [x**2 for x in range(1, 11) if x % 2 != 0]\n",
"print(odd_squares)\n",
"# Output: [1, 9, 25, 49, 81]\n",
"```\n",
"\n",
"리스트 컴프리헨션은 간결하고 읽기 쉽기 때문에 파이썬에서 많이 사용됩니다. 또한, 속도도 매우 빠릅니다.\n"
]
}
],
"source": [
"template = ChatPromptTemplate.from_messages(\n",
" [\n",
" (\"system\", \"당신은 {role} 전문가입니다. {language}로 답변하세요.\"),\n",
" (\"human\", \"{question}\"),\n",
" ]\n",
")\n",
"\n",
"formatted_prompt = template.format(role = \"파이썬\", language=\"한국어\", question=\"리스트 컴프리헨션이란?\")\n",
"response = watson_lln.invoke(formatted_prompt)\n",
"print(response.content)"
]
},
{
"cell_type": "markdown",
"id": "3144aa77",
"metadata": {},
"source": [
"#### LCEL 파이프라인\n",
"- LCEL(LangChain Expression Language) : | 연산자로 컴포넌트를 연결하는 파이프라인 문법\n",
" - ex) prompt | llm | parser => 왼쪽에서 오른쪽으로 데이터가 흐르게(처리) 됨\n",
"- invoke() : 단일 동기 호출 / stream() : 스트리밍 / batch() : 여러 입력 병렬 처리"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a38e8147",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"XSS(크로스-사이트 스크립팅)는 웹 보안 취약점 중 하나로, 악의적인 스크립트 코드를 웹 페이지에 삽입하여 사용자의 정보를 탈취하거나 웹사이트를 조작하는 공격입니다. XSS 공격을 통해 공격자는 사용자의 세션 정보, 쿠키, 로그인 정보 등을 탈취할 수 있으며, 이를 통해 사용자의 계정을 훔쳐 사용하거나 개인 정보를 수집할 수 있습니다.\n",
"\n",
"XSS 공격은 주로 웹사이트에 입력 폼이나 다른 사용자가 입력한 데이터가 포함된 곳에 악의적인 스크립트 코드를 삽입하는 방식으로 이루어집니다. 이 스크립트 코드는 다른 사용자가 해당 웹 페이지를 방문할 때 실행되어 개인 정보를 탈취하거나 웹 페이지의 내용을 변경하는 등의 악의적인 행동을 수행할 수 있습니다.\n",
"\n",
"XSS 공격에 대한 대책으로는 웹 개발자가 사용자 입력을 적절히 검증하고, 출력 시에 적절한 인코딩을 수행하여 악의적인 스크립트가 실행되지 않도록 해야 합니다. 또한 사용자는 신뢰할 수 있는 웹사이트만 방문하고, 브라우저의 보안 기능을 최대한 활용하는 것이 중요합니다.\n"
]
}
],
"source": [
"prompt = ChatPromptTemplate.from_messages(\n",
" [\n",
" (\"system\", \"당신은 {role} 전문가입니다.\"),\n",
" (\"human\", \"{question}\"),\n",
" ]\n",
")\n",
"\n",
"chain = prompt | watson_llm\n",
"\n",
"# formatted_prompt = prompt.format(role = \"보안\", question=\"XSS란?\")\n",
"response = chain.invoke({\n",
" \"role\": \"보안\",\n",
" \"question\" : \"XSS란?\"\n",
"})\n",
"\n",
"print(response.content)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (Ollama Venv)",
"language": "python",
"name": "ollama-venv"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
+1069
View File
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
async function logJSONData() {
const response = await fetch("http://localhost:11434/api/chat", {
method:"post",
headers:{"Content-Type":"application/json"},
body:JSON.stringify({
model:'qwen2.5',
message: [
{"role": "system", "content": "당신은 친절한 AI 어시스턴트입니다."},
{"role": "user", "content": "파이썬의 장점을 3가지 알려주세요."},
],
stream:false
})
});
const jsonData = await response.json();
console.log(jsonData.message.content);
}
logJSONData