Ⅰ. 오전 수업
A. 1교시
1. 지난 시간 복습
2. JS 코드 파일로 분리하기
3. jQuery 라이브러리
B. 2교시
1. jQuery 라이브러리 (cont.)
C. 3교시
1. jQuery 라이브러리 (cont.)
Ⅱ. 오후 수업
A. 4교시: LangChain
1. LLM 이해하기
B. 5교시
1. LLM 이해하기 (cont.)
C. 6교시
1.LangChain으로 LLM 연동하기
Ⅲ. CARRER UP
A. 네이버 클라우드 특강
Ⅳ. 하루 돌아보기
vanila JS: 프론트엔드 라이브러리(리엑트, 뷰, 앵귤러 등) 사용하지 않고 작업한 경우를 지칭
jQuery 라이브러리
비동기 통신
<link rel="stylesheet" href="style.css">로 연결하고 head에 쓰지만 JS 파일은 <script src="function.js"></script>로 연결하고 body 맨 밑에 작성한다






이래서 세미콜론 잘 적으라고 하신 거구나!

접근을 jQuery로 했다면 명령도 모두 jQuery로 처리해야 함!

hasClass추가: 토글 클래스라는 기법도 있음(add와 remove가 합쳐진 형태)
함수를 연결해서 쓰는 것도 가능
요즘 쓰는 라이브러리(라액트, 뷰, 앵귤러 등)는 document를 직접 제어하지 않고 가상 DOM을 이용해 함수로 접근하기 때문에 jQuery 사용 빈도도 줄어들었습니다.
이제까지 배운 건 대규모 언어 모델 개발 과정 → 여기부터는 '활용법'!

Your profile 클릭User API keys 클릭 → Create new secrete key 버튼을 클릭


⚠️주의사항 : API 키는 한 번만 제공됨, 복사하여 개인 메모장(또는 마크다운)에 저장해둘 것을 권장
# api key 파일로 저장(최초 1회만)
import os
if not os.path.exists("./key"):
os.mkdir("./key")
# api_key
api_key = "★자신의 API 키 입력★"
with open("./key/.openai_api_key", 'w') as f:
f.write(api_key)
# 앞으로 사용할 때에는
# 구글 마운트 → 저장된 api_key 불러서 사용
with open("./key/.openai_api_key", 'r') as f:
api_key = f.read().strip()
# 환경 변수 설정
# 환경 변수는 딕셔너리 형태
os.environ["OPENAI_API_KEY"] = api_key # environ: an abbreviation for environment
!pip install -U langchain langchain-openai
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
llm.invoke("오늘 저녁 메뉴 추천해 줘.")
AIMessage(content='저녁 메뉴로는 불고기와 삼겹살을 함께 먹는 "삼겹살 불고기 세트"를 추천해 드립니다. 쫄깃한 삼겹살과 고기가 어우러진 맛은 일품이에요. 쌈과 상추, 마늘 등과 함께 식사하면 더욱 맛있답니다. 많이 드세요.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 133, 'prompt_tokens': 25, 'total_tokens': 158, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'id': 'chatcmpl-C8K2tRGMy0YbXYdYHm0nDroZv3uLb', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--91ea209b-cd3b-486b-8064-755f12d67418-0', usage_metadata={'input_tokens': 25, 'output_tokens': 133, 'total_tokens': 158, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
res = llm.invoke("영어 단어 'invoke' 뜻이 뭔가요? 해당 단어는 어디에서 유래했나요? 혹시 라틴어인가요?")
res.content
'invoke'는 누군가를 부르거나 참조하거나, 또는 법적인 권리나 규칙을 새롭게 활용하거나 요청하는 것을 의미합니다. 이 단어는 라틴어에서 유래되었으며, "invocare"라는 라틴어 동사에서 파생되었습니다. "invocare"는 "호출하다"나 "기도하다"를 의미하며, 영어로 번역되면 'invoke'가 됩니다.
res.response_metadata
{'token_usage': {'completion_tokens': 153,
'prompt_tokens': 57,
'total_tokens': 210,
'completion_tokens_details': {'accepted_prediction_tokens': 0,
'audio_tokens': 0,
'reasoning_tokens': 0,
'rejected_prediction_tokens': 0},
'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}},
'model_name': 'gpt-3.5-turbo-0125',
'system_fingerprint': None,
'id': 'chatcmpl-C8K5Ny4FjvEZ0Ark3IWwVuRdi45gd',
'service_tier': 'default',
'finish_reason': 'stop',
'logprobs': None}
llm.stream("★질문 내용★) 하면 실시간으로 입력하듯이 출력됨
llm_model4o = ChatOpenAI(model="gpt-4o-mini", max_tokens=1000, temperature=0)llm_model4o.invoke("불닭볶음면이 전 세계에서 얼마나 유명하니?")
AIMessage(content='불닭볶음면은 전 세계적으로 매우 유명한 한국의 인스턴트 면 중 하나입니다. 이 제품은 특히 매운 맛과 독특한 풍미로 많은 사람들에게 사랑받고 있습니다. \n\n불닭볶음면은 유튜브와 소셜 미디어에서 다양한 챌린지와 리뷰 영상으로 인기를 끌었으며, 많은 외국인들이 매운 음식을 도전하는 콘텐츠에서 자주 등장합니다. 또한, 한국 음식에 대한 관심이 높아지면서 불닭볶음면은 해외에서도 쉽게 구할 수 있는 제품이 되었습니다.\n\n이 외에도 불닭볶음면은 다양한 맛과 형태로 출시되어 소비자들의 선택 폭을 넓혔고, 이를 통해 더욱 많은 사람들에게 알려지게 되었습니다. 전 세계적으로 한국 음식의 인기가 높아짐에 따라 불닭볶음면도 그 인기를 이어가고 있습니다.', additional_kwargs={'refusal': None}, (이하생략)
→ max_token을 사용해 content 내용이 길어졌음

|(vertical bar) 기호를 사용하여 체인 연결을 진행prompt | llm | OutputParser와 같이 체인이 연결된 경우
# 프롬프트 탬플릿 지정
from langchain_core.prompts import PromptTemplate
# 수도를 물어보는 템플릿에 모델을 연결하는 체인 생성
prompt = PromptTemplate.from_template("{country}의 수도는 어디야?")
# 모델 불러오기
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
chain = prompt|llm
# 체인
print(chain.invoke({"country":"한국"}))
content='한국의 수도는 서울이다.' additional_kwargs={'refusal': None} (이하생략)
# 기본 LLM 사용 시
llm.invoke("오늘은 기분이 좋아").content
요! 기분이 좋으시다니 정말 좋아요. 좋은 일 있으셨나요? 함께 기쁨을 나눌 수 있어서 기뻐요. 웃음 가득한 하루 보내세요! 😊
template = "{sentence} 문장의 감성을 분석해 줘"
# 템플릿 객체 생성
pormpt2 = PromptTemplate.from_template(template)
# 체인 연결
chain2 = pormpt2|llm
# 결과 확인
print(chain2.invoke({"sentence": "오늘은 기분이 좋아"}))
content='오늘은 기분이 좋아\n\n긍정적인 감성을 풍깁니다. 오늘의 기분이 양호하고 즐거운 것으로 보입니다.행복한 일이 있었을 가능성이 높아보입니다. 오늘 하루가 기분 좋게 지내셨으면 좋겠습니다.' additional_kwargs={'refusal': None} (이하생략)
csp → iaas