langchain 공부 34

contextual compression Retriever 내부 코드 분석

배경contextual compression Retriever의 원리가 궁금해 내부 코드를 살펴본다.코드from typing import Any, Listfrom langchain_core.callbacks import ( AsyncCallbackManagerForRetrieverRun, # 비동기 콜백 관리자를 사용 CallbackManagerForRetrieverRun, # 동기 콜백 관리자를 사용)from langchain_core.documents import Documentfrom langchain_core.retrievers import BaseRetriever, RetrieverLikefrom pydantic import ConfigDictfrom langchain.retrie..

langchain 공부 2024.11.15

CrossEncoderReranker 내부 코드 분석

배경CrossEncoderReranker의 내부 코드를 보고 활용 방법을 찾아본다.코드from __future__ import annotationsimport operatorfrom typing import Optional, Sequencefrom langchain_core.callbacks import Callbacksfrom langchain_core.documents import BaseDocumentCompressor, Documentfrom pydantic import ConfigDictfrom langchain.retrievers.document_compressors.cross_encoder import BaseCrossEncoderclass CrossEncoderReranker(BaseDoc..

langchain 공부 2024.11.14

Faiss 모듈 내 코드 분석1

배경faiss 모듈 내 코드를 분석해서, 여러 용도로 응용하고자함.코드from __future__ import annotations # 미래 버전의 타입 힌트를 사용할 수 있게 함import loggingimport operatorimport osimport pickleimport uuidimport warningsfrom pathlib import Pathfrom typing import ( Any, Callable, Dict, Iterable, List, Optional, Sized, Tuple, Union,)import numpy as npfrom langchain_core.documents import Documentfrom langchain_co..

langchain 공부 2024.11.11

벡터 DB 유사도 측정 방식 총 정리(L2 Distance,Inner Product, Cosine,Jaccard)

벡터 DB 유사도 측정 방식 총 정리1. L2 Distance (유클리드 거리)요약 : 유클리드 거리는 벡터 간의 직선 거리를 측정하므로, 크기와 방향 모두가 유사도 계산에 영향을 줍니다.수학적 원리: 두 벡터 간의 직선 거리를 계산하며, 각 요소의 차이를 제곱해 합한 후 제곱근을 구하는 방식입니다. 이로 인해 두 벡터 간의 물리적 거리를 나타내며 크기와 방향이 모두 고려됩니다.사용 상황벡터의 크기와 방향이 모두 중요한 경우, 예: 이미지 임베딩 간 거리 계산, 물리적 거리, 픽셀 간 거리 비교 등.이런 상황에 왜 좋은가?이미지 임베딩은 고차원 공간의 특징 벡터로, L2 거리 계산을 통해 시각적 차이를 반영할 수 있습니다.코드import numpy as npimport faiss# 128차원 벡터 10,..

langchain 공부 2024.11.10

Document, BaseMedia 내부 분석

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

langchain 공부 2024.11.09

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

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

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

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

langchain 공부 2024.09.26

임베딩과 차원의 의미

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

langchain 공부 2024.09.10