이 튜토리얼에서는 다음을 사용하여 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 시스템을 구축할 수 있습니다! ✨