实现一个与旅行相关的SQL数据库交互的工具,利用大型语言模型(LLM)生成和执行SQL查询,并通过语言模型处理查询结果生成最终答案。
完整代码:
from langchain_core.tools import tool
from langchain_community.utilities import SQLDatabase
from langchain.chains import create_sql_query_chain
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from operator import itemgetter
from langchain_openai import ChatOpenAI
class TravelSQLAgentTool:
"""
A tool for interacting with a travel-related SQL database using an LLM (Language Model) to generate and execute SQL queries.
This tool enables users to ask travel-related questions, which are transformed into SQL queries by a language model.
The SQL queries are executed on the provided SQLite database, and the results are processed by the language model to
generate a final answer for the user.
Attributes:
sql_agent_llm (ChatOpenAI): An instance of a ChatOpenAI language model used to generate and process SQL queries.
system_role (str): A system prompt template that guides the language model in answering user questions based on SQL query results.
db (SQLDatabase): An instance of the SQL database used to execute queries.
chain (RunnablePassthrough): A chain of operations that creates SQL queries, executes them, and generates a response.
Methods:
__init__: Initializes the TravelSQLAgentTool by setting up the language model, SQL database, and query-answering pipeline.
"""
def __init__(self, llm: str, sqldb_directory: str, llm_temerature: float) -> None:
"""
Initializes the TravelSQLAgentTool with the necessary configurations.
Args:
llm (str): The name of the language model to be used for generating and interpreting SQL queries.
sqldb_directory (str): The directory path where the SQLite database is stored.
llm_temerature (float): The temperature setting for the language model, controlling response randomness.
"""
self.sql_agent_llm = ChatOpenAI(
model=llm, temperature=llm_temerature)
self.db = SQLDatabase.from_uri(
f"sqlite:///{sqldb_directory}")
print(self.db.get_usable_table_names())
# write_query
write_query = create_sql_query_chain(self.sql_agent_llm, self.db)
# execute_query
execute_query = QuerySQLDataBaseTool(db=self.db)
# answer
self.system_role = """Given the following user question, corresponding SQL query, and SQL result, answer the user question.\n
Question: {question}\n
SQL Query: {query}\n
SQL Result: {result}\n
Answer:
"""
answer_prompt = PromptTemplate.from_template(
self.system_role)
answer = answer_prompt | self.sql_agent_llm | StrOutputParser()
# chain
self.chain = (
RunnablePassthrough.assign(query=write_query).assign(
result=itemgetter("query") | execute_query
)
| answer
)
from agent_graph.load_tools_config import LoadToolsConfig
TOOLS_CFG = LoadToolsConfig()
@tool
def query_travel_sqldb(query: str) -> str:
"""Query the Swiss Airline SQL Database and access all the company's information. Input should be a search query."""
agent = TravelSQLAgentTool(
llm=TOOLS_CFG.travel_sqlagent_llm, # 比如:gpt-3.5-turbo
sqldb_directory=TOOLS_CFG.travel_sqldb_directory, # 数据库地址
llm_temerature=TOOLS_CFG.travel_sqlagent_llm_temperature # 0到10
)
response = agent.chain.invoke({"question": query})
return response
以下是代码的详细解释:
这段代码定义了一个用于查询与旅行相关的SQL数据库的工具类TravelSQLAgentTool
,并通过语言模型(LLM)生成和执行SQL查询。以下是每个方法的详细解释:
TravelSQLAgentTool
类
该类的作用是通过LLM与SQLite数据库进行交互,生成SQL查询,执行这些查询,并基于查询结果回答用户的旅行相关问题。
__init__
方法
- 作用:初始化
TravelSQLAgentTool
实例,设置语言模型、SQL数据库和查询处理流水线。 - 参数:
llm
:要使用的语言模型的名称,用于生成和解释SQL查询。sqldb_directory
:SQLite数据库文件的路径。llm_temerature
:设置语言模型的温度参数,控制响应的随机性。温度越高,生成的回答越随机。
- 内部操作:
- 创建一个
ChatOpenAI
实例 (self.sql_agent_llm
) 来生成SQL查询和处理结果。 - 使用
SQLDatabase.from_uri()
方法加载SQL数据库(SQLite数据库)。 - 使用
create_sql_query_chain()
函数创建SQL查询链 (write_query
),负责将用户问题转化为SQL查询。 - 创建
QuerySQLDataBaseTool
实例 (execute_query
),该工具用于执行SQL查询。 - 定义一个系统角色提示 (
self.system_role
),该角色提示引导语言模型基于SQL查询结果来回答用户问题。 - 创建一个回答模板 (
answer_prompt
),并将其与语言模型和输出解析器连接起来,生成最终回答 (answer
)。 - 定义一个操作链 (
self.chain
),将上述所有部分串联起来,完成查询生成、执行和回答过程。
- 创建一个
query_travel_sqldb
函数
- 作用:该函数是一个装饰器
@tool
定义的工具函数,接受用户的查询字符串,创建一个TravelSQLAgentTool
实例,并使用它处理查询,最终返回处理后的回答。 - 参数:
query
:用户的查询,表示对旅行相关信息的搜索。
- 内部操作:
- 使用
LoadToolsConfig
加载配置文件(TOOLS_CFG
)。 - 创建一个
TravelSQLAgentTool
实例,并传递所需的配置参数,如语言模型名称、数据库路径和温度设置。 - 使用
TravelSQLAgentTool
的chain
流水线处理用户查询,执行SQL查询并返回回答。
- 使用
关键部分
SQLDatabase
:这是langchain_community
库中的一个类,封装了与SQL数据库的交互,提供了查询和执行功能。create_sql_query_chain
:该函数用于创建一个SQL查询链。它将语言模型与SQL数据库连接,确保语言模型能够从数据库中提取必要的信息来生成有效的SQL查询。QuerySQLDataBaseTool
:该工具类用于执行SQL查询,它接收生成的SQL查询并执行在数据库上,返回查询结果。PromptTemplate
:langchain_core
中的类,用于创建基于模板的提示。通过模板,语言模型能够理解如何处理特定类型的输入(在这个例子中是SQL查询和结果)并生成回答。RunnablePassthrough
:这是一个流水线操作工具,用于将多个操作(如生成查询、执行查询和生成回答)串联起来。它确保各个操作按顺序执行,并将中间结果传递到下一个操作。
流程概述
- 用户通过
query_travel_sqldb()
传入查询。 TravelSQLAgentTool
通过语言模型生成SQL查询。- 生成的SQL查询通过
QuerySQLDataBaseTool
执行,获取查询结果。 - 根据系统角色提示,最终生成答案,回答用户的问题。
这段代码的主要功能是结合语言模型和SQL数据库,使得用户能够用自然语言查询与旅行相关的数据库信息。
标签:模型,数据库,查询,llm,SQL,query,self From: https://blog.csdn.net/u013565133/article/details/145113796