Ⅰ. 오전 수업
A. 1교시
1. 지난 시간 복습
2. 실습: 로그인 성공/실패 이동
B. 2교시
1. 실습: 로그인 성공/실패 이동 (cont.)
2. post 방식
C. 3교시
1. 실습: POST 방식 데이터 처리
Ⅱ. 오후 수업
A. 4교시
1. 지난 시간 복습
2. RAG: PDF 학습 챗봇
B. 5교시
1. RAG: PDF 학습 챗봇 (cont.)
2. RAG: 웹 페이지 학습 챗봇
C. 6교시
1. RAG: 웹 페이지 학습 챗봇 (cont.)
Ⅲ. CAREER UP
현직자 특강
Ⅳ. 하루 돌아보기
지금 배우는 노드 개념은 모두 서버 구성 요소, 개념 정리를 위한 예전 서버 & 라이트한 내용 (현재는 잘 쓰이지 않는 방식임)
왜 현업에서 프레임워크를 쓰는 건지 이해하기 위한 빌드업입니다~
.write() 함수res.write();.end()와 함께 써야 함
옛날 전화선으로 인터넷하던 것 생각하면 쉬움 → 선을 점유하고 있으면 계속 통화중으로 뜸 → 회선은 무한대가 아니니까 모든 응답이 끝나면 반드시 연결을 끊어줘야 함! (요즘은 자동으로 끊어줌)
.writeHead() 함수action="http://localhost:3000" method="get"url.parse(req.url,true).query;const http = require("http");
const url = require("url");
const fs = require("fs").promises;
http.createServer(async (req,res)=>{
let data = url.parse(req.url,true).query;
let success = await fs.readFile("./login_success.html");
let failed = await fs.readFile("./login_failed.html");
if(data.id==="test"&&data.pw==="1234"){
res.write(success);
}else{
res.write(failed);
}
res.end();
}).listen(3000);
서버 통신의 가장 중요한 개념은 데이터의 흐름 파악
→ 항상 데이터의 흐름을 따라가며 접근하기
/*
실습 목표: login.html에서 보낸 데이터를 서버에서 조회
* 포인트: get 방식의 조회 방식 학습 → 모든 데이터가 url에 담겨 온다.
*/
const http = require("http");
// url 데이터를 객체 형태로 변환하는 모듈 → GET 방식과 세트
const url = require("url");
const fs = require("fs").promises;
http.createServer((req,res)=>{
}).listen(3000);
req.url → "/?id=test&pw=1234" 문자열 형태 → 객체로 변환 필요const http = require("http");
const url = require("url");
const fs = require("fs").promises;
http.createServer((req,res)=>{
// string을 객체 형태로 변환
let data = url.parse(req.url,true).query;
}).listen(3000);
true: queryString으로 확장하겠다는 의미.query: 쿼리 안에 있는 데이터만 쓰겠다는 의미
url.parse()로 반환된 url 객체에는 port, path 등 url의 정보가 잘 정리된 상태로 저장되어 있음
여기서 우리가 필요한 것은 query의 내용이기 때문에, url.parse().query를 따로 저장해 주는 것
const http = require("http");
const url = require("url");
const fs = require("fs").promises;
http.createServer(async (req,res)=>{
let data = url.parse(req.url,true).query;
if(data.id == "test" && data.pw == "1234"){
let success = await fs.readFiole("./로그인성공.html");
res.write(success);
}else{
let fail = await fs.readFiole("./로그인실패.html");
res.write(fail);
}
res.end();
}).listen(3000);
const http = require("http");
const url = require("url");
const fs = require("fs").promises;
http.createServer(async (req,res)=>{
// 변수 관리 영역 (데이터 준비)
let data = url.parse(req.url,true).query;
let success = await fs.readFiole("./로그인성공.html");
let fail = await fs.readFiole("./로그인실패.html");
// 로직 실행 영역
if(data.id == "test" && data.pw == "1234"){
res.write(success);
}else{
res.write(fail);
}
res.end();
}).listen(3000);
express는 async/await, parse 모두 알아서 해 주기 때문에 해당 내용 이해만 하고 넘어가기~

원리만 기억하기!
(지금은 사용 잘 안 하는 문법임)
const http = require("http");
http.createServer((req,res)=>{
}).listen(3000);
const http = require("http");
http.createServer((req,res)=>{
req.on("data",(data)=>{
console.log(data);
})
}).listen(3000);
<Buffer 69 64 3d 68 65 6c 6c 6f 26 70 77 3d 25 36 30 31 32 33> → ASCII Code Hex → 컴퓨터는 여기서 한 번 더 이진법으로 변환해서 읽음const http = require("http");
http.createServer((req,res)=>{
let body = "";
req.on("data",(data)=>{
console.log(data);
body += data;
console.log(body);
});
}).listen(3000);
<Buffer 69 64 3d 74 65 73 74 26 70 77 3d 31 32 33 34>
id=test&pw=1234

★★★ POST 데이터는 body라는 공간에 저장한다 ★★★
get → url, post → body
querystringconst http = require("http");
// post 방식에서 String → Object 모듈 (get 방식의 url 모듈과 역할이 비슷)
const qs = require("querystring");
http.createServer((req,res)=>{
// 1. POST로 받아 온 buffer 데이터를 String으로 변환하는 영역
// * POST 데이터는 body라는 공간에 저장한다 ✨
let body = ""; // let body; 해도 된다고 함
req.on("data",(data)=>{
console.log(data);
body += data;
console.log(body);
});
// 2. String으로 변환한 데이터를 객체로 활용하는 영역
req.on("end",()=>{
// String → Object
let data = qs.parse(body);
console.log(data);
})
}).listen(3000);

숨길 필요가 없는 데이터는 숨기지 않는 게 기본 전략입니다. (숨기는 것도 비용이기 때문)
메모리적으로 볼 때 숨기는 건 데이터 낭비임
PDF 문서 기반 QA(Question-Answer) 사이트 내용과 함께 보기!
《RAG 프로세스》 1. 사전 작업(Pre-processing): 1-4단계 - 문서 로드 및 Vector DB 저장 - 데이터 소스(문서)를 로드-분할-임베딩-Vector DB(저장소)에 저장하는 4단계 ① 문서 로드(Load) - 문서(pdf, word), RAW DATA, 웹 페이지, Notion 등의 데이터 읽기 ② 분할(Split) - 불러온 문서를 특정 기준(chunk 단위)으로 분할 ③ 임베딩(Embedding) - 문서를 벡터 표현으로 변환(분할된 chunk를 임베딩하여 저장) ④ 벡터DB(VectorStore) - 변환된 벡터를 DB에 저장(임베딩된 chunk를 DB에 저장) 2. RAG수행(RunTime): 5-8단계 - 문서 검색 및 결과 도출 ⑤ 검색(Retrieval) - 유사도 검색(similarity, mmr) - Multi-Query - Mini-Retriever ⑥ 프롬프트(Prompt) - 검색된 결과를 바탕으로 원하는 결과를 도출하기 위한 프롬프트 - RAG를 수행하기 위한 프롬프트 생성 → 프롬프트 엔지니어링을 통해 답변 형식 지정 가능 - 프롬프트의 {context}에는 문서에서 검색된 내용이 입력됨 ⑦ 모델(LLM) - 모델 선택: GPT-3.5, GPT-4, Claude, etc. ⑧ 결과(Output) ← 체인(Chain) - '프롬프트 - LLM - 출력'에 이르는 체인을 생성 - 출력 → 텍스트, JSON, 마크다운※ 검색기(Retriever)?
- 쿼리(Query)를 바탕으로 DB에서 검색하여 결과를 가져오기 위해 '리트리버'를 정의
- 리트리버: 검색 알고리즘
- Dense 리트리버와 Sparse 리트리버로 나뉨
- Dense: 유사도 기반 검색
- Sparse: 키워드 기반 검색

RecursiveCharacterTextSpliter["\n\n", "\n", ,] → 문단, 문장, 단어 재귀적 분할from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter_2 = RecursiveCharacterTextSplitter(
chunk_size = 500
, chunk_overlap = 50
, length_function = len
)
# 단계별로 문단 → 문장 → 단어 순으로 분리해나가기 때문에 separater를 작성할 필요가 없다
# 토큰화
chunk_2 = text_splitter_2.split_documents(document)
# 청크 수 출력
print(f"분리된 청크의 수: {len(chunk_2)}")
21
지원되는 모델 목록
| MODEL | PAGES PER DOLLAR | PERFORMANCE ON MTEB EVAL | MAX INPUT |
|---|---|---|---|
| text-embedding-3-small | 62,500 | 62.3% | 8191 |
| text-embedding-3-large | 9,615 | 64.6% | 8191 |
| text-embedding-ada-002 | 12,500 | 61.0% | 8191 |
OpenAIEmbeddings: 모델 임베딩 도구와 맞춰주기 위함Chroma: python 언어에 친화적 벡터 DBfrom langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 텍스트를 임베딩 후 DB에 저장
vec_db =Chroma.from_documents(documents=chunk_2, embedding=OpenAIEmbeddings())
→ Chroma에게 내 document(chunk_2)를 임베딩(도구: OpenAIEmbeddings())한 다음 저장해달라고 요청하는 것
→ vec_db가 벡터 저장소 역할을 함

# 검색 기능 설정
retriever = vec_db.as_retriever(search_kwargs={"k":2})
RetrievalQAWithSourcesChain: '검색 → 응답'을 자동으로 처리해 주는 체인 클래스from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQAWithSourcesChain
chat_prompt = ChatPromptTemplate.from_messages([
("system", "{summaries}")
, ("human", "{question}")
])
# 모델 생성
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
# 체인 생성 → 프롬프트, 모델, 벡터 DB
chain = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm # LLM
, retriever=retriever # 벡터 DB
, chain_type_kwargs={"prompt":chat_prompt} # 프롬프트 템플릿
)
chain.invoke("위 파일은 어떤 내용인가요?")
{'question': '위 파일은 어떤 내용인가요?',
'answer': '위 파일은 AI(인공지능)를 개인적인 용도와 업무에서 어떻게 활용할 수 있는지에 대한 내용을 다루고 있습니다. AI를 사용해보면서 익히는 태도의 중요성을 강조하며, 다양한 상황에서 AI를 활용하는 방법을 제시하고 있습니다. 또한, AWS와 같은 기업이 내부 교육 프로그램을 통해 직원들이 AI 관련 역량을 개발하고 인증을 취득하도록 지원하는 내용도 포함되어 있습니다. 이 파일은 AI의 실질적인 활용과 교육에 대한 정보를 제공하고 있습니다.',
'sources': ''}
query = input("질문을 입력하세요.")
result = chain.invoke({"question":query})
print(result["answer"])
질문을 입력하세요.위 파일이 시사하는 내용은?
위 파일은 AI(인공지능)의 중요성과 그 활용 가능성에 대해 설명하고 있습니다. 첫 번째 내용에서는 개인적인 용도로 AI를 활용하는 방법을 제시하며, AI를 직접 사용해보면서 그 가능성을 이해하는 것이 중요하다고 강조하고 있습니다. 이는 AI가 일상생활에서도 유용하게 사용될 수 있음을 시사합니다.
두 번째 내용에서는 기업에서 AI 역량을 갖춘 인재의 중요성을 강조하고 있습니다. 많은 기업들이 AI 역량을 갖춘 인재를 채용하는 것을 최우선 과제로 삼고 있지만, 적합한 인재를 찾는 데 어려움을 겪고 있다는 조사 결과를 제시합니다. 또한, AI 역량을 보유한 인력은 평균적으로 더 높은 급여를 받을 수 있으며, 기업들이 이러한 인재에게 더 많은 급여를 지급할 의향이 있음을 보여줍니다. 이는 AI 역량이 기업의 경쟁력 강화에 중요한 요소로 자리 잡고 있음을 시사합니다.
query = input("질문을 입력하세요")
result = chain.invoke(query)
print(f"📌질문: {result['question']}")
print(f"🤖답변: {result['answer']}")
질문을 입력하세요미래 필수 역량 5가지 정리해주세요.
📌질문: 미래 필수 역량 5가지 정리해주세요.
🤖답변: 미래에 필수적인 역량으로는 다음과 같은 다섯 가지를 들 수 있습니다:
1. **AI 활용 능력**: AI 기술이 빠르게 발전함에 따라, 이를 일상적인 업무에 혁신적으로 활용할 수 있는 능력이 중요해지고 있습니다. AI를 어떻게 활용할 수 있을지 고민하고, 다른 사람의 활용 방식을 관찰하며 적극적으로 탐색하는 태도가 필요합니다.
2. **창의적 문제 해결 능력**: 단순히 다른 사람의 방식을 모방하는 것이 아니라, 이를 기반으로 새로운 아이디어를 창출할 수 있는 능력이 중요합니다. 창의적 사고를 통해 문제를 해결하고 혁신을 이끌어낼 수 있어야 합니다.
3. **고급 개발 역량**: 단순한 코딩 작업의 중요성은 줄어들고 있으며, 개발자는 무엇을 개발할지 깊이 고민하고, 설계 및 아키텍처를 개선하는 역량이 필요합니다. 코드의 품질을 보장하고 유지하는 능력도 중요합니다.
4. **지속적인 학습과 호기심**: AWS의 '배우고 호기심을 가지라'는 원칙처럼, 지속적으로 배우고 새로운 것에 호기심을 가지는 태도가 중요합니다. 이는 AI 시대에 누구나 가져야 할 핵심 역량입니다.
5. **협업과 커뮤니케이션 능력**: 복잡한 문제를 해결하기 위해 다양한 분야의 사람들과 협업하고 효과적으로 소통할 수 있는 능력이 필요합니다. 팀워크와 커뮤니케이션은 성공적인 프로젝트 수행에 필수적입니다.
# 간단한 형태의 챗봇 구성해보기 (while문)
while True:
# 사용자 입력
query = input("입력: ")
# 조건문을 활용한 종료
if query == "exit":
print("채팅을 종료합니다👋")
break
# 결과출력
result = chain.invoke(query)
print(f"📌질문: {result['question']}")
print(f"🤖답변: {result['answer']}")
print('-'*50)
입력: 안녕?
📌질문: 안녕?
🤖답변: 안녕하세요! 어떻게 도와드릴까요?
--------------------------------------------------
입력: 넌 어떤 내용을 학습했니?
📌질문: 넌 어떤 내용을 학습했니?
🤖답변: 저는 다양한 주제와 분야에 대한 정보를 학습했습니다. 예를 들어, 인공지능, 머신러닝, 자연어 처리, 데이터 과학, 기술 트렌드, 역사, 문화, 과학, 수학 등 여러 분야에 걸쳐 있습니다. 또한, 최신 기술 발전, 산업 동향, 사회적 이슈 등에 대한 정보도 포함되어 있습니다. 이를 통해 사용자에게 유용한 정보를 제공하고 질문에 답변할 수 있도록 설계되었습니다.
--------------------------------------------------
입력: 내가 준 pdf 내용에 대해 알고 있니?
📌질문: 내가 준 pdf 내용에 대해 알고 있니?
🤖답변: 네, 제공된 PDF의 내용에 대해 알고 있습니다. 이 문서는 AI와 관련된 역량 개발의 중요성을 강조하며, AWS와 같은 기업들이 내부 교육 프로그램을 통해 직원들이 AI 관련 인증을 취득하도록 지원하는 내용을 포함하고 있습니다. 또한, 개인적인 용도로 AI를 활용해보는 것이 중요하다는 점을 언급하며, 이를 통해 AI의 실제 활용 가능성을 업무와 일상생활에서 더욱 명확하게 이해할 수 있다고 설명하고 있습니다.
--------------------------------------------------
입력: AWS에서 말하는 필수역량 5가지 말해줘
📌질문: AWS에서 말하는 필수역량 5가지 말해줘
🤖답변: AWS에서 강조하는 필수 역량은 다음과 같습니다:
1. **AI 이해 및 활용 능력**: AI가 무엇인지 기본적으로 이해하고, 이를 실제 업무에서 어떻게 활용할 수 있는지를 학습하는 것이 중요합니다.
2. **생성형 AI 활용 능력**: 생성형 AI에 대한 전문 지식과 이를 활용하는 역량이 필요합니다.
3. **핵심 소프트 스킬**: 기술적 역량뿐만 아니라 커뮤니케이션, 문제 해결 능력 등과 같은 소프트 스킬도 필수적입니다.
4. **지속적인 학습 및 역량 개발**: 변화하는 기술과 비즈니스 환경에 적응하기 위해 지속적으로 학습하고 역량을 개발하는 자세가 필요합니다.
5. **AI 공인 프랙티셔너 인증**: 역할에 따라 최소한 AI 공인 프랙티셔너(AI Practitioner) 인증을 취득하는 것이 요구됩니다.
이러한 역량들은 AWS뿐만 아니라 현대의 많은 기업들이 중요하게 여기는 요소들입니다.
--------------------------------------------------
입력: 이 문서에서 '생성형 AI 활용 능력'이 왜 중요하다고 했어?
📌질문: 이 문서에서 '생성형 AI 활용 능력'이 왜 중요하다고 했어?
🤖답변: 문서에서는 '생성형 AI 활용 능력'이 중요하다고 언급한 이유로, 이는 대부분의 사람들이 아직 갖추지 못한 기술이며, 미래에 필수적인 역량이 될 것이라고 설명하고 있습니다. 생성형 AI의 기본 개념을 익히고 프롬프트 엔지니어링을 학습하는 것이 중요하며, 이러한 기술을 통해 창의성을 발휘하고 새로운 방식으로 사고하며 비판적 사고를 통해 문제를 해결하는 역량이 점점 더 중요해지고 있다고 강조하고 있습니다. AI 도구를 활용하여 원하는 결과를 얻지 못했을 때, 그 이유를 분석하고 접근 방식을 조정할 수 있는 능력이 필요하다고도 설명하고 있습니다.
--------------------------------------------------
입력: AWS는 AI 도구를 통해 개발자 생산성을 어떻게 높이려고 해?
📌질문: AWS는 AI 도구를 통해 개발자 생산성을 어떻게 높이려고 해?
🤖답변: AWS는 AI 도구를 통해 개발자의 생산성을 높이기 위해 여러 가지 전략을 추진하고 있습니다. 그 중 하나는 AI 코딩 도구인 '아마존 Q 개발자(Amazon Q Developer)'를 활용하는 것입니다. 이 도구를 통해 두 가지 주요 목표를 달성하고자 합니다. 첫째, 개발 속도를 높여 고객을 위한 솔루션을 더욱 빠르게 구축할 수 있도록 지원합니다. 둘째, 더 높은 품질의 코드를 빠르게 작성하여 전반적인 업무 효율성을 향상시키는 것입니다. 이러한 도구들은 개발자들이 더 효율적으로 작업할 수 있도록 돕고, 결과적으로 생산성을 크게 향상시킬 수 있습니다.
--------------------------------------------------
입력: AWS가 내부 교육에서 강조한 자격증이나 과정은 뭐였어?
📌질문: AWS가 내부 교육에서 강조한 자격증이나 과정은 뭐였어?
🤖답변: AWS가 내부 교육에서 강조한 자격증은 'AWS 공인 AI 프랙티셔너(AWS Certified AI Practitioner)'입니다. 이 자격증은 직원들이 AI 관련 역량을 개발하고, 역할에 따라 최소한 이 인증을 취득하도록 장려하고 있습니다. 또한, 'AWS 공인 머신러닝 엔지니어 어소시에이트(AWS Certified Machine Learning Engineer Associate)' 시험도 강조되고 있으며, 이 과정의 베타 참가자 수가 기존 평균 대비 크게 증가했습니다.
--------------------------------------------------
입력: exit
채팅을 종료합니다👋
# 라이브러리 불러오기
from langchain_community.document_loaders import WebBaseLoader
import bs4
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS, Chroma # Vector DB
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_teddynote.messages import stream_response
from langchain_openai import ChatOpenAI
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.chains import RetrievalQAWithSourcesChain
| 라이브러리/모듈 | 기능 설명 |
|---|---|
bs4 | 웹페이지를 파싱하고 HTML/XML 구조에서 텍스트 데이터를 추출하는 라이브러리 (BeautifulSoup) |
langchain_community.document_loaders.WebBaseLoader | 웹사이트에서 텍스트를 로딩하고 LangChain의 문서 객체로 변환 |
langchain_text_splitters.RecursiveCharacterTextSplitter | 텍스트를 문단 → 문장 → 단어 등 계층적으로 나누어 청크 단위로 분할 |
langchain_openai.OpenAIEmbeddings | OpenAI 모델을 사용하여 텍스트를 벡터(임베딩)로 변환 |
langchain.vectorstores.FAISS | 벡터 데이터베이스 중 하나로, 벡터 간 유사도 기반 검색 수행 |
langchain_core.prompts.PromptTemplate | 입력값을 프롬프트 템플릿에 채워 넣어 LLM 호출용 프롬프트 생성 |
langchain_core.runnables.RunnablePassthrough | 입력을 변경하지 않고 그대로 다음 단계로 전달하는 연결용 Runnable |
langchain_core.output_parsers.StrOutputParser | LLM의 출력 결과를 문자열로 파싱해 후처리 용도로 사용 |
langchain_teddynote.messages.stream_response | 스트리밍 방식으로 LLM 응답을 처리하는 기능 (Teddynote 확장 모듈) |
langchain_openai.ChatOpenAI | OpenAI의 GPT 모델을 LangChain에서 채팅형 LLM으로 사용 |
# 웹 페이지를 읽어주는 로더
url = "https://n.news.naver.com/article/437/0000440499?sid=103"
loader = WebBaseLoader(
web_paths=[url]
, bs_kwargs=dict(
parse_only = bs4.SoupStrainer(
"div"
, attrs={"class":["newsct_article _article_body","media_end_head_title"]}
)
)
)
# 우리의 문서
docs = loader.load()
# RecursiveCharacterTextSplitter 객체 생성 (청크 최대 개수 1000, 겹치는 부분 100자)
# 문서를 Chunk 단위로 분리하기 (docs)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000
, chunk_overlap=100
, length_function=len
)
chunks = text_splitter.split_documents(docs)
# RecursiveCharacterTextSplitter 객체 생성 (청크 최대 개수 1000, 겹치는 부분 100자)
# 문서를 Chunk 단위로 분리하기 (docs)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000
, chunk_overlap=100
, length_function=len
)
chunks = text_splitter.split_documents(docs)
# 벡터화(임베딩) → FAISS DB 활용 → DB 저장
# 검색기 설정 (유사 2개 데이터 활용)
vec_db = FAISS.from_documents(documents=chunks, embedding=OpenAIEmbeddings())
retriever = vec_db.as_retriever(search_kwargs=dict(k=2))
# 단순 프롬프트 (해당 웹 페이지 정보에서 찾을 수 없다면 '주어진 정보에서 찾을 수 없습니다.' 출력)
prompt = ChatPromptTemplate.from_template("""
너는 웹 페이지 안의 정보를 알려주는 AI 챗봇이야.
주어진 정보:
{summaries}
질문: {question}
만약 주어진 정보에 내용이 없다면 '주어진 정보에서 질문에 대한 정보를 찾을 수 없습니다.'라고 답변해줘.
""")
# LLM 객체 생성
llm = ChatOpenAI(
model_name="gpt-4o-mini"
, temperature=0
)
# 체인 객체 생성
chain = RetrievalQAWithSourcesChain.from_chain_type(
llm, retriever=retriever, return_source_documents=True,
chain_type_kwargs={"prompt": prompt}
)
while True:
# 사용자 입력
query = input("입력: ")
# 조건문을 활용한 종료
if query == "exit":
print("채팅을 종료합니다👋")
break
# 결과출력
result = chain.invoke(query)
print(f"📌질문: {result['question']}")
print(f"🤖답변: {result['answer']}")
print('-'*50)
입력: 광주의 날씨는 어떤가요?
📌질문: 광주의 날씨는 어떤가요?
🤖답변: 광주의 날씨는 아침 기온이 13도, 낮 기온은 25도 정도로 예상되며, 당분간 초여름 같은 더위가 계속될 것으로 보입니다. 또한, 내일(13일)도 봄볕이 뜨겁게 내리쬐고, 야외 활동 시 자외선 차단제를 바르는 것이 좋습니다.
--------------------------------------------------
입력: 위 기사는 언제 기사인가요?
📌질문: 위 기사는 언제 기사인가요?
🤖답변: 주어진 정보에서 찾을 수 없습니다.
--------------------------------------------------
입력: 시드니의 날씨는 어떤가요?
📌질문: 시드니의 날씨는 어떤가요?
🤖답변: 주어진 정보에서 찾을 수 없습니다.
--------------------------------------------------
입력: exit
채팅을 종료합니다👋
qa_chain = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={
"prompt": prompt,
"document_variable_name": "summaries" # 또는 프롬프트에서 정의한 변수명
}
)
# 프롬프트에서 {context}를 쓸 경우
qa_chain = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={
"prompt": prompt,
"document_variable_name": "context"
}
)
prompt | retriever | llm | output_parser 등으로 컴포넌트를 순서대로 연결하여 자신만의 체인을 만들 수 있음from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("""
너는 웹 페이지 안에 있는 정확한 정보를 알려주는 AI 챗봇이야.
해당 웹 페이지 정보에서 찾을 수 없다면 '주어진 정보에서 찾을 수 없습니다.'를 출력해줘.
""")
llm = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
result = chain.invoke({"input": "...여기에 입력..."})
| 네이버클라우드 | AWS |
|---|---|
| High CPU-g2 | C |
| Standard-g2 | S |
| High Memory-g2 | M |
| 네이버클라우드 | CPU | memory |
|---|---|---|
| High CPU-g2 | 2 | 3 |
| Standard-g2 | 2 | 8 |
| High Memory-g2 | 2 | 16 |

1GB 당 40IOPS 보장
10GB = 4000IOPS
defalut가 4000IPOS이기 때문
110GB = 4400IOPS
NAS → 공유

리눅스는 NFS
윈도우는 CIFS
OBJECT STORAGE
hot data/cold data 구분 → archive storage 이관 가능
365일 동안 보관되어 있는 데이터 → 366일차에 이관 : 비용 절약 효과
block → 하드디스크/ssd

생명 주기 정책
Q. 제공되는 os 이미지 말고도 아무거나 깔 수 있는 거겠죠?
A. 판매 종료/서버 이미지 제공 X os의 경우 지원하지 않습니다.
e.g., CentOS 7 -> Naver Cloud
Migration 방안이 없음
Q. aws에선 커스텀 이미지 탭에서 훨씬 다양한 배포판들을 선택가능하지 않나요?
A. 그 부분이 aws만의 장점입니다.