
개인 데이터 기반 챗봇 구현
기존 LLM의 한계: (1) 할루시네이션 - 다음 토큰 예측 모델로 모르는 정보도 그럴듯하게 생성
(2) Knowledge Cutoff - 학습 시점 이후 정보는 알 수 없음
해결방법: LLM에게 답을 만들기 전에 참고 자료를 먼저 제공 (e.g. 웹 검색, 내부 문서, PDF, 사내 데이터)
Retrieval Augmented Generation (RAG): 답변 생성 전 외부 지식 저장소에서 관련 문서를 검색한 뒤 그 내용을 기반으로 답변
할루시네이션 감소, 최신·전문 지식 반영, 데이터 소유권 유지, 출처 기반 설명 가능
1. 청킹(Chunking): 문서를 의미 있는 작은 조각으로 분할 for 검색 정확도, 토큰 초과 방지
2. 임베딩(Embedding): 텍스트를 숫자 벡터로 변환해 의미가 비슷한 문장을 벡터 공간에 가깝게 위치
3. 코사인 유사도(Cosine similarity): 두 벡터의 방향 유사도를 측정해 값이 클수록 의미적으로 유사
| RAG 시스템 구조 (LangChain으로 Retrieval Chain 구성) |
문서 준비 → 문서 청킹 → 각 청크 임베딩 → FAISS 벡터스토어 생성 → Retriever로 관련 문서 검색 → 검색 결과와 질문을 LLM에 전달 → 답변과 참고 문서 반환 |
Phython/LangChain이 익숙하지 않아도 가능, 개념만 이해하면 구현 가능
n8n 구성:
- Supbase + pgvector → 벡터 DB
- Google Drive → 문서 소스
- Chat Trigger → AI Agent
- Vector Search → LLM 응답 생성
Note
RAG은 'LLM의 뇌에 검색 능력을 붙여주는 구조'이며 정확하고 신뢰 가능한 AI 시스템을 만들기 위한 필수 개념
신뢰성 분석 기초
신뢰성(Reliability): 주어진 환경에서 일정 시간 동안 요구된 기능을 정상적으로 수행할 확률 (viz. 기능·성능, 환경, 시간·수명)
e.g. 사고 사례 - 도요타 가속페달 결함 (설계·부품 신뢰성 검증 실패), 삼성 갤럭시노트7 배터리 폭팔 (설계 불량)
욕조곡선(Bathtub Curve): [1] 초기 고장 - 제조·조립 불량, [2] 우발 고장 - 랜덤 고장, [3] 마모 고장 - 부식·노화·열화
목표: 초기·우발 고장을 최소화하고 마모 고장을 최대한 늦춰 하키스틱 곡선(Hockey Stick Curve) 구현
| 구분 | 품질 (Quality) | 신뢰성 (Reliability) |
| 시간 개념 | t = 0 | t > 0 |
| 대상 | 불량 | 고장 |
| 주요 원인 | 공정 | 설계·환경 |
| 지표 | 불량률, Cp/Cpk | 고장률, MTTF, B10 |
| 분포 | 정규분포 | 와이블, 대수정규 |
| 개선 도구 | SPC, 6시그마 | FMEA, FTA, 수명시험 |
1. 목표 설정 - 고객 사용조건 및 정비 데이터 분석, 고장 정의, 고장 메커니즘 규명, 과거 데이터 없을 경우 FMEA
2. 시험 및 개선 - 고장 재현 시험, 가속 스트레스 시험, 목표 미달 시 반복 개선
3. 필드 모니터링 - 실제 운용 데이터 수집, 고객 불만·현장 문제 분석, 제품 진화 및 신뢰성 강화
신뢰성 개발에서 데이터 분석의 역할:
- 주요 목적 - 고장률 최소화, 수명 예측, 운영 비용 절감
- 데이터 출처 - 필드 데이터, 시험·가속시험 데이터
- 활용 분석 - 고장률 추정, 수명 예측, 신뢰성 모델링
| 비모수적 방법 | 모수적 방법 |
| Kaplan-Meier (생존함수) Nelson (누적 고장률) TTT Plot (고장률 추세 파악) |
분포 가정 후 모수 추정 (MLE) 분포 선택 기준 (LogLog-likelihood ↑, AIC / BIC ↓, Anderson-Darling ↓) |
산업계에서 가장 널리 사용, 다양한 고장 형태 표현 가능
와이블(Weibull) 분포 핵심:
- 형상모수 β 해석 - [1] β < 1 → 초기 고장, [2] β = 1 → 우발 고장 (지수분포), [3] β > 1 → 마모 고장
- 직선 변환의 의미 - S자 곡선을 로그 변환해 직선으로 변환, 기울기(i.e. 형상모수 β)로 해석·비교·추정이 쉬워짐
Note
신뢰성은 지금 잘 되는 제품이 아니라 시간이 지나도 믿을 수 있는 제품을 만드는 학문
| 문제 설명 | solution.py |
| #112 rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다. 다음은 6 x 6 크기 행렬의 예시입니다. 이 행렬에 (2, 2, 5, 4) 회전을 적용하면 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요. 행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요. |
from collections import deque
def solution(rows, columns, queries):
arr = [[i+columns*j for i in range(1,columns+1)] for j in range(rows)]
answer, result = deque(), []
for i in queries:
a,b,c,d = i[0]-1,i[1]-1,i[2]-1,i[3]-1
for x in range(d-b):
answer.append(arr[a][b+x])
for y in range(c-a):
answer.append(arr[a+y][d])
for z in range(d-b):
answer.append(arr[c][d-z])
for k in range(c-a):
answer.append(arr[c-k][b])
answer.rotate(1)
result.append(min(answer))
for x in range(d-b):
arr[a][b+x] = answer[0]
answer.popleft()
for y in range(c-a):
arr[a+y][d] = answer[0]
answer.popleft()
for z in range(d-b):
arr[c][d-z] = answer[0]
answer.popleft()
for k in range(c-a):
arr[c-k][b] = answer[0]
answer.popleft()
return result
|
'내일배움캠프 QAQC 3기 > 최종 프로젝트' 카테고리의 다른 글
| 최종 프로젝트 6일차: [3] EDA + Sliding Window (0) | 2026.01.06 |
|---|---|
| 최종 프로젝트 5일차: [2] Linear Epitope Prediction (0) | 2026.01.05 |
| 최종 프로젝트 4일차: 고장 데이터 분석과 수명 예측 (0) | 2026.01.02 |
| 최종 프로젝트 2일차: [1] 프로젝트 개요 및 데이터 전처리 (0) | 2025.12.30 |
| 최종 프로젝트 1일차: OpenAI API와 LangChain 기초, RCF 기반 패턴 이상탐지와 예지 시스템 (0) | 2025.12.29 |