如何使用LangChain自定义agent的制作(1) - 自定义一个可以执行 SQL 查询的 Agent


前言

之前我们一块学习了
如何使用LangChain库使用大模型与SQL数据库进行交互
文章末尾说了要写一个自定义的 agent 把我们的代码包进去,今天我们一块来尝试写一个自定义agent

一、准备工作梳理

要使用 LangChain 自定义一个可以执行 SQL 查询的 Agent,需要完成以下几个步骤:

1) 安装依赖包:确保你已经安装了 langchainSQLAlchemy 和其他必要的包。

2) 设置数据库连接:使用 SQLAlchemy 连接到你的数据库。

3) 自定义 Agent:创建一个 Agent,它可以解析用户输入的 SQL 查询并执行。

4) 运行示例:通过运行一个示例,验证你的 Agent 是否工作正常。

下面是一个完整的示例代码,演示如何实现这一点。

一、 安装依赖包

首先安装必要的 Python 包:

pip install langchain sqlalchemy

二、 设置数据库连接

创建一个 Python 文件(如 sql_agent.py),并设置数据库连接。这里以 SQLite 为例:

from sqlalchemy import create_engine

# 设置数据库连接
engine = create_engine('sqlite:///example.db')

# 创建一个示例表并插入一些数据
with engine.connect() as connection:
    connection.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER
    )
    """)
    connection.execute("""
    INSERT INTO users (name, age) VALUES
    ('Alice', 30),
    ('Bob', 25),
    ('Charlie', 35)
    """)

三、 自定义 Agent

定义一个 LangChain 的 Agent,它可以执行 SQL 查询并返回结果:

from langchain.agents import initialize_agent, Tool
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from sqlalchemy.orm import sessionmaker

# 创建数据库会话
Session = sessionmaker(bind=engine)
session = Session()

# 定义执行SQL查询的工具函数
def execute_sql_query(query):
    try:
        result = session.execute(query)
        return result.fetchall()
    except Exception as e:
        return str(e)

# 定义LangChain的工具
sql_tool = Tool(
    name="SQL Executor",
    func=execute_sql_query,
    description="Executes SQL queries and returns the result"
)

# 初始化LangChain的LLM
llm = OpenAI(api_key="YOUR_OPENAI_API_KEY")

# 创建自定义Agent
agent = initialize_agent(
    tools=[sql_tool],
    llm=llm,
    agent_type="zero_shot",
    prompt_template=PromptTemplate(
        template="You are an SQL agent. Execute the following SQL query: {query}",
        input_variables=["query"]
    )
)

四、 运行示例

使用自定义的 Agent 执行 SQL 查询:

def main():
    query = "SELECT * FROM users WHERE age > 30"
    result = agent({"query": query})
    print(result)

if __name__ == "__main__":
    main()

五、 完整代码

将以上所有代码合并到一个文件中:

# sql_agent.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from langchain.agents import initialize_agent, Tool
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

# 设置数据库连接
engine = create_engine('sqlite:///example.db')

# 创建数据库会话
Session = sessionmaker(bind=engine)
session = Session()

# 创建一个示例表并插入一些数据
with engine.connect() as connection:
    connection.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER
    )
    """)
    connection.execute("""
    INSERT INTO users (name, age) VALUES
    ('Alice', 30),
    ('Bob', 25),
    ('Charlie', 35)
    """)

# 定义执行SQL查询的工具函数
def execute_sql_query(query):
    try:
        result = session.execute(query)
        return result.fetchall()
    except Exception as e:
        return str(e)

# 定义LangChain的工具
sql_tool = Tool(
    name="SQL Executor",
    func=execute_sql_query,
    description="Executes SQL queries and returns the result"
)

# 初始化LangChain的LLM
llm = OpenAI(api_key="YOUR_OPENAI_API_KEY")

# 创建自定义Agent
agent = initialize_agent(
    tools=[sql_tool],
    llm=llm,
    agent_type="zero_shot",
    prompt_template=PromptTemplate(
        template="You are an SQL agent. Execute the following SQL query: {query}",
        input_variables=["query"]
    )
)

def main():
    query = "SELECT * FROM users WHERE age > 30"
    result = agent({"query": query})
    print(result)

if __name__ == "__main__":
    main()

运行 sql_agent.py 文件,Agent 将执行指定的 SQL 查询并返回结果。确保你替换 "YOUR_OPENAI_API_KEY" 为你的实际 OpenAI API 密钥。

六、使用agent的好处

将功能封装成一个 Agent 有许多好处,特别是在使用 LangChain 框架和执行 SQL 查询的情况下:

1. 模块化和可重用性

  • 封装和抽象:将功能封装成 Agent 可以将复杂的逻辑抽象出来,使得代码更加模块化。这样可以更容易地理解、维护和扩展。
  • 代码复用:封装好的 Agent 可以在不同的项目或不同的部分中重复使用,而无需重新实现相同的逻辑。

2. 扩展性

  • 添加新功能:当需要添加新的功能时,只需在现有的 Agent 上进行扩展,而不需要大规模修改原有代码。
  • 插拔式设计:你可以轻松地添加或替换工具,或修改 Agent 的行为,而不影响整体系统。

3. 简化复杂性

  • 简化主逻辑:主逻辑只需要调用 Agent,而不需要处理具体的实现细节,使得主逻辑更加简洁和清晰。
  • 责任分离:将不同的功能分离到不同的 Agent 或工具中,可以让每个部分专注于自己的功能,从而减少代码的复杂性和耦合度。

4. 增强可维护性

  • 易于调试和测试:由于 Agent 封装了特定的功能,测试和调试可以集中在 Agent 的输入和输出上,简化了调试过程。
  • 清晰的接口:Agent 提供了清晰的接口,其他部分只需与接口交互,而无需了解具体的实现细节。

5. 集成大语言模型的能力

  • 自然语言处理:通过封装,Agent 可以轻松集成大语言模型(如 OpenAI),实现自然语言理解和生成能力,使得系统能够处理更加复杂和自然的用户请求。
  • 动态生成查询:利用大语言模型,Agent 可以根据用户的自然语言请求动态生成 SQL 查询,从而使系统更加智能和灵活。

6. 易于扩展到其他任务

  • 多任务处理:一个 Agent 可以包含多个工具,处理不同的任务(如 SQL 查询、数据处理、API 调用等),从而实现多任务处理能力。
  • 跨领域应用:Agent 的设计可以适用于不同的领域和应用场景,通过配置和扩展,可以快速适应新的需求。

继续思考

上面的sql是我们直接给出来的,可不可以使用我们之前一起学习的方法,将sql自动生成呢?后续继续讨论

  • 40
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值