Study

Study/SQL

[SQL] SELECT, FROM, WHERE, 비교 연산자, 문자열 검색에 대해서

책 '그림으로 배우는 SQL 입문'을 읽은 후 정리한 글입니다. 데이터베이스에는 몇 가지 종류가 있는데, 그 중 가장 많이 이용되는 것은 Relational Database(관계 데이터베이스: RDB 형식) RDB는 행(record)과 열(column)으로 구성된 표(table)로 데이터를 다룸테이블 안의 1개의 요소를 ‘필드’라고 부름 RDB를 관리하기 위한 DBMS를 관계 데이터베이스 관리 시스템, RDBMS라고 부름 SQL: 데이터베이스 조작이나 정의를 시행하기 위한 언어1. SELECT, FROM데이터베이스에서 데이터를 가져오기 위해서는 SQL에서 SELECT라는 구문을 사용(SELECT 구문을 사용한 SQL을 SELECT 문이라고 함) 예시) product_id와 product_name을 pro..

Study/프롬프트 엔지니어링

[프롬프트 엔지니어링] 함수 호출, 프롬프트 평가, LLM 보안, Autonomous Agent에 대하여

김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.함수 호출호출할 수 있는 함수(기능)를 미리 설정해두면 사용자의 필요에 따라 해당 함수 이름을 호출하여 요청에 응답하는 기능→ 프로그램 내의 함수를 직접 호출하는 것이 아니라 어떤 함수와 파라미터가 필요한지를 JSON 형식으로 응답해줌{ "name": "get_current_weather", "description": "주어진 위치의 현재 날씨를 가져옵니다.", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "도시 또는 지역, 예) 서울", }, "unit": {"type"..

Study/프롬프트 엔지니어링

[프롬프트 엔지니어링] 프롬프트 작성 도움, 환각 줄이기, 외부 지식 주입에 대하여

김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.모델을 선택할 때 고려해야 할 것들성능이 높은 모델일수록 속도는 떨어진다. 즉, 성능이 낮은 모델일수록 속도는 빨라짐->비용과 성능은 비례하지만 성능이 올라가는 것에 비해서는 비용이 훨씬 더 크게 높아지는 편 입력 토큰(프롬프트)에 대한 가격보다 결과물로 생성한 토큰 가격이 보통 두세 배 정도 비싸기 때문에 답변이 길어야하는 작업이라면 더 큰 비용이 발생하므로 주의 필요 비용을 최대한 정확하게 예측해야 할 경우에는 샘플 결과를 모아 토크나이저로 먼저 계산해보면 됨 성능(추론 능력)여러 기관에서 제공하는 LLM 모델의 성능 순위 리더 보드를 참조해 성능 비교 가능벤치마크 점수가 높아도 실제 사례에서는 원하는 만큼 성능이 안나올..

Study/프롬프트 엔지니어링

[프롬프트 엔지니어링] 프롬프트 엔지니어링 기법들에 대하여

김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.프롬프트 엔지니어링이란 AI로 원하는 결과를 생성하기 위해 컴퓨터와 대화하는 방법 1. 프롬프트 엔지니어링의 가장 대표적인 다섯 가지 방법제로샷 프롬프팅LLM에게 아무런 데이터나 예시를 주지 않고 바로 특정 작업을 수행하도록 지시하는 것원샷 러닝LLM에게 명령을 내릴 때 실행 방법에 대한 예시 한 개를 동시에 제공ex) 영어를 한국어로 번역해줘. This is an apple을 한국어로 번역하면 ‘이것은 사과입니다’야.퓨샷 러닝LLM에게 명령을 내릴 때 2~3개부터 수십 개 정도의 예시를 함께 제공하는 것데이터가 부족하거나 특정 작업에 대한 사례가 많지 않을 때 유용CoT(Chain of Thought)LLM에게 문제 해결 ..

Study/프롬프트 엔지니어링

[프롬프트 엔지니어링] AI와 LLM에 대하여

김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.0.  소프트웨어의 발전소프트웨어는 데이터와 알고리즘, 두 가지로 구성 소프트웨어 1.0: 데이터를 알고리즘으로 조작해서 결과를 도출하는 방식소프트웨어 2.0: 데이터를 학습시킨 머신러닝 모델을 만들고, 이 모델을 통해 결과를 도출하는 방식소프트웨어 3.0: 머신러닝 모델을 프롬프트로 제어하는 것 소프트웨어 1.0은 결정론적인 방법 → 입력값에 대해 항상 동일한 출력값 반환소프트웨어 2.0은 머신러닝 모델이 상황에 맞게 스스로 논리 구조를 생성하는 비결정론적 방법 프로그래밍 = 컴퓨터와 상호작용하는 방법프롬프트 엔지니어링 = 자연어로 컴퓨터와 상호작용하는 방법1.  AI의 구분AI는 규칙 기반 AI와 머신러닝으로 구분 규칙 ..

Study/시스템프로그래밍

[시스템프로그래밍] 임계구역과 세마포어에 관하여

Critical Sections(임계 구역) 상호 배타적으로 실행되어야 하는 코드 세그먼트 공유 장치(Shared devices)는 한 번에 한 프로세스에서 액세스해야 하므로 배타적 자원(exclusive resources)이라고 불림. 코드의 중요한 부분들 Entry Section(진입 구역) 공유 변수 또는 다른 자원을 수정할 권한을 요청하는 코드를 포함한다. Critical Section(임계 구역) 공유 자원에 액세스하거나 재진입할 수 없는 코드를 실행하는 코드를 포함한다. Exit Section(나가는 구역) Entry Section이 다음 실행 쓰레드가 임계 구역에 들어갈 수 있음을 알 수 있어야 해서 필요 Remainder Section(나머지 구역) 액세스를 해제한 후, 스레드는 실행할 다..

Study/시스템프로그래밍

[시스템프로그래밍] 조건 변수와 시그널, Reader-Writer problem에 관하여

Busy waiting while( x != y ); Non-busy waiting 해결책 Mutex를 잠그기 조건 x == y를 테스트 참이면 mutex를 잠금 해제하고 루프를 종료 거짓이면 스레드를 일시 중단하고 mutex를 잠금 해제 Mutex는 데이터에 대한 스레드 액세스를 제어하여 동기화를 구현하지만 조건 변수는 실제 데이터 값에 기반하여 스레드를 동기화할 수 있게 함. 만약 조건 변수가 없다면, 프로그래머는 계속해서 조건이 충족되었는지 확인하기 위해 스레드를 폴링(가능하면 임계 구역에서) 이는 스레드가 이 활동에 계속해서 바쁘게 차지되어 매우 자원 소모적일 수 있음. 조건 변수는 폴링 없이 동일한 목표를 달성하기 위한 방법 조건 변수는 항상 Mutex 락과 함께 사용 조건 변수 : 임의의 조건..

Study/시스템프로그래밍

[시스템프로그래밍] Mutex에 관하여

Mutex는 스레드 동기화를 구현하고 여러 쓰기가 발생할 때 공유 데이터를 보호하는 주요 수단 공유 데이터 리소스에 대한 액세스를 보호하는 잠금 역할 한 번에 하나의 스레드만 mutex 변수를 잠그거나 소유할 수 있다. 따라서 여러 스레드가 mutex를 잠그려고 해도 하나의 스레드만 성공 소유한 스레드가 해당 mutex를 잠금 해제할 때까지 다른 스레드는 해당 mutex 소유 불가능 스레드는 보호된 데이터에 번갈아가며 액세스해야 Mutex는 race condition을 방지하는 데 사용 Mutex 소유 → 전역 변수 업데이트 업데이트되는 변수 → critical section에 속함 Mutex를 사용하는 것은 프로그래머의 책임! Mutex 실행 순서 Mutex 변수 생성 후 초기화 여러 스레드가 mute..

Study/시스템프로그래밍

[시스템프로그래밍] 스레드

스레드의 장점 비동기 이벤트를 효율적으로 처리할 수 있다. 공유 메모리 다중프로세서에서 병렬 성능을 얻을 수 있다. 각 스레드는 스택과 CPU 상태(즉, 레지스터)로 구성된 실행 단위 Multiple 스레드는 Multiple 프로세스와 유사하지만, 작업 내의 여러 스레드는 동일한 코드, 전역 변수 및 힙을 사용. Unix에서 두 개의 프로세스는 운영 체제를 통해서만 통신 가능 (예: 파일, 파이프, 소켓) 그러나 작업 내의 두 스레드는 메모리를 통해 통신 가능 스레드를 사용하여 프로그램을 작성할 때, 이들이 동시에 실행된다고 가정한다. 각 스레드가 자체 CPU에서 실행되는 것처럼 보여야 하며, 모든 스레드가 동일한 메모리를 공유하는 것처럼 보여야 한다. 멀티태스킹 단일 프로세서에서 멀티스레딩은 일반적으로..

Study/시스템프로그래밍

[시스템프로그래밍] 시간과 타이머

POSIX Times 시스템은 Epoch 이후로 경과한 시간을 초 단위로 유지해야 Epoch은 세계 표준시 (Coordinated Universal Time, UTC, Greenwich Mean Time 또는 GMT로 불리기도 함) 기준으로 1970년 1월 1일 자정 00:00으로 정의됨 POSIX는 구현이 시스템 시간을 실제 시간과 날짜에 어떻게 정렬해야 하는지 명시 X #include time_t time(time_t *tloc); 시스템 시간에 접근한다 (Epoch 이후로 경과한 시간을 초 단위로 표현). tloc: NULL이 아닌 경우, 함수는 시간을 *tloc에 저장 time_t: long 형식 성공한 경우, Epoch 이후로 경과한 초의 수 반환 실패한 경우, (time_t)-1 반환 → 필수..