Python 31

Llama-index 기반 CRAG 워크플로우 만들기

Corrective Retrieval Augmented Generation(CRAG)는 평가기와 대규모 웹 검색을 통해 검색된 문서의 관련성을 평가하고 증강하여 언어 모델 생성의 견고성을 높이고, 보다 정확하고 신뢰할 수 있는 정보를 생성에 사용하도록 설계된 방법이다. llama-index는 RAG를 구현하기 위한 특화형 프레임워크이다.이 llama-index를 활용해 CRAG 워크플로우를 구현해보려 한다.라마인덱스 워크플로우는 기본적으로 'event'라는 객체를 전파하는 방식으로 순차적으로 진행하는 방식으로 동작한다.Workflow 객체는 step 단위로 실행을 하며 각 step간에 Event를 통해 다음 step을 결정하게 된다. CRAG의 핵심 요소인 웹 검색 평가 엔진에는 관련성 평가기로 GPT-..

Python/llama-index 2025.06.12

Python의 새로운 `t-strings`

t-문자열(t-strings) 은 Python 3.14에서 새롭게 도입될 안전하고 유연한 문자열 처리 기능임기존 f-string과 달리, t-string은 문자열이 아닌 Template 객체로 반환되어 자동 출력 없이 안전한 처리 가능t-string은 HTML, SQL 등 동적 입력을 안전하게 이스케이프할 수 있는 구조를 갖고 있음JavaScript의 **태그 템플릿(tagged templates)**과 유사한 개념으로, 다양한 변환 및 처리 확장이 가능함Python 개발 도구 생태계가 이 기능을 잘 지원한다면, 웹/보안 중심의 문자열 처리 방식에 큰 변화를 줄 수 있음Python의 새 기능: t-문자열(Template Strings)Python 3.14부터 t"..." 문법으로 사용하는 Template..

Python 2025.04.22

PDF table-extraction (표 추출) 실험 (with pdfplumber, camelot, tabula-py)

table extraction은 문서로부터 표를 양식 그대로 추출하는 기술에 대해 연구하는 분야이다.이 기술은 주로 데이터 과학자들이나 연구자들에게 유용한데, 문헌이나 문서들로부터 표 형식의 데이터를 추출해서 가공 가능한 포맷 (예를 들면 csv나 dataframe) 등으로 변환하는 기술은 데이터로부터 다양한 인사이트를 얻는데 도움이 되기 때문이다. 파이썬을 사용해서 표를 추출하는 방법으로는 크게 3가지 툴이 추천되곤한다.pdfplumbercamelottabula-py개인적으로 이들 중에는 pdfplumber가 가장 높은 성능을 보였으며, 그 다음으로는 tabula-py가 좋았고, camelot이 가장 추출률이 좋지 않았었다.이제 예제 코드와 함께 각 툴들에 대해서 소개를 해보고자 한다.(참고로 해당 툴..

Python 2024.07.22

SQLAlchemy에서 session.commit()과 session.flush()의 차이

SQLAlchemy를 사용해서 어떤 데이터를 추가/변경 또는 삭제를 할 때 session.commit() 메소드와 session.flush() 메소드가 자주 사용되어지곤 한다. 기본적으로 둘 다 모든 적용되지 않은 변경 사항들을 저장하는 역할을 하나, session.commit()의 경우에는 한가지 추가적인 작업을 진행하게 되는데, 바로 연결된 모든 객체들을 expire 처리하고 다시 로딩을 한다는 점이다. 이 기능을 하는 여러가지 이유가 있겠지만, 대표적인 이유 중 하나로는 INSERT 후에 autoincrement id 값을 가져오기 위해서가 있다. 복잡한 비즈니스 로직을 구현하다보면 M:N의 문제들이 많이 발생하게 되는데, 이러한 경우 primary key들을 저장하는 매핑 테이블이 존재하기 마련이..

Python/sqlalchemy 2024.02.23

SQLAlchemy Session과 AsyncSession은 synchronizable한 객체일까?

SQLAlchemy에서 세션은 단일 데이터베이스 트랜잭션을 나타내는 변경 가능한 상태 저장 객체이다. 따라서 세션 객체는 신중한 동기화 없이는 동시 스레드 또는 비동기 작업 간에 공유할 수 없다. 세션은 non-concurrent 방식으로 (즉 특정 Session 객체는 한 번에 하나의 스레드 또는 작업에서만) 사용되어야 한다. SQLAlchemy의 asyncio 확장 기능에서 AsyncSession 객체를 사용하는 경우, 이 객체는 Session 객체를 기반으로 만들어지는 단순한 프록시일 뿐이며 동일한 규칙이 적용된다. AsyncSession은 동기화되지 않고 mutable(변경 가능)한 stateful한 특성을 가지는 객체이므로 여러 asyncio 작업에서 단일 인스턴스의 AsyncSession을 ..

Python/sqlalchemy 2024.02.23

Ray 개요 :: 파이썬 기반 분산 컴퓨팅

Ray는 파이썬 데이터 과학 커뮤니티를 위해서 만든 유연한 분산 컴퓨팅 프레임워크이다. Ray는 간결한 구조를 바탕으로 분산 프로그램을 효율적으로 작성 가능하다. 노트북에서 Ray를 사용하면 파이썬 프로그램을 효율적으로 병렬화하고, 로컬에서 테스트한 코드를 변경 없이도 클러스터에서 실행한다. Ray Core(Ray의 기본 API)는 C++로 개발되었으나, 애초에 파이썬을 위한 프레임워크이며 자바를 비롯한 여러 언어를 바인딩하도록 설계되었다. Ray가 데이터 과학 생태계에 여러 중요한 언어를 지원하기 때문에 데이터 과학자들 및 엔지니어들이 더 쉽게 효율적인 분산 데이터 처리 파이프라인 및 엔진을 구축할 수 있도록 큰 기여를 했다는 점은 부정할 수 없는 사실이다. 알다시피, 분산 컴퓨팅은 매우 어렵다는 인식..

Python/ray 2024.02.11

파이썬에서 더 빠른 JSON serialization 사용하기

보통 파이썬에서 JSON을 string으로 직렬화(serialization)하거나 직렬화된 데이터로부터 JSON 객체(dict 타입)를 로딩하는 방법은 아래와 같이 json 표준 모듈을 사용하는 것이다. import json data = {'a': 'a', 'b': 'b'} data_str = json.dumps(data) new_data = json.load(data_str) 그러나, 이 표준 라이브러리는 파이썬으로 구현되어 있기 때문에 C/C++이나 Rust로 구현된 구현체들보다 더 느리다. 보통 빠른 JSON 직렬화 및 역직렬화를 위해서는 ujson과 orjson이 사용된다. ujson은 C로 작성된 JSON 모듈의 파이썬 바인딩이다. 해당 라이브러리는 파이썬 3.7부터 지원되고 있다. orjson..

Python 2024.01.22

python psutil을 사용해서 간단한 모니터링 스크립트 구축하기

Bash 스크립트에서 ps를 사용하면 프로세스 정보를 알 수 있듯이, 파이썬에서는 psutil 라이브러리를 사용하면 프로세스 상태를 가져올 수 있는 API를 사용할 수가 있게 된다. https://pypi.org/project/psutil/ 아래는 psutil을 사용해서 작성한 간단한 프로세스 상태 모니터링 스크립트이다. import psutil from datetime import datetime import pandas as pd import time import os def get_size(bytes): """ Returns size of bytes in a nice format """ for unit in ['', 'K', 'M', 'G', 'T', 'P']: if bytes < 1024: ret..

Python 2024.01.02

sqlalchemy로 MySQL 연결 시 필요한 라이브러리

알다시피, sqlalchemy의 기본 데이터베이스는 PostgreSQL이다. 따라서, psycopg나 asyncpg와 같은 PostgreSQL용 드라이버 및 라이브러리는 자동으로 함께 설치가 되나, MySQL을 사용하는 사람들은 필요한 라이브러리를 일일히 추가해주어야 한다. pip install mysqlclient pip install mysql-connector pip install mysql-connector-python 위와 같이 "mysqlclient"와 "mysql-connector", 그리고 "mysql-connector-python"까지 설치를 해주어야 한다. 처음 시도할 때에는 "mysqlclient"와 "mysql-connector"만 설치하고 에러 메시지를 정독하면서 왜 안되는지 열심..

Python/sqlalchemy 2024.01.02

sqlalchemy logging 옵션 끄기

sqlalchemy를 처음 사용할 때에는 계속 나오는 로그들을 어떻게 없앨 수 있을지에 대해서 이리저리 구글링을 많이 해보게 된다. 스택오버플로우를 봐도 잘못된 답변들도 보이고, 결국 30분간 이리저리 삽질을 하다가 나름의 답을 찾아냈다. 아래 코드와 같이 4개의 토픽에 대해서 로그레벨을 ERROR로 설정해놓으면 데이터베이스 에러로 인한 상황을 제외하고는 모든 디버깅 로그나 info 로그가 다 필터링되게 된다. import logging from typing import Any, Generator # from sqlalchemy.sql import text from sqlalchemy import Column, Integer, MetaData, Table, Text, select from sqlmodel..

Python/sqlalchemy 2024.01.02