반응형
반응형

[python] List of running process using python

import psutil

def listProcesses():
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid', 'name'])
        except psutil.NoSuchProcess:
            pass
        else:
            print(pinfo)

반응형
반응형

[python] zimport - 수많은 python 패키지를 압축하여 관리 (github.com/waveware4ai)

 

python 패키지를 관리하다 보면 수많은 파일들이 부담스러울때 필요한 zimport 를 소개합니다.

소개

  • zimport는 Python의 표준 zipimport를 대체하고 개선한 도구입니다.
  • zimport는 zip-archives에서 Python 패키지를 로드하고 관리하는 데 사용됩니다. 즉, Java jar처럼 Python 패키지를 관리할 수 있습니다. 또한 동적 라이브러리(.dll, .pyd, .so) 로드도 지원합니다.
  • 이 도구를 만들고 저의 python 작업 디렉토리는 약 160gb, 수백만개 파일에서 80G 1만 개 수준으로 줄어 들었습니다.

주요기능

  • zip-archive에서 동적 라이브러리 로딩 지원(.pyd, .dll, .so, .dylib)
  • zip-archive에서 내부 read() 시에 Java의 getresource처럼 내부 파일(예: 환경 파일) 읽기 지원
  • 컴파일된 .pyc 파일 지원(name.cpython-version.pyc 및 pycache 폴더)

사용된기술

  • importlib, meta_path, path_hooks
  • function intercept (standard open, stat, read, ctypes.WinDLL, ctypes.CDLL 등)

사용환경

  • python win/linux/macosx 지원
  • python version 3.8~3.12 지원

사용방법

python -m pip install zimport
import zimport

  • lib/site-package 디렉토리에서 패키지를 한꺼번에 압축하고, sys.path 에 추가하기만 하면 정상적으로 작동합니다.
  • 물론, 시간의 여유가 되신다면 패키지별로 압축하여, java 의 jar 처럼 의존성에 따라서 패키지를 sys.path 에 추가해 주시면 됩니다.
  • 또한 한번 압축된 package 는 share 하여 쓸수 있기 때문에 하드디스크 공간의 낭비를 줄여줄수 있다고 생각합니다.

마지막으로

  • 소스는 github 에 공개하였으며 현재 버전은 0.1.4 입니다. 몇몇 package (예를들어 transformers) 아직 지원하지 안으며, torch, torchvision, numpy, pandas 와 같은 major 패키지는 이상없이 동작함을 확인하였습니다.

https://github.com/waveware4ai/zimport

  • 또한, portable python 과 아주 궁합이 잘맞습니다. 이것도 github 에 업로드 하였습니다. linux 버전은 직접 컴파일하였고, windows 버전은 embeded 를 개작하였습니다.

https://github.com/waveware4ai/PortablePython

  • 사용시 발생하는 버그나 문제점들은 리포팅해주시면 개선하도록 하겠습니다.

반응형
반응형

벡터 DB 만들어 보기

 

 

https://wikidocs.net/262584

 

9.1.2. 벡터 DB 만들어 보기

**벡터 DB 생성 코드** --- 다음은 벡터 DB를 생성하는 코드입니다. ```python # build_vector_db.py from langchain_community.…

wikidocs.net

 

 

 

벡터 데이터베이스 정의

벡터 데이터베이스는 데이터 객체의 수치적 표현인 벡터(벡터 임베딩이라고도 함) 형태로 정보를 저장하는 데이터베이스입니다. 이러한 벡터 임베딩의 성능을 활용하여 이미지, 텍스트, 센서 데이터 등의 비정형 데이터반정형 데이터로 구성된 대규모 데이터 세트를 색인하고 검색합니다. 벡터 데이터베이스는 벡터 임베딩을 관리하기 위해 구축되었으므로 비정형 및 반정형 데이터 관리를 위한 완벽한 솔루션을 제공합니다.

벡터 데이터베이스는 벡터 검색 라이브러리 또는 벡터 인덱스와 다릅니다. 이는 메타데이터 저장 및 필터링을 가능하게 하고, 확장 가능하며, 동적 데이터 변경을 허용하고, 백업을 수행하고, 보안 기능을 제공하는 데이터 관리 솔루션입니다.

벡터 데이터베이스는 고차원 벡터를 통해 데이터를 구성합니다. 고차원 벡터에는 수백 개의 차원이 포함되어 있으며 각 차원은 그것이 나타내는 데이터 객체의 특정 기능이나 속성에 해당합니다.

 

벡터 임베딩이란 무엇인가요?

벡터 임베딩은 주제, 단어, 이미지 또는 기타 데이터를 숫자로 표현한 것입니다. 임베딩이라고도 하는 벡터 임베딩은 대규모 언어 모델 및 기타 AI 모델에 의해 생성됩니다.

각 벡터 임베딩 사이의 거리는 벡터 데이터베이스 또는 벡터 검색 엔진이 벡터 간의 유사성을 결정할 수 있게 해줍니다. 거리는 데이터 객체의 여러 차원을 나타낼 수 있으므로,머신 러닝 및 AI가 패턴, 관계 및 기본 구조를 이해할 수 있습니다.

 

 

 

 

 

DB-Engines Ranking of Vector DBMS 

https://db-engines.com/en/ranking/vector+dbms

 

데이터 저장 및 읽기까지 9단계 과정 필요

통상 벡터 DB에 데이터를 저장하고 이를 읽어오기까지는 9단계 과정이 필요하다. 기업이 자체적으로 작성한 신입사원 백서 파일을 벡터 DB에 저장하고 신입사원이 기업 전용 생성형 AI 챗봇에 질의하고 받기까지 과정을 예로 들어 보자. 먼저 구축된 벡터 DB에 덩어리(청크, Chunk) 형태로 백서 파일을 변환해야 한다. 청크는 의미 있는 단위로 나누는 것을 의미한다. 이후 청크 형태로 바뀐 신입사원 백서 데이터를 임베딩 모델에 넣어 벡터화한다. 이렇게 벡터화된 신입사원 백서 데이터를 벡터 DB에 넣기 전 인덱싱(Indexing)을 통해 정렬하고 벡터 DB에 저장한다. 여기까지가 신입사원 백서 파일을 벡터화하고 벡터 DB에 저장하는 과정으로 볼 수 있다. 이때 사내 규정 및 거버넌스가 바뀌면서 백서가 수정될 경우 벡터 DB에 실시간으로 반영할 수 있어야 한다.


벡터 DB와 지식그래프 비교 (출처: medium.aiplanet.com)
이후 신입사원이 기업용 생성형 AI 챗봇에 입사 첫해 여름휴가를 최대 며칠까지 사용할 수 있는지 질의한다면, LLM과 연동된 랭체인을 통해 쿼리를 임베딩 모델에 넣어 벡터화한다. 이후 벡터화된 질의문을 벡터 DB 내 인덱스에서 유사 벡터 군집(휴가에 대한 정보들) 및 벡터 데이터(입사 첫해 여름휴가 정보)를 찾고 이를 다시 LLM에 보내 사용자가 이해할 수 있는 답변으로 치환해 보여주는 방식이다. 이러한 과정은 타 DB와 별다른 차이점이 없다.
 

 

 

다음은 벡터 DB를 생성하는 코드입니다.

# build_vector_db.py
from langchain_community.document_loaders.csv_loader import CSVLoader
from langchain_community.vectorstores import Chroma
from langchain_upstage import UpstageEmbeddings

loader = CSVLoader(
    file_path="./csv/한국산업은행_금융 관련 용어_20151231.csv", encoding="cp949"
)
pages = loader.load()
print(pages[:2])

us_model =  UpstageEmbeddings(
    api_key="up_ULzGbJVs57bcnNHm8D0KdI51Nzl4F",
    model="solar-embedding-1-large"
)

Chroma.from_documents(pages, us_model, persist_directory="./database")

코드 블록별로 설명하면 아래과 같습니다.

  • CSV 파일 로드

실습에 사용되는 파일을 로드합니다. CSVLoader 객체를 사용하여 CSV 파일을 로드하고, 반환된 Document 정보를 pages 변수에 저장합니다. 다음 코드는 CSV 파일을 출력하고 샘플 데이터를 출력하는 내용입니다.

loader = CSVLoader(file_path="./csv/한국산업은행_금융 관련 용어_20151231.csv", encoding='cp949')
pages = loader.load()

print(pages[:2])
[Document(metadata={'source': './csv/한국산업은행_금융 관련 용어_20151231.csv', 'row': 0}, page_content='구분: 리스크\n분류: 리스크 개요\n용어: 리스크(Risk)\n설명: 미래수익 또는 자산가치 변동
의 불확실성(Uncertainty)으로 인하여 보유자산에서 손실이 발생할 가능성(신용  시장  금리  유동성리스크 등) 또한 부적절하거나 잘못된 내부절차  시스템 오류  직원의 실수·고의 또는 자연재해 등의 사 건에 의해 손실이 발생할 가능성 (운영리스크 등)'), Document(metadata={'source': './csv/한국산업은행_금융 관련 용어_20151231.csv', 'row': 1}, page_content='구분: 리스크\n분류: 리스크 개요\n용어: 불확실성\n설명: 설사 손실이 발생한다 해도 발생될 것이 확실하고 크기(금액)도 확실히 알 수 있어서 회피 또는 수용하기로 의사결정하고 나면 그것은 더 이상 리스크가 아님')]
  • 임베딩 모델 로딩

업스테이지 랭체인 인터페이스를 사용해서 solar-embedding-1-large 모델을 로딩합니다.

us_model = UpstageEmbeddings(
    api_key="발급받은 키",
    model="solar-embedding-1-large"
)
  • 벡터 DB 생성

Chroma.from_documents 메서드를 호출해서 로딩한 문서를 임베딩 모델을 통해 임베딩 벡터로 변환하고 이것을 최종적으로 로컬 디렉터리에 저장합니다.

Chroma.from_documents(pages, us_model, persist_directory="./database")

이 명령이 실행되고 나면 임베딩 벡터 외에도 원문 정보, 인덱스, 메타 데이터 등의 각종 정보를 바탕으로 로컬 디렉터리에 데이터베이스가 구성됩니다. 다음은 로컬에 생성된 데이터베이스를 캡처한 자료입니다.

반응형
반응형

**"Hallucination" (환각)** 할루시네이션 은  인공지능, 특히 대규모 언어 모델(Large Language Model, LLM)과 같은 생성형 AI 분야에서 사용되는 중요한 용어입니다.

Hallucination은 LLM이 사실과 다르거나, 논리적으로 불가능하거나, 학습 데이터에 존재하지 않는 정보를 마치 사실인 것처럼 자신 있게 생성하는 현상을 의미합니다. 쉽게 말해, AI가 '없는 것을 지어내는 것' 또는 **'거짓말을 하는 것'**과 같습니다.

왜 Hallucination이 발생할까요?

LLM은 방대한 양의 텍스트 데이터를 학습하여 단어와 문장 사이의 통계적 패턴과 관계를 배웁니다. 이를 통해 다음 올 단어를 예측하고 문장을 생성합니다. Hallucination이 발생하는 주요 이유는 다음과 같습니다.

  1. 패턴 학습의 한계:
    • LLM은 '세상에 대한 이해'를 하는 것이 아니라, '단어 시퀀스의 통계적 패턴'을 학습합니다. 따라서 특정 질문에 대해 학습 데이터에서 유사한 패턴을 찾지 못하거나, 불완전한 패턴을 발견했을 때, 가장 그럴듯한(통계적으로 유사한) 단어 시퀀스를 조합하여 생성하게 됩니다. 이 과정에서 사실과 동떨어진 내용이 나올 수 있습니다.
  2. 데이터 부족 또는 편향:
    • 특정 주제에 대한 학습 데이터가 부족하거나, 데이터 자체가 편향되어 있다면, 모델은 부정확하거나 존재하지 않는 정보를 생성할 가능성이 높아집니다.
  3. 최신 정보 부족:
    • LLM은 학습 데이터가 업데이트된 시점 이후의 최신 정보를 알지 못합니다. 따라서 최신 사건이나 사실에 대해 질문을 받으면, 과거 데이터를 기반으로 그럴듯하지만 틀린 답변을 생성할 수 있습니다.
  4. 불분명하거나 모호한 프롬프트:
    • 사용자의 질문(프롬프트)이 너무 추상적이거나 모호할 경우, LLM은 질문의 의도를 정확히 파악하기 어렵고, 이로 인해 잘못된 방향으로 정보를 생성할 수 있습니다.
  5. 과도한 일반화:
    • 모델이 학습 과정에서 본 일부 패턴을 과도하게 일반화하여, 실제로는 적용되지 않는 상황에 잘못된 정보를 생성할 수 있습니다.

Hallucination의 문제점

  • 신뢰성 저하: AI가 사실과 다른 정보를 생성하면 사용자는 AI의 답변을 신뢰하기 어렵게 됩니다.
  • 잘못된 의사결정: AI의 잘못된 정보를 기반으로 중요한 결정을 내릴 경우 심각한 결과를 초래할 수 있습니다.
  • 확인 노력 증가: 사용자는 AI가 생성한 모든 정보를 일일이 사실인지 확인해야 하는 추가적인 부담을 안게 됩니다.

Hallucination을 줄이는 방법

Hallucination을 완전히 없애는 것은 현재 LLM 기술의 큰 과제이지만, 다음과 같은 방법들로 그 발생 빈도와 심각도를 줄일 수 있습니다.

  • RAG (Retrieval-Augmented Generation): 외부의 신뢰할 수 있는 최신 정보를 검색하여 LLM에 제공함으로써 LLM이 '참조할 자료'를 기반으로 답변을 생성하게 합니다. (위에서 설명한 내용입니다!)
  • 정확한 프롬프트 엔지니어링: 질문을 명확하고 구체적으로 작성하여 LLM이 정확한 의도를 파악하도록 돕습니다.
  • 모델 재학습(Fine-tuning) 및 업데이트: LLM을 최신 데이터로 주기적으로 재학습시키거나, 특정 도메인에 특화된 데이터로 파인튜닝하여 해당 분야의 정확도를 높입니다.
  • 불확실성 표시: LLM이 자신이 생성한 정보에 대해 얼마나 확신하는지를 사용자에게 알려주어, 불확실한 정보는 사용자가 한 번 더 확인할 수 있도록 유도합니다.
  • 인간 개입 및 검증: 중요한 의사결정이나 민감한 정보의 경우, AI의 답변을 사람이 최종적으로 검증하고 수정하는 단계를 거칩니다.

Hallucination은 LLM을 실생활에 적용할 때 가장 주의해야 할 부분 중 하나이며, RAG와 같은 기술의 발전으로 그 영향력을 줄이려는 노력이 계속되고 있습니다.

 

 

반응형
반응형

RAG (검색 증강 생성) 설명

**RAG (Retrieval-Augmented Generation)**는 **"검색 증강 생성"**의 줄임말이에요. 대규모 언어 모델(LLM)의 한계를 보완하고 성능을 높이기 위한 강력한 기술이죠.


왜 RAG가 필요할까요?

ChatGPT 같은 LLM은 엄청난 양의 데이터로 학습되어 유창한 글을 잘 만들어요. 하지만 몇 가지 아쉬운 점이 있습니다.

  • 환각(Hallucination): LLM이 학습하지 않은 정보나 잘못된 내용을 마치 사실인 양 지어낼 수 있어요.
  • 정보의 최신성 부족: LLM은 특정 시점까지의 데이터로 학습되므로, 그 이후의 최신 정보는 알지 못합니다.
  • 특정 도메인 지식 부족: 일반적인 지식은 풍부하지만, 특정 기업의 내부 문서나 전문 분야 논문 같은 깊이 있는 지식은 부족할 수 있어요.
  • 투명성 부족: 왜 그런 답변을 생성했는지 그 근거를 제시하기 어렵습니다.

이런 문제들을 해결하기 위해 RAG가 등장했습니다.


RAG는 어떻게 작동할까요?

RAG는 질문에 답변을 만들기 전에, 외부에서 관련성 높은 정보를 검색(Retrieval)해서 가져온 뒤, 이 정보를 바탕으로 답변을 생성(Generation)하는 방식이에요. 쉽게 말해, LLM에게 "답변하기 전에 관련 자료를 찾아보고 대답해줘"라고 시키는 것과 같죠.

RAG의 핵심 과정은 다음과 같습니다.

  1. 질문 입력: 사용자가 질문을 입력합니다.
  2. 관련 문서 검색:
    • 질문을 분석하고 핵심 키워드나 의도를 파악해요.
    • 미리 구축해 둔 외부 지식 베이스 (데이터베이스, 문서 저장소, 웹 등)에서 질문과 가장 관련 깊은 **문서 조각(Chunk)**들을 찾아냅니다. 이때 벡터 데이터베이스 같은 기술이 사용되어 질문과 문서의 의미적 유사성을 기반으로 효율적인 검색이 이루어져요.
  3. 정보 증강 및 프롬프트 구성:
    • 검색된 관련 문서 조각들을 LLM에게 전달할 **프롬프트(Prompt)**에 추가합니다.
    • 보통 "다음 문서들을 참고하여 질문에 답변해 줘: [검색된 문서들 내용] 질문: [원래 질문]"과 같은 형식으로 프롬프트를 만들어요.
  4. 답변 생성:
    • 증강된 프롬프트(질문 + 관련 문서)를 LLM에 전달합니다.
    • LLM은 이제 자신의 학습 데이터만으로 답변하는 게 아니라, 제공된 최신 또는 특정 도메인의 정보를 참고하여 더 정확하고 근거 있는 답변을 생성해요.
  5. 답변 출력: LLM이 만든 답변을 사용자에게 보여줍니다.

RAG의 장점

  • 정확성 향상: 최신 정보나 특정 도메인 지식을 참조하여 잘못된 정보를 줄이고 답변의 정확도를 높여요.
  • 최신 정보 반영: LLM을 다시 학습(fine-tuning)할 필요 없이, 외부 데이터만 업데이트하면 실시간으로 최신 정보를 반영할 수 있어 비용 효율적입니다.
  • 투명성 및 신뢰성: 답변의 근거가 된 원본 문서를 함께 제시함으로써 답변에 대한 신뢰도를 높일 수 있어요.
  • 비용 효율성: LLM 자체를 재학습시키는 것보다 훨씬 적은 비용과 시간으로 모델의 지식을 확장할 수 있습니다.
  • 유연성: 다양한 외부 지식 베이스(데이터베이스, 문서, 웹 등)와 연결하여 사용할 수 있어요.

RAG의 활용 사례

  • 기업 내부 지식 챗봇: 회사의 내부 문서나 규정을 기반으로 직원들의 질문에 정확히 답변합니다.
  • 고객 서비스 챗봇: 기업의 최신 제품 정보나 FAQ를 기반으로 고객 문의에 응대해요.
  • 법률 및 의료 정보 시스템: 최신 법률이나 의학 논문 등을 참고하여 전문적인 질문에 답변합니다.
  • 개인화된 학습 도구: 특정 학습 자료를 기반으로 학생들의 질문에 맞춤형 답변을 제공해요.
  • 실시간 데이터 분석: 실시간으로 업데이트되는 데이터를 참조하여 질문에 대한 답변을 생성합니다.

RAG는 LLM의 한계를 극복하고 실제 환경에서 더욱 유용하게 쓰일 수 있도록 돕는 핵심 기술로 자리매김하고 있어요. 질문의 맥락과 외부 데이터를 함께 고려하여 더 스마트하고 신뢰할 수 있는 답변을 제공하는 것이 RAG의 궁극적인 목표라고 할 수 있습니다.

반응형
반응형

https://www.data.go.kr/data/15044350/fileData.do

 

한국산업은행_금융 관련 용어_20151231

리스크 개요 및 유형별 측정 방법과 관련된 용어 정의, 퇴직연금 관련 용어 정의

www.data.go.kr

반응형

+ Recent posts