분류 전체보기 99

Document, BaseMedia 내부 분석

이 두 클래스는 상속 관계에 있으며, 데이터와 메타데이터를 관리하기 위한 계층 구조를 형성합니다. BaseMedia는 미디어 데이터에 대한 기본 구조와 속성을 정의하는 추상적인 베이스 클래스 역할을 하고, Document는 이를 확장하여 텍스트 문서 데이터와 관련된 구체적인 기능과 속성을 추가하는 역할을 합니다.1. BaseMedia 클래스의 역할BaseMedia는 미디어 데이터의 기본 구조를 정의하는 추상적이고 상위 개념의 클래스로, 다른 미디어 데이터 관련 클래스들이 상속받을 수 있도록 설계된 베이스 클래스입니다. 여기에는 데이터나 파일의 메타데이터와 ID와 같은 공통된 속성을 정의하고, 그 데이터를 구조화하거나 검색하는 데 필요한 기능을 제공합니다.BaseMedia의 주요 특징:ID: 각 미디어 데..

langchain 공부 2024.11.09

Union이 뭐고 왜 사용하는가?

Union은 Python의 typing 모듈에서 제공하는 타입 어노테이션으로, 변수나 함수의 매개변수, 반환값이 여러 타입 중 하나일 수 있음을 나타낼 때 사용됩니다. Union을 통해 코드에서 여러 타입을 허용해야 할 때 가독성을 높이고, 타입 안정성을 강화할 수 있습니다.Union의 주요 특징다양한 타입 허용: Union은 타입을 제한하면서도 여러 타입을 허용할 수 있어, 함수나 클래스가 다양한 입력을 유연하게 처리할 수 있도록 해줍니다. 예를 들어, Union[int, str]는 해당 변수나 매개변수가 int 또는 str 타입일 수 있음을 나타냅니다.타입 안전성 강화: Union을 사용하면 코드 내에서 여러 타입의 데이터를 허용하면서도 각 타입에 맞는 처리를 할 수 있어, 잘못된 타입 사용을 방지할..

사용툴 분석 2024.11.08

Type Hinting과 Pydantic 차이

Pydantic과 타입 힌팅(type hinting)은 모두 코드에서 데이터 타입을 명시하는 데 도움을 주지만, 그 목적과 기능은 서로 다릅니다.1. 타입 힌팅 (Type Hinting)타입 힌팅은 코드에서 변수, 함수 매개변수, 반환값 등에 타입 정보를 명시하는 기능입니다. Python에서는 타입 힌팅을 통해 코드 가독성과 안정성을 높일 수 있지만, 실행 시에 실제로 타입 검사를 수행하지는 않습니다. 즉, 타입 힌팅은 개발자와 IDE에게 타입 정보를 제공할 뿐이며, 코드 실행 중에 데이터 타입을 강제하지 않습니다.예시: 타입 힌팅def add_numbers(a: int, b: int) -> int: return a + b# 잘못된 타입을 넣어도 에러가 발생하지 않음 (실행 시점에서 검증이 이루어지..

사용툴 분석 2024.11.08

InMemoryDocstore 내부 코드 분석

배경langchain 에 쓰이는 도구들을 깊게 이해하고 사용하기 위해 도구들을 하나씩 분석코드분석add 메서드: {"doc1": doc1, "doc2": doc2} 형태의 딕셔너리를 사용해 새 문서를 추가합니다. 중복된 ID가 없으면 성공적으로 추가되며, 중복된 ID가 있으면 오류를 발생delete 메서드: 지정된 ID의 문서를 삭제합니다. 존재하지 않는 ID를 삭제하려고 시도하면 오류가 발생search 메서드: doc2라는 ID로 문서를 검색합니다. 문서가 존재하면 해당 문서 객체가 반환되고, 존재하지 않으면 "ID not found" 메시지를 반환"""Simple in memory docstore in the form of a dict."""from typing import Dict, List, Op..

langchain 공부 2024.11.07

멀티스레드(ThreadPoolExecutor), 멀티프로세서(ProcessPoolExecutor) 비교

배경다층구조 json 데이터를 3가지 테이블로, 분리하는 작업이 오래걸림(25초)일반실행, 멀티스레드, 멀티프로세서 각각 방식에서 어떤 방식이 빠른지 관찰하려 한다.일반 실행시간병렬 처리 없이 단일 스레드에서 모든 데이터 처리를 수행하니, 25초가 걸렸다.멀티스레드 실행 시간 분석스레드 수총 소요 시간총 함수 호출 수wait 호출 수acquire 호출 수as_completed 호출 누적 시간113.69 초3,79621513.54 초215.50 초5,207102815.35 초515.23 초7,494106715.07 초1016.33 초11,3342013216.18 초2016.11 초19,0003925815.72 초주요 관찰 사항스레드 수 1일 때 최단 시간(13.69초)이 소요되었습니다.스레드 수 증가에 따..

ThreadPoolExecutor 내부 구조 분석(큐를 활용한 멀티스레딩)

배경멀티 스레딩에 이해가 부족해서, ThreadPoolExecutor의 내부 구조를 알아보고자함분석요약 : ThreadPoolExecutor`는 Python의 표준 라이브러리에서 제공하는 멀티스레딩 도구로, 여러 스레드가 동시에 작업을 실행할 수 있도록 관리하는 역할을 함. 각 스레드가 작업 큐에서 작업을 가져와 수행하고, 스레드 풀이 종료될 때까지 작업을 처리하는게 기본적인 흐름초기화 단계ThreadPoolExecutor가 생성될 때, 최대 스레드 수, 작업 큐, 세마포어 등이 설정됩니다.max_workers 인자로 최대 스레드 수를 설정하며, 지정하지 않으면 시스템 CPU 코어 수 + 4 또는 최대 32로 기본 설정됩니다.초기화 함수(initializer)와 초기화 인자(initargs)가 제공되면,..

(ProcessPoolExecutor 사용 오류) A process in the process pool was terminated abruptly while the future was running or pending

배경멀티스레드 대신 멀티프로세서(ProcessPoolExecutor) 방식을 사용하려 했다.그런데 아래 오류가 뜨면서 동작하지 않았다.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.해결과정어떻게 해도 ProcessPoolExecutor가 동작하지 않았다.오랜시간 검색끝에, 대화형 환경(주피터)에서 실행한 것이 문제라는 문서를 발견했다.공식문서 내용 요약ProcessPoolExecutor는 각 프로세스를 독립적으로 실행하므로, 프로세스가 시작될 때마다 메인 코드(즉, main 모듈)를 다시 불러와야 합니다. 이 main 모듈은 프로세스가 작업을 제대로 ..

json 평활화 작업을 통한, 멀티스레드 속도 비교(ThreadPoolExecutor)

배경다층구조 json 데이터를 3가지 테이블로, 분리하는 작업 필요.예전 프로젝트 당시 glue를 통한 분산처리를 했었음.그게 최선이었냐는 질문을 받음.로컬에서 빠르게 할 수 있는 방법을 찾아서, 멀티스레드를 적용하기로함.해결과정ThreadPoolExecutor를 적용해 코드 작성for문을 10000번 실행 하는데, 한번에 배치실행수(스레드수)를 조절하며 비교오히려 스레드 수가 작을때, 빠른 현상... 왜지..스레드 수총 소요 시간총 함수 호출 수wait 호출 수acquire 호출 수as_completed 호출 누적 시간113.69 초3,79621513.54 초215.50 초5,207102815.35 초515.23 초7,494106715.07 초1016.33 초11,3342013216.18 초2016.1..

리랭커(Reranker) 사용시 여러 문서 한번에 재정렬 시키기

배경한가지 질문에 여러 문서에서 자료를 검색기로 가져오고그 자료들을 한번에 리랭커 하고 싶다.그런데 ContextualCompressionRetriever를 사용하려면 기본 검색기(base_retriever) 값을 꼭 넣어줘야한다.ContextualCompressionRetriever를 사용 목적에 맞게 수정해, 문제를 해결하고자 한다.해결과정여러 책을 돌리면서, 검색기로 찾은 문서들이 점점 dense_docs, sparse_docs에 쌓이게 만듦base_retriever에 값이 없어도 되게(Obtional) 기존 모듈 커스터 마이징(바꿈)외부 코드 for book_name in book_names: # 검색기 설정 (리랭커 호출 없이 검색만 수행) retriever = v..

invoke와 get_relevant_documents의 차이

query='블로그 주인장은 차은우와 비슷하게 생겼는가?'retriever.get_relevant_documents(query)retriever.invoke(query)배경뭔가 어느순간 최종단계에서 get_relevant_documents을 쓰고 있었다. 아마도 GPT 때문에 invoke로 쓰던게 대체된것 같다.둘다 비슷한 기능으로 동작하는거 같은데 무슨 차이가 있는지 알고 싶었다.해결과정get_relevant_documents의 코드확인 @deprecated(since="0.1.46", alternative="invoke", removal="0.3.0") def get_relevant_documents( self, query: str, *, ..

langchain 공부 2024.10.16