이 튜토리얼에서는 다음을 사용하여 SQL을 활용하는 에이전트를 구현하는 방법을 살펴봅니다. smolagents.
표준 텍스트-SQL 파이프라인을 사용하는 것이 어떨까요?
표준 텍스트-SQL 파이프라인은 생성된 SQL 쿼리가 잘못될 수 있기 때문에 취약합니다. 더 나쁜 것은 쿼리가 잘못되었지만 오류를 발생시키지 않고 경보 없이 일부 부정확하거나 쓸모없는 출력을 제공할 수 있다는 것입니다.
대신 에이전트 시스템이 출력을 비판적으로 검사하고 쿼리 변경이 필요한지 여부를 결정할 수 있으므로 성능이 크게 향상됩니다.
이 에이전트를 구축해 봅시다! 💪
먼저 SQL 환경을 설정합니다:
복사됨
에서 sqlalchemy import (
create_engine,
메타데이터,
Table,
Column,
String,
Integer,
Float,
insert,
inspect,
text,
)
engine = create_engine("sqlite:///:memory:")
메타데이터_객체 = 메타데이터()
# 도시 SQL 테이블 생성
table_name = "영수증"
receipts = 테이블(
table_name,
메타데이터_객체,
Column("receipt_id", Integer, primary_key=True),
Column("customer_name", String(16), primary_key=True),
Column("price", Float),
Column("tip", Float),
)
메타데이터_객체.create_all(엔진)
rows = [
{"receipt_id": 1, "customer_name": "앨런 페인", "가격": 12.06, "tip": 1.20},
{"receipt_id": 2, "customer_name": "알렉스 메이슨", "가격": 23.86, "tip": 0.24},
{"receipt_id": 3, "customer_name": "우드로 윌슨", "가격": 53.43, "tip": 5.43},
{"receipt_id": 4, "customer_name": "마가렛 제임스", "가격": 21.11, "tip": 1.00},
]
행의 행에 대해
stmt = insert(receipts).values(**row)
엔진.시작()을 연결로 사용합니다:
cursor = connection.execute(stmt)에이전트 구축 #
이제 도구에서 SQL 테이블을 검색할 수 있도록 만들어 보겠습니다.
도구의 설명 속성은 에이전트 시스템에 의해 LLM의 프롬프트에 포함되며, 이는 도구 사용 방법에 대한 정보를 LLM에 제공합니다. 여기서 SQL 테이블을 설명하고자 합니다.
복사됨
inspector = inspect(엔진)
columns_info = [(col["name"], col["type"]) for col in inspector.get_columns("receipts")]
table_description = "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])
print(table_description)복사됨
열: - receipt_id: INTEGER - customer_name: VARCHAR(16) - price: FLOAT - tip: FLOAT
이제 도구를 만들어 보겠습니다. 여기에는 다음이 필요합니다: (읽기 도구 문서 자세한 내용은)
- 문서 문자열이 있는
Args:인수를 나열하는 파트입니다. - 입력과 출력 모두에 힌트를 입력하세요.
복사됨
smolagent 가져오기 도구에서
@tool
def sql_engine(query: str) -> str:
"""
테이블에 대해 SQL 쿼리를 수행할 수 있습니다. 결과의 문자열 표현을 반환합니다.
테이블의 이름은 'receipts'입니다. 테이블에 대한 설명은 다음과 같습니다:
열
- receipt_id: INTEGER
- customer_name: VARCHAR(16)
- price: FLOAT
- tip: FLOAT
Args:
쿼리: 수행할 쿼리입니다. 올바른 SQL이어야 합니다.
"""
output = ""
엔진.connect()를 con로 사용합니다:
rows = con.execute(text(query))
행의 행에 대해
output += "\n" + str(row)
출력 반환이제 이 도구를 활용하는 에이전트를 만들어 보겠습니다.
저희는 코드 에이전트smolagent의 메인 에이전트 클래스인 이 에이전트는 코드에 액션을 작성하고 ReAct 프레임워크에 따라 이전 출력을 반복할 수 있는 에이전트입니다.
모델은 에이전트 시스템을 구동하는 LLM입니다. HfApiModel을 사용하면 서버리스 또는 전용 엔드포인트를 통해 HF의 추론 API를 사용하여 LLM을 호출할 수 있지만, 독점적인 API를 사용할 수도 있습니다.
복사됨
smolagent에서 CodeAgent, HfApiModel을 가져옵니다.
에이전트 = 코드에이전트(
tools=[sql_engine],
model=HfApiModel("meta-llama/Meta-Llama-3.1-8B-Instruct"),
)
agent.run("가장 비싼 영수증을 받은 고객의 이름을 알려주실 수 있나요?")수준 2: 테이블 조인 #
이제 더 어렵게 만들어 봅시다! 에이전트가 여러 테이블에 걸친 조인을 처리하기를 원합니다.
이제 각 receipt_id에 대한 웨이터의 이름을 기록하는 두 번째 테이블을 만들어 보겠습니다!
복사됨
table_name = "waiters"
영수증 = 테이블(
table_name,
메타데이터_객체,
Column("receipt_id", Integer, primary_key=True),
Column("waiter_name", String(16), primary_key=True),
)
메타데이터_객체.create_all(엔진)
rows = [
{"receipt_id": 1, "waiter_name": "Corey Johnson"},
{"receipt_id": 2, "waiter_name": "마이클 와츠"},
{"receipt_id": 3, "waiter_name": "마이클 와츠"},
{"receipt_id": 4, "waiter_name": "마가렛 제임스"},
]
행의 행에 대해
stmt = insert(receipts).values(**row)
엔진.시작()을 연결로 사용합니다:
cursor = connection.execute(stmt)테이블을 변경했으므로 SQLExecutorTool 를 이 표의 설명과 함께 사용하여 LLM이 이 표의 정보를 적절히 활용할 수 있도록 합니다.
복사됨
updated_description = """테이블에서 SQL 쿼리를 수행할 수 있습니다. 이 도구의 출력은 실행 결과의 문자열 표현이라는 점에 유의하세요.
다음 테이블을 사용할 수 있습니다."""
inspector = inspect(engine)
for table in ["receipts", "waiters"]:
columns_info = [(col["name"], col["type"]) for col in inspector.get_columns(table)]
table_description = f"테이블 '{table}':\n"
table_description += "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])
updated_description += "\n\n" + table_description
print(updated_description)이 요청은 이전 요청보다 조금 더 어렵기 때문에 더 강력한 LLM 엔진을 사용하도록 전환합니다. Qwen/Qwen2.5-Coder-32B-Instruct!
복사됨
sql_engine.description = updated_description
에이전트 = 코드 에이전트(
tools=[sql_engine],
model=HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct"),
)
agent.run("어느 웨이터가 팁으로 더 많은 총 금액을 받았나요?")바로 작동합니다! 설정은 의외로 간단하지 않나요?
이 예제는 완료되었습니다! 이러한 개념에 대해 살펴봤습니다:
- 새로운 도구 구축.
- 도구 설명 업데이트하기.
- 더 강력한 LLM으로 전환하면 상담원 추론에 도움이 됩니다.
✅ 이제 꿈꿔왔던 텍스트-SQL 시스템을 구축할 수 있습니다! ✨
