1 .AI Agent 概念与架构

  • Agent定义

咱们先来说说什么是Agent哈。简单来说,Agent就是一种能够自己做出决定、采取行动去达到某个目标的东西。它可以是一个软件程序,也可以是一个实体机器人啥的。反正就是能自己主动去干事儿的那种。

那AI Agent又是什么呢?它呀,是基于人工智能技术,特别是大模型技术造出来的智能实体。这个智能实体可不简单,它能感知周围的环境,理解各种信息,然后根据这些信息做出行动,目的就是为了完成某个特定的目标。比如说,它可以帮你自动回复邮件,或者从一堆数据里找出你想要的信息。

  • Agents 利用 LLM 作为推理引擎

接下来咱们聊聊Agents是怎么工作的。它们有个很厉害的本事,就是利用那种叫LLM(大语言模型)的东西作为推理引擎。这玩意儿可聪明了,能把你输入的自然语言,就像咱们平时说话那样的句子,转化成一系列的工具调用指令。然后呢,它还能协调这些工具一起工作,把任务给完成了。比如说,你想查点东西,你就告诉它,它就知道你要用哪个搜索引擎,怎么搜,最后把结果给你找出来。

这里面的核心思想就是让LLM自己来决定该先做哪个动作,该选哪个工具,而不是像以前那样,什么都得事先写好代码,让它按部就班地执行。这样多灵活啊,对吧?

  • Agent模块在Langchain框架中的角色

再讲讲Agent模块在Langchain框架里是干啥的。Langchain是个很有名的框架,专门用来构建基于语言的应用。在这个框架里,Agent模块可是个重要角色。它负责实现那些智能代理的功能,就是让计算机能像人一样思考和行动。它怎么做到的呢?通过预设一些规则和算法,然后自动去执行特定的任务。比如说,你可以设定一些规则,让它在收到邮件时自动回复,或者在特定时间提醒你做某件事。

  • Agent 模块的特点

最后说说Agent模块的特点吧。它有两个特别突出的地方:智能化和自动化。它能根据预设的规则和算法自己做出决策,然后去执行任务。这样一来,工作效率就高多了,而且准确性也更好。比如说,在处理大量数据时,它能快速准确地找出你需要的信息,比你自己去一个个看快多了。

  • langchain.agents模块

langchain.agents模块是LangChain框架中的核心组件之一,主要用于构建能够自主决策和执行复杂任务的智能代理(Agent)。通常情况下,我们会基于agents模块下的create_xml_agentcreate_react_agenttool进行不同智能体的构建。

2 create_xml_agent构建智能体

在LangChain框架中,create_xml_agent函数主要用于创建一个能够处理XML格式数据交互的代理。它结合了语言模型(LLM)和其他工具,使得代理可以根据输入的指令和上下文信息,以XML格式进行思考、规划和与工具的交互,最终生成符合要求的输出

`create_xml_agent`的核心目标是创建一个能够处理XML格式数据的代理。这意味着代理的输入、输出以及中间的数据交互都基于XML格式,适合与返回XML响应的工具或服务进行交互(但是并不绝对!)

LangChain框架本身具有高度的灵活性和可扩展性,create_xml_agent也不例外。它可以与其他工具和组件进行集成,根据具体的应用场景和需求,进一步扩展智能体的功能。例如,可以结合搜索引擎工具获取外部信息,再通过XML代理对获取的信息进行整理和分析,最终生成符合要求的输出。

示例操作:让智能体自动调用工具查找数据

为了更好的理解Agent框架,让我们构建一个具有两个工具的Agent:一个用于在线查找内容,另一个用于查找指定城市的气象数据。

SerpAPI是一个搜索引擎结果页面API,它允许开发者和研究人员通过编程方式获取Google、Bing、Yahoo和其他搜索引擎的搜素结果。使用SerpAPI,用户可以避免直接与搜索引擎进行交互(无需科学上网),从而避免了可能遇到的各种问题,例如:用户代理、请求限制等问题。

环境安装:pip install google-search-results

官网进行API KEY的申请:https://serpapi.com/

  • 测试搜索效果

    fromlangchain_community.utilitiesimportSerpAPIWrapper
    serpapi_api_key="60f286e601f4xxxc65e7a9b3ceb06a3f0dc8e0fe7ce56ec93d6274ccd"
    search=SerpAPIWrapper(serpapi_api_key=serpapi_api_key)
    search.run("周杰伦演唱会最新信息")
  • 2个外部函数构建

    defget_search_result(question):
        """
        互联网搜索函数
        :param question: 必要参数,字符串类型,用于表示在互联网上进行搜素的关键词或者搜索内容的简短描述,\
        :return:SerpAPI API根据参数question进行互联网搜索后的结果,其中包含了全部重要的搜索结果内容。
        """
        fromlangchain_community.utilitiesimportSerpAPIWrapper
        serpapi_api_key="60f286e601f44a26600e42cxxxa3f0dc8e0fe7ce56ec93d6274ccd"
        search=SerpAPIWrapper(serpapi_api_key=serpapi_api_key)
        result=search.run(question)
        returnresult
    
    importrequests
    importjson
    defget_weather(loc):
        """
        查询即时天气函数
        :param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\
        :return:查询即时天气的结果\
        返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
        """
        api_key="SGkvDR94bWqZfdosf"
        url=f"https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={loc}&language=zh-Hans&unit=c"
        response=requests.get(url)
        data=response.json()
        returnjson.dumps(data)
    
    get_weather("上海")
  • 将外部函数封装成Agent可调用的工具对象

    fromlangchain.agentsimportTool
    searchTool=Tool(
        name="get_search_result",
        description="互联网搜索函数",
        func=get_search_result, 
    )
    
    fromlangchain.agentsimportTool
    weatherTool=Tool(
        name="get_weather"xainzai ,
        description="查询指定城市的即时天气信息",
        func=get_weather, 
    )
  • 定义Agent的工具列表

    tools= [weatherTool,searchTool]
  • 定义提示词模版

    fromlangchainimporthub
    prompt=hub.pull("hwchase17/xml-agent-convo")
    prompt.messages
  • 创建大模型

    fromlangchain_openaiimportChatOpenAI
    API_KEY="sk-4b79f3a3fxxx35366ebb425b3"
    llm=ChatOpenAI(model_name="deepseek-reasoner",
                      api_key=API_KEY,base_url="https://api.deepseek.com")
  • 创建智能体

    fromlangchain.agentsimportcreate_xml_agent
    agent=create_xml_agent(llm,tools,prompt)
  • 执行智能体

    fromlangchain.agentsimportAgentExecutor
    agent_executor=AgentExecutor(
        agent=agent,
        tools=tools,
        verbose=True
    )
    agent_executor.invoke({'input':"张杰演唱会"})
    agent_executor.invoke({'input':"请帮我查询ShangHai天气"})

3 create_sql_agent构建智能体

在LangChain中,create_sql_agent是一个用于创建能够与SQL数据库进行交互的代理(Agent)的函数。

create_sql_agent的主要作用是创建一个基于语言模型(LLM)的代理,该代理能够:

  • 解析自然语言问题:将用户输入的自然语言问题转换为可执行的SQL查询。

  • 执行SQL查询:与SQL数据库交互,执行生成的SQL语句。

  • 返回查询结果:将查询结果以用户友好的方式返回。

通过`create_sql_agent`,用户可以使用自然语言与数据库进行交互,而无需编写复杂的SQL语句。

create_sql_agent的特点

  • 自然语言处理:利用语言模型(如OpenAI的GPT)理解用户的自然语言输入,并将其转换为SQL查询。

  • 动态SQL生成:根据用户的问题动态生成SQL语句,支持复杂的查询逻辑。

  • 错误处理:如果生成的SQL语句有误,代理会尝试修正或重新生成查询。

  • 灵活性:可以与任何SQLAlchemy支持的SQL数据库(如MySQL、PostgreSQL、SQLite等)进行交互。

  • 模块化:通过工具集扩展功能,例如添加自定义工具或集成其他API。

create_sql_agent适用于以下场景:

  • 数据分析和报告:用户可以通过自然语言查询数据库,生成分析报告或提取数据。

  • 业务决策支持:企业可以利用代理快速从数据库中提取关键信息,辅助决策。

  • 自动化任务:将自然语言查询与数据库操作结合,实现自动化流程。

  • 聊天机器人:构建能够回答数据库相关问题的智能聊天机器人。

  • 个人数据管理:个人用户可以通过自然语言查询自己的数据库(如财务数据、健康数据等)。

# 安装必要的依赖包
# pip install sqlalchemy 
# pip install pymysql
fromlangchain.agentsimportcreate_sql_agent, AgentExecutor, AgentType
fromlangchain.agents.agent_toolkitsimportSQLDatabaseToolkit
fromlangchain.llmsimportOpenAI
fromlangchain.sql_databaseimportSQLDatabase
importos


# 配置数据库连接
db_user="root"
db_password="boboadmin"
db_host="localhost"
db_name="db001"
db=SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")


#配置SQL server
# db_user = "sa"
# db_password = "123456"
# db_host = "127.0.0.1"
# db_name = "Test"
# db_port=60342
#  # 使用 pyodbc 的连接字符串
# connection_string = f"mssql+pyodbc://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}?driver=ODBC+Driver+17+for+SQL+Server"
# db = SQLDatabase.from_uri(connection_string)  # 创建数据库对象


# 初始化语言模型(LLM)
API_KEY="sk-4b79f3a3ffxxx5366ebb425b3"
llm=ChatOpenAI(
    model="deepseek-chat",
    openai_api_key=API_KEY,
    openai_api_base="https://api.deepseek.com"
)

# 初始化工具集(Toolkit)
toolkit=SQLDatabaseToolkit(db=db, llm=llm)

# 创建 SQL 代理
agent_executor=create_sql_agent(
    llm=llm,
    toolkit=toolkit,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)

# 定义自然语言问题
# question = "当前数据库中有几张表?这些表之间有什么关联或者联系吗?"
# question = "查询LC表中男女用户数量分别是多少"
question="不同薪资等级对应的员工数量分别是多少?"

# 运行代理并获取结果
result=agent_executor.run(question)
print("查询结果:", result)
  • 问题:create_sql_agent是如何理解mysql数据库库表的详细信息的?

    • 获取表信息:通过 SQL 语句 SHOW TABLES; 获取数据库中的所有表名。

    • 获取列信息:通过 SQL 语句 DESCRIBE table_name; 或 SHOW COLUMNS FROM table_name; 获取表的列名、数据类型等信息。

    • create_sql_agent 依赖于工具集(Toolkit)来与数据库交互。工具集中包含了用于查询数据库元数据的工具,例如:

  • create_sql_agent 内部封装的提示词是什么内容?

    • 原文Make sure the query is correct and efficient.

    • 翻译:确保查询是正确的且高效的。

    • 解释:语言模型需要生成语法正确且性能良好的 SQL 查询。

    • 原文Given the question: "{question}", generate a valid SQL query to answer it.

    • 翻译:给定问题:“{question}”,生成一个有效的 SQL 查询来回答它。

    • 解释{question} 是用户输入的自然语言问题,语言模型需要根据这个问题和数据库架构生成 SQL 查询。

    • 原文Here is the schema of the database: {schema}

    • 翻译:这是数据库的架构:{schema}。

    • 解释{schema} 是数据库的表结构信息(如表名、列名、数据类型等),语言模型需要根据这些信息生成有效的 SQL 查询。

    • 原文You are a helpful assistant that translates natural language questions into SQL queries.

    • 翻译:你是一个将自然语言问题翻译成 SQL 查询的助手。

    • 解释:这句话明确了角色——语言模型的任务是将用户的自然语言问题转换为 SQL 查询。

    • create_sql_agent 是 LangChain 中用于创建 SQL 代理的函数,其内部封装的提示词(Prompt)通常是预定义的,用于指导语言模型(LLM)如何生成 SQL 查询。这些提示词是 LangChain 库的一部分,通常不会直接暴露给用户,但可以通过查看源码或文档来了解其内容。以下是 create_sql_agent 内部可能使用的提示词的示例,以及对其的翻译和解释:

      You are a helpful assistant that translates natural language questions into SQL queries. Here is the schema of the database:
      {schema}
      
      Given the question: "{question}", generate a valid SQL query to answer it. Make sure the query is correct and efficient.
    • 第一句

    • 第二句

    • 第三句

    • 第四句

4 create_react_agent构建智能体

对于一些复杂的任务,在langchain的agents模块下提供了create_react_agent可以构建用于处理复杂任务的智能体对象。大家思考下,复杂任务如何定义?

所谓的复杂任务就是需要进行多步推理和多种工具协作才可以解决的问题。

例如:

1.旅行规划与预订

  • 任务描述:用户希望规划一次旅行,包括目的地天气查询、机票/酒店比价、行程安排等。

  • 多步推理与工具协作:

    1. 天气查询工具:调用天气API获取目的地未来几天的天气数据。

    2. 航班/酒店比价工具:根据用户预算和时间,搜索并比较不同平台的机票和酒店价格。

    3. 行程生成工具:结合天气、交通、用户偏好(如景点、餐饮)生成合理行程。

    4. 预订工具:自动完成机票、酒店的预订操作。

2.电商购物决策支持

  • 任务描述:用户输入商品需求下单最合适的商品。

  • 多步推理与工具协作:

    1. 商品搜索工具:调用电商平台API,按关键词筛选商品。

    2. 评测分析工具:抓取社交媒体和专业网站的用户评测,分析优缺点。

    3. 价格对比工具:跨平台比较历史价格和促销活动。

    4. 下单工具:自动选择最优商品并完成支付流程。

核心功能与工作流程

create_react_agent生成的代理遵循“思考→行动→观察”的循环流程,具体如下:

  1. 思考(Reason):LLM基于用户输入和上下文生成推理步骤,决定是否需要调用工具、选择哪个工具,并生成工具调用的参数。

  2. 行动(Action):执行工具调用(如调用搜索引擎、数据库查询),或直接生成自然语言回复。

  3. 观察(Observe):获取工具执行结果或用户反馈,更新上下文并传递给LLM进行下一步推理。

示例操作

  • 2个外部函数构建

    defget_search_result(question):
        """
        互联网搜索函数
        :param question: 必要参数,字符串类型,用于表示在互联网上进行搜素的关键词或者搜索内容的简短描述,\
        :return:SerpAPI API根据参数question进行互联网搜索后的结果,其中包含了全部重要的搜索结果内容。
        """
        fromlangchain_community.utilitiesimportSerpAPIWrapper
        serpapi_api_key="60f286e601f44a26600e4xxxb06a3f0dc8e0fe7ce56ec93d6274ccd"
        search=SerpAPIWrapper(serpapi_api_key=serpapi_api_key)
        result=search.run(question)
        returnresult
    
    importrequests
    importjson
    defget_weather(loc):
        """
        查询即时天气函数
        :param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\
        :return:查询即时天气的结果\
        返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
        """
        api_key="SGkvDRxxxfdosf"
        url=f"https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={loc}&language=zh-Hans&unit=c"
        response=requests.get(url)
        data=response.json()
        returnjson.dumps(data)
    
    get_weather("上海")
  • 将外部函数封装成Agent可调用的工具对象

    fromlangchain.agentsimportTool
    searchTool=Tool(
        name="get_search_result",
        description="互联网搜索函数",
        func=get_search_result, 
    )
    
    fromlangchain.agentsimportTool
    weatherTool=Tool(
        name="get_weather",
        description="查询指定城市的即时天气信息",
        func=get_weather, 
    )
  • 定义Agent的工具列表

    tools= [weatherTool,searchTool]
  • 定义提示词模版

    fromlangchainimporthub
    prompt_react=hub.pull("hwchase17/react")
    prompt_react
  • 创建大模型

    fromlangchain_openaiimportChatOpenAI
    API_KEY="sk-4b79f3a3fxxx1935366ebb425b3"
    llm=ChatOpenAI(model_name="deepseek-reasoner",
                      api_key=API_KEY,base_url="https://api.deepseek.com")
  • 创建智能体

    fromlangchain.agentsimportcreate_react_agent
    agent=create_react_agent(llm,tools,prompt_react)
  • 执行智能体

    fromlangchain.agentsimportAgentExecutor
    agent_executor=AgentExecutor(
        agent=agent,
        tools=tools,
        verbose=True
    )
    agent_executor.invoke({"input":"上海今天有雪吗?如果不下雪的话我想查询下近期上海是否有周杰伦演唱会举办?"})
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐