[RAG] RAG 시스템에서 BM25를 사용한 벡터 DB 구현하기
·
AI/ML/RAG
1. BM25 검색의 기본 원리RAG(Retrieval-Augmented Generation) 시스템에서 가장 널리 사용되는 키워드 기반 검색 알고리즘 중 하나가 BM25(Best Matching 25)입니다. BM25는 TF-IDF(Term Frequency-Inverse Document Frequency)를 개선한 알고리즘으로, 문서 길이를 고려하여 더욱 정교한 키워드 매칭을 가능하게 합니다.BM25의 주요 특징TF-IDF를 기반으로 한 향상된 키워드 검색 성능문서 길이에 따른 정규화 지원여기서 각 파라미터의 의미는:IDF(qi): 역문서 빈도f(qi,D): 문서 D에서 단어 qi의 출현 빈도|D|: 문서 D의 길이avgdl: 평균 문서 길이k1: 항 빈도에 대한 가중치 (일반적으로 1.2~2.0)b..
[리뷰] 딥워크 - 몰입의 중요성
·
요즘 들어 아무 방해 없이 완전히 몰입했던 순간이 언제였는지도 모를 만큼 집중력이 부족하고 산만한 기분이 계속해서 들고 있습니다. 공부나 업무를 할 때 집중한다며 음악을 듣거나 사람 많은 카페에 가서 노트북을 펴고는 '역시 집보다는 카페가 집중이 잘돼'라고 생각하거나 빠른 답장을 위해 수시로 이메일을 확인하고 메신저를 켜놓는 등의 행동들은 어쩌면 최선의 몰입이 아닌 유혹에 적당히 타협한 어정쩡한 몰입이었지 않나 생각이 들기도 합니다. 성과를 내기 위해선 몰입이 필요하다는 것은 누구나 알고 있습니다. 하지만 몰입으로 성공한 사람들의 구체적인 사례와 방법들을 알고 싶어서, 또한 그것을 통해 딥 워크에 대한 확신을 얻기 위해 이 책을 골랐습니다. 왜 딥워크인가 대체 불가능한 전문가는 신기술, 어려운 일을 빠르..
[NLP] Something of Thoughts 프롬프트 테크닉 (CoT, ToT)
·
AI/ML/NLP
0. IntroLLM의 추론 능력(reasoning)을 향상하기 위한 다양한 프롬프트 테크닉이 연구되고 있습니다. 그중 Something of thoughts 시리즈들을 알아보려고 합니다. 이번에 소개해드릴 것은 2가지입니다.Chain of Thought (CoT)Tree of Thoghts (ToT)1. Chain of ThoughtChain of Thoughts (CoT)는 중간에 추론 단계를 둠으로써 LLM이 복잡한 추론을 가능하게 해 줍니다. 예시에서는 few-shot으로 계산 과정을 단계적으로 알려줬습니다. 비교적 간단한 방법이고 LLM이 문제를 해결해 가나는 과정을 알 수 있다는 장점이 있는 것 같습니다. 또한 zero-shot으로 "천천히 한 단계씩 생각해 보자"라고 한 줄 추가함으로써 Co..
[Paper Review] 생성 AI로 만들어졌는지 판단하기 (DetectGPT)
·
AI/ML/NLP
0. Intro 인터넷상에 있는 수많은 글, 뉴스 또는 학생이 제출한 과제 등이 ChatGPT, Bard로부터 생성된 글인지 어떻게 판별할 수 있을까요? 당장 생각나는 방법은 글을 N-그램과 같이 통계적 기법으로 분석하여 인간의 글과 생성 AI의 글 사이의 관계를 찾는 것이고 또는 BERT와 같은 모델을 분류기로 사용하여 한 가지 주제 또는 프롬프트에 대하여 인간의 글과 생성 AI의 글을 분류하는 모델을 만드는 것입니다. 이 방법들은 인간의 글과 생성 AI의 글을 학습데이터로 확보해야 하기에 시간과 비용이 들 수밖에 없습니다. 이 글에서 소개해드릴 DetectGPT는 이런 비용 없이 비교적 작은 모델(T5)을 활용하여 생성 AI로부터 만들어졌는지 판단합니다. 1. Introduction 방법은 다음과 같..
[Python] 비동기 프로그래밍으로 크롤링 속도 개선(asyncio)
·
Python
1. 동기? 비동기? 동기 프로그래밍 : 동기 프로그래밍은 작업들이 순차적으로 실행되며, 하나의 작업이 끝나야 다음 작업이 시작됩니다. 이것은 작업들 간의 의존성이 높고, 순서가 중요한 경우에 주로 사용됩니다. 비동기 프로그래밍 : 비동기 프로그래밍은 작업들이 동시에 진행되며, 하나의 작업이 완료될 때까지 다른 작업을 차단하지 않습니다. 빅데이터에서는 코드에 필요한 데이터를 얻어오는 작업에 병목이 생길 수 있습니다. 이런 I/O bound 위주의 프로그램에서는 I/O 효율을 비동기적으로 개선함으로써 실행속도를 빠르게 할 수 있습니다. 네이버에서 300개 기업의 재무제표를 크롤링하는 경우를 예로 보겠습니다.2. 동기 프로그래밍from pykrx import stock import pandas as pd i..
[Python] 컴파일로 속도 개선하기(Cython)
·
Python
0. Cython? line_profiler 같은 프로파일링 툴로 알고리즘을 최적화하여 CPU에서의 계산량, RAM에서의 병목을 어느 정도 개선했다면 노력 대비 속도 개선이 줄어드는, 즉 한계 효용이 감소하는 시기가 옵니다. 그러면 다음으로 시간을 줄이는 가장 쉬운 방법은 기계어로 컴파일하는 것입니다. 컴파일을 하게 되면 CPU에서 바로 실행 가능한 기계어로 변환되며, 이는 같은 연산을 반복하는 루프나 list, array에 대한 역참조, 수학 계산과 같은 곳에서 시간을 줄여줄 수 있습니다. 대표적으로 파이썬을 C언어로 컴파일 해주는 라이브러리인 사이썬(Cython)이 있습니다. 사이썬은 파이썬 코드를 컴파일된 확장 모듈로 변경해 주고 이 확장 모듈을 import 해서 쓰기만 하면 되기 때문에 비교적 사..
[Python] 프로파일링으로 병목 찾기 (line_profiler)
·
Python
자신이 작성한 코드가 오래 걸린다 싶을 때 어느 부분에서 병목이 생기는지 알 수 있는 방법을 소개하려고 합니다. 0. 코드 다음 코드는 '줄리아 집합'을 생성하는 코드입니다. import numpy as np @profile def julia_set(width, height, c, max_iter): x_min, x_max = -2.0, 2.0 y_min, y_max = -2.0, 2.0 x_range = np.linspace(x_min, x_max, width) y_range = np.linspace(y_min, y_max, height) img = np.empty((width, height)) for x in range(width): for y in range(height): zx, zy = x_ra..
[RecSys] 언어모델을 추천시스템에 활용한 연구
·
AI/ML
최근 나온 생성 모델들을 추천시스템에도 활용할 수 있지 않을까 생각하던 중 A Survey on Large Language Models for Recommendation 이 논문에서 지금까지 나왔던 언어모델들을 추천시스템에 적용한 연구들을 잘 정리해 두어 이를 참고하여 어떻게 적용했는지 정리해보려고 합니다. 1. 추천시스템을 위한 언어모델 추천을 위한 언어모델은 크게 2가지로 분류할 수 있습니다. Discriminative LLM은 BERT와 같은 사전훈련된 언어모델을 파인튜닝하여 사용합니다. 유저-아이템 행동정보를 입력으로 받아 상품을 추천하는 방식이고 관련 연구도 많고 성능도 괜찮게 나오는 편입니다. 하지만 제가 요새 관심을 가지는 것은 Generative LLM쪽입니다. 적절한 프롬프트를 활용해서 ..