[PYTHON/LANGCHAIN] create_react_agent 함수 : SQLITE 데이터베이스에 질의 응답하는 에이전트 만들기
■ create_react_agent 함수를 사용해 SQLITE 데이터베이스에 질의 응답하는 에이전트를 만드는 방법을 보여준다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import os from langchain_openai import ChatOpenAI from langchain_community.utilities import SQLDatabase from langchain_community.agent_toolkits import SQLDatabaseToolkit from langchain_core.messages import SystemMessage from langgraph.prebuilt import create_react_agent from langchain_core.messages import HumanMessage os.environ["OPENAI_API_KEY"] = "<OPENAI_API_KEY>" # OpenAI 채팅 모델을 설정한다. chatOpenAI = ChatOpenAI(model = "gpt-3.5-turbo-0125") # SQLITE 데이터베이스를 초기화한다. sqlDatabase = SQLDatabase.from_uri("sqlite:///chinook.db") # SQL 데이터베이스 툴킷을 설정한다. sqlDatabaseToolkit = SQLDatabaseToolkit(db = sqlDatabase, llm = chatOpenAI) # SQL 데이터베이스 툴킷 도구 리스트를 설정한다. toolList = sqlDatabaseToolkit.get_tools() systemMessageContent = """You are an agent designed to interact with a SQL database. Given an input question, create a syntactically correct SQLite query to run, then look at the results of the query and return the answer. Unless the user specifies a specific number of examples they wish to obtain, always limit your query to at most 5 results. You can order the results by a relevant column to return the most interesting examples in the database. Never query for all the columns from a specific table, only ask for the relevant columns given the question. You have access to tools for interacting with the database. Only use the below tools. Only use the information returned by the below tools to construct your final answer. You MUST double check your query before executing it. If you get an error while executing a query, rewrite the query and try again. DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database. To start you should ALWAYS look at the tables in the database to see what you can query. Do NOT skip this step. Then you should query the schema of the most relevant tables.""" systemMessage = SystemMessage(content = systemMessageContent) compiledStateGraph = create_react_agent(chatOpenAI, toolList, messages_modifier = systemMessage) for addableUpdatesDict in compiledStateGraph.stream({"messages" : [HumanMessage(content = "Which country's customers spent the most?")]}): print(addableUpdatesDict) print("----") """ {'agent': {'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_2TBTVFqIcpUoDaQKOEaeQ2mF', 'function': {'arguments': '{"query":"SELECT c.Country, SUM(i.Total) AS TotalSpent\\nFROM customers c\\nJOIN invoices i ON c.CustomerId = i.CustomerId\\nGROUP BY c.Country\\nORDER BY TotalSpent DESC\\nLIMIT 1"}', 'name': 'sql_db_query'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 58, 'prompt_tokens': 557, 'total_tokens': 615}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-048336fa-ae8d-4f7e-bffe-59eec09ebeec-0', tool_calls=[{'name': 'sql_db_query', 'args': {'query': 'SELECT c.Country, SUM(i.Total) AS TotalSpent\nFROM customers c\nJOIN invoices i ON c.CustomerId = i.CustomerId\nGROUP BY c.Country\nORDER BY TotalSpent DESC\nLIMIT 1'}, 'id': 'call_2TBTVFqIcpUoDaQKOEaeQ2mF'}], usage_metadata={'input_tokens': 557, 'output_tokens': 58, 'total_tokens': 615})]}} ---- {'tools': {'messages': [ToolMessage(content="[('USA', 523.0600000000004)]", name='sql_db_query', tool_call_id='call_2TBTVFqIcpUoDaQKOEaeQ2mF')]}} ---- {'agent': {'messages': [AIMessage(content='Customers from the USA spent the most with a total amount of 523.06.', response_metadata={'token_usage': {'completion_tokens': 18, 'prompt_tokens': 637, 'total_tokens': 655}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-f29e2d4a-f585-42ad-a7e7-f41ea0705633-0', usage_metadata={'input_tokens': 637, 'output_tokens': 18, 'total_tokens': 655})]}} ---- """ |
▶ requirements.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
aiohttp==3.9.5 aiosignal==1.3.1 annotated-types==0.7.0 anyio==4.4.0 async-timeout==4.0.3 attrs==23.2.0 certifi==2024.6.2 charset-normalizer==3.3.2 dataclasses-json==0.6.7 distro==1.9.0 exceptiongroup==1.2.1 frozenlist==1.4.1 greenlet==3.0.3 h11==0.14.0 httpcore==1.0.5 httpx==0.27.0 idna==3.7 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.2.3 langchain-community==0.2.4 langchain-core==0.2.5 langchain-openai==0.1.8 langchain-text-splitters==0.2.1 langgraph==0.0.66 langsmith==0.1.77 marshmallow==3.21.3 multidict==6.0.5 mypy-extensions==1.0.0 numpy==1.26.4 openai==1.33.0 orjson==3.10.4 packaging==23.2 pydantic==2.7.4 pydantic_core==2.18.4 PyYAML==6.0.1 regex==2024.5.15 requests==2.32.3 sniffio==1.3.1 SQLAlchemy==2.0.30 tenacity==8.3.0 tiktoken==0.7.0 tqdm==4.66.4 typing-inspect==0.9.0 typing_extensions==4.12.2 urllib3==2.2.1 yarl==1.9.4 |
※ pip install langchain