분류 전체보기 99

BM25를 추가한 리트리버(retriver)로 성능 올리기

배경임베딩 방식의 검색기를 사용했는데, 검색기의 성능이 좋지 않았다. 질문 14개 중에 6개만 정답이었고, 오답의 대부분이 검색기 문제로 오답이었다. # 검색기 설정 retriever = vectorstore.as_retriever( search_type="similarity_score_threshold", search_kwargs={'k': 20, "score_threshold": 0.30} )원인을 파악해보니, 자주 쓰이는 단어 때문이었다. 이유 : '여자' 라는 단어가 본문에 너무 자주 쓰여서, 검색기가 이걸 찾기가 힘듦.해결방안 : '여자'라는 단어의 중요도를 낮추고 '패션'이라는 단어에 집중해 검색 해야한다.이 문제를 해결하기 위해 만들어진게 BM25 ..

RAG 제작시 목차 제거 자동화 하기

배경목차가 있으면 Rag 검색기에 걸려서, 검색기의 성능을 떨어트렸다.원본을 눈으로 보고 전처리(목차 제거) 해줬다.대량의 문서를 업로드 할 때는, 목차 분류를 자동화 할 필요성 느낌.해결과정시행착오를 거치며 목차를 구별하는 아래 프롬트를 제작해서 LLM을 돌림."""You are tasked with identifying whether the provided text is a "목차" or part of the "본문" of a book. Follow these instructions:1. If the text contains 4 or more numeric indicators like chapter numbers or page numbers, label it as "목차".2. If the text ..

피클(pkl)과 json의 차이.

배경메타 데이터를 저장하는 과정에서 어느 순간 GPT가 피클 저장방식을 권유했다.그래서 메타 데이터를 저장하는 과정에서 피클과 json 저장방식을 비교하고 차이점을 도출한다.피클(Pickle) vs JSON 차이점 비교특징피클(Pickle)JSON언어 지원Python 전용다수의 언어에서 사용 가능 (Python, JavaScript 등)자료형 유지Python 객체의 모든 자료형을 유지기본 자료형만 지원 (str, int, list, dict 등)커스텀 객체 지원클래스 인스턴스, 함수 등 복잡한 객체도 직렬화 가능지원하지 않음 (직접 처리 필요)직렬화 속도바이너리(b) 형태라 상대적으로 빠름텍스트 형태라 상대적으로 느림파일 크기피클은 객체 구조 전체를 직렬화하므로 더 클 수 있음텍스트 형식으로 상대적으로 ..

사용툴 분석 2024.10.03

RabbitMQ로 우선순위 큐 실제 적용해보자

RabbitMQ는 AMQP (Advanced Message Queuing Protocol) 기반의 메시지 브로커로, 다양한 메시지 큐 기능을 제공합니다. Python에서 RabbitMQ를 사용하는 일반적인 방법은 pika 라이브러리를 사용하는 것입니다. 이를 사용하면 메시지 발행(Publish), 큐 소비(Consume), 교환(Exchange), 라우팅(Routing), 바인딩(Binding) 등을 수행할 수 있다.다음은 RabbitMQ의 다양한 기능을 pika 라이브러리를 통해 사용하는 방법에 대한 설명과 예제1. pika 라이브러리 설치먼저 pika를 설치해야 함:pip install pika2. RabbitMQ 연결 설정 및 채널 생성RabbitMQ에 연결하고 채널을 생성하는 기본 방법입니다. l..

사용툴 분석 2024.10.02

메타데이터 활용한 코딩들

배경수치 데이터 만으론 설명되지 않는게 있다. 예를 들어 평균 연봉을 계산할때는, 일괄적으로 순위를 내는게 아니라. 직군별로 묶어서 계산해야 공정하다. 그럴때 내용 외에 메타데이터를 섞어주면 좋다.그렇게다면 모든 요소를 DB에 저장하는 방식도 있지 않을까? -> 아주 대용량이 아니라면 따로 DB 서버를 유지하는건 비효율적인것 같다. 여기에 더해서 메타데이터를 활용하면 좀 더 복잡한 구조도 가볍게 저장 가능하다. DB라면 구조가 복잡해 질수록 테이블이 늘어나고, Join 연산이 많아져 쿼리 비용이 늘어날꺼다.다음은 메타데이터를 활용하면 좋은 예시이다.예시: 문서 관리 시스템에서 메타데이터를 활용한 데이터 저장시나리오:문서 관리 시스템에서 여러 문서 파일을 관리하고, 문서에 대한 정보(예: 제목, 작성자, ..

사용툴 분석 2024.10.02

서버 없는 초 저비용 rag 인프라 구상

서버 없는 초 저비용 rag 인프라 구상배경1. 얼마전 3090 중고 본체를 샀다. 나는 뭘 사면 최대한 뽑아 먹어야 한다.2. 하나의 본체로 외부의 rag 작업을 처리하면서, 내 로컬의 작업도 처리하고 싶었다.3. 3090이 여전히 좋은 GPU긴 하지만 여러 작업을 한번에 처리하는데 무리가 있다.4. 작업을 순서대로 하나 씩 처리하면 좋겠다고 생각했다.5. 작업을 순서대로? 쌓아 놓고? 머릿속에 큐가 떠올랐다. 인프라 구조 질답 서버 : 디코에서 다른 사람이 질문을 올리면 가져와서 큐에 올린다.내 로컬의 작업도 큐에 올린다.LLM 추론서버 : 큐에서 작업을 받아서 LLM 작업을 하나씩 실행한다. 이때 우선순위에 따라 디코 질문은 빠르게 처리하고, 내 로컬 작업은 우선순위를 낮게 설정한다. ( 말하자면 ..

langchain 공부 2024.09.26

faiss.write_index 한글 제목 저장 안됨 문제

배경faiss.write_index(faiss_index, f"data\\index\\{index_name}.index")여기서 인덱스 파일 제목(index_name) 이 한글인 경우 저장 안됨, 그렇다고 아무 영어이름으로 바꾸긴 싫었음.고유 제목의 개성을 유지하면서 변환하는 방식을 모색해결과정 : base64를 통한 제목 변환import base64name="백년!@#$%^&*()_+[]{};',.//*-+."print(name)-> 백년!@#$%^&*()_+[]{};',.//*-+.# 1. 문자열을 바이트로 변환print(name.encode('utf-8'))-> b"\xeb\xb0\xb1\xeb\x85\x84!@#$%^&*()_+[]{};',.//*-+."# 2. 바이트화된 데이터 base64로 변..

임베딩과 차원의 의미

배경원래는 모든 내용을 한 파일에 담고 그걸 임베딩 했었다.이번에는 여러 요소(table, text)를 각각 임베딩 해서 합치는 프로세스를 진행했다.각 요소별 차원이 맞지 않아 임베딩에 계속 실패했다.해결과정현재 사용하고 있는 MiniLM의 최대 임베딩 차원은 384 였다.따라서 모든 임베딩 길이를 384로 고정하기로 했다.임베딩이 384보다 작다면 나머지를 0으로 채우고, 더 길다면 384에서 자르게 했다.이렇게 문제를 해결했지만, 임베딩과 차원의 의미에 대해 더 자세히 알아야 했다.임베딩(Embedding)이란?임베딩(Embedding)은 고차원 데이터(텍스트, 이미지, 오디오 등)를 저차원의 벡터 공간으로 변환하는 기술입니다. 이 벡터는 의미적으로 유사한 데이터를 벡터 공간에서 가깝게 배치하는 역할..

langchain 공부 2024.09.10

TypedDict의 개념과 langsmith

1. TypedDict의 개념TypedDict는 Python 3.8에서 도입된 타입 힌팅 도구로, 딕셔너리에서 키와 값의 타입을 명시적으로 정의할 수 있게 해줍니다. 이는 런타임에서는 일반 딕셔너리처럼 동작하지만, 정적 타입 검사기(예: mypy, pyright)에서 키-값 쌍의 타입 일치 여부를 미리 검사할 수 있는 기능을 제공합니다.주요 특징:딕셔너리에서 각 필드의 타입을 명시적으로 정의.타입 검사기를 통해 타입 불일치를 미리 확인.선택적 필드와 필수 필드를 구분할 수 있음.코드의 가독성과 유지보수성 향상.예시:from typing import TypedDict, NotRequired# Person 딕셔너리를 정의class Person(TypedDict): name: str age: Not..

사용툴 분석 2024.09.08

코드에서 배치 처리가 효율성을 가져오는 이유

배경pdf-rag를 제작할때, 많은 장수의 pdf를 처리하고 저장해야 했는데 for문으로 한장씩 처리해 속도가 느렸다.더 빠른 방법이 없을까 고민하다 batch 처리에 대해 알게 됐고, 무지하게 빨라져 그 이유가 궁금해 찾아봤다.내 코드에서 배치 처리가 빨랐던 이유1. I/O 효율성 - 디스크 접근 및 파일 처리 최적화파일을 한 번에 작은 단위로 나누어 처리하는 대신, 여러 페이지를 한꺼번에 배치로 처리함으로써 디스크 I/O 작업을 최적화할 수 있습니다. 디스크 접근은 일반적으로 매우 비용이 많이 드는 작업입니다. 파일을 여러 번 나누어 읽고 쓰면, 각 I/O 작업마다 디스크의 시작 및 탐색(Seek) 시간과 파일 시스템 오버헤드가 발생합니다.디스크 접근 시간: 디스크에서 데이터를 읽고 쓰는 시간은 랜덤..