Langchain library 활용 기초편
목표 : 데이터 조회 요청을 자연어로 작성하여, 관련 데이터를 반환하는 기능
3.12.7!pip install psycopg2-binary sqlalchemy
!pip install -U langchain langchain-community langchain-openai
import langchain
langchain.__version__
# '0.3.20'
from sqlalchemy import create_engine
import pandas as pd
hostname='localhost'
username='xxx'
password='xxx'
port='xxx'
database='xxx'
connect_url = f"postgresql://{username}:{password}@{hostname}:{port}/{database}"
engine = create_engine(connect_url)
table = "employees"
query = f"SELECT * FROM {table}"
df = pd.read_sql(query, engine)
df.head()

SQLDatabase 클래스 : 테이블의 열 정보와 샘플 데이터를 가져오는 데 사용할 수 있는 get_table_info 메서드 제공from langchain.sql_database import SQLDatabase
db = SQLDatabase.from_uri(connect_url)
# DB의 테이블 목록 출력
print(db.get_table_names())
print(db.get_usable_table_names())
print(db.get_table_info(table_names=['employees']))
['employees', 'employees22','test']
['employees', 'employees22','test']
CREATE TABLE employees (
id SERIAL NOT NULL,
name TEXT NOT NULL,
age INTEGER NOT NULL,
lon NUMERIC(9, 6) NOT NULL,
lat NUMERIC(9, 6) NOT NULL,
check_time TIMESTAMP WITHOUT TIME ZONE NOT NULL,
age_group TEXT NOT NULL,
en_name TEXT NOT NULL,
department TEXT NOT NULL,
position TEXT NOT NULL,
residence TEXT NOT NULL,
CONSTRAINT employees_pkey PRIMARY KEY (id)
)
3 rows from employees table:
id name age lon lat check_time age_group en_name department position residence
1 홍길동 25 126.978300 37.566500 2025-02-20 10:00:00 20대 Ace IT 사원 강남구
2 김철수 30 127.034300 37.565100 2025-02-20 10:05:00 30대 Blaze 마케팅 대리 서초구
3 이영희 22 126.955400 37.558500 2025-02-20 10:10:00 20대 Cloud 영업 사원 송파구
*/
get_table_info를 통해서 테이블의 기본 정보를 가지고 있는 것을 볼 수 있음create_sql_query_chain : 입력한 DB에 대한 SQL Query를 생성하는 Chainfrom langchain.sql_database import SQLDatabase
from sqlalchemy import create_engine,text
from langchain_openai import ChatOpenAI
from langchain.chains import create_sql_query_chain
db = SQLDatabase.from_uri(connect_url)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
chain = create_sql_query_chain(llm, db)
query = chain.invoke({"question": "employees의 테이블에서 20대 사람들의 데이터를 모두 가져와줘"})
print(query)
SELECT "id", "name", "age", "lon", "lat", "check_time", "age_group", "en_name", "department", "position", "residence"
FROM employees
WHERE "age_group" = '20대'
LIMIT 5;
query = chain.invoke({"question": "employees의 테이블에서 20대 사람들의 데이터를 모두 가져와줘"})
df = pd.read_sql(query, engine)
print(query)
df

query = chain.invoke({"question": "서울 사는 사람 데이터 모두 가져와줘"})
df = pd.read_sql(query, engine)
print(query)
df
SELECT "id", "name", "age", "lon", "lat", "check_time", "age_group", "en_name", "residence"
FROM employees
WHERE "residence" = '서울'
UNION
SELECT "id", "name", "age", "lon", "lat", "check_time", "age_group", "en_name", "residence"
FROM employees22
WHERE "residence" = '서울'
LIMIT 5;
query = chain.invoke(
{
"question": "employees 테이블에서 위도(lon), 경도(lat) 좌표를 사용하여 point geometry 데이터를 생성해줘. 그걸 다시 wkt로 바꿔서 보여줘"
}
)
df = pd.read_sql(text(query), engine)
print(query)
df
st_asText 변환 함수를 쓰고, st_setSRID로 epsg까지 설정해줌(놀랍다)
from sqlalchemy import create_engine, text
import pandas as pd
from langchain.sql_database import SQLDatabase
from langchain_openai import ChatOpenAI
from langchain.chains import create_sql_query_chain
hostname='localhost'
username='xxx'
password='xxx'
port='xxx'
database='xxx'
connect_url = f"postgresql://{username}:{password}@{hostname}:{port}/{database}"
engine = create_engine(connect_url)
db = SQLDatabase.from_uri(connect_url)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
chain = create_sql_query_chain(llm, db)
# query test
questions=[
"employees의 테이블에서 20대 사람들의 데이터를 모두 가져와줘",
"서울 사는 사람 데이터 모두 가져와줘",
"employees 테이블에서 위도(lon), 경도(lat) 좌표를 사용하여 point geometry 데이터를 생성해줘. 그걸 다시 wkt로 바꿔서 보여줘"
]
for question in questions:
query = chain.invoke({"question" : f"{question}"})
df=pd.read_sql(text(query), engine)
print(df.head())