
点击“蓝字” 关注我们

LLM Agents 作为一个新兴且极具潜力的领域,正逐渐改变人们与技术交互的方式。本文将深入探讨 LLM Agents,重点聚焦于 ReAct 框架,剖析其原理、优势以及实际应用。
一、AI Agents 的演进
“Agents” 这一概念在人工智能领域并非新生事物。从早期简单的语音激活玩具到如今功能强大的数字助理,AI Agents 经历了漫长的发展历程。
1916 年的 Radio Rex 是最早的例子之一,这是一款语音激活玩具,当你呼唤它的名字时,它会做出反应,尽管功能简单,却开启了机器依照指令行动的先河。1952 年,Bell Labs 推出 Audrey,它能够识别 spoken digits,为语音识别技术奠定了基础。

1960 年代,MIT 的 Joseph Weizenbaum 创造了 ELIZA,它通过简单的模式匹配模拟对话。虽然 ELIZA 的回复并非基于真正的理解,但却引发了人们对机器智能交互的思考,产生了著名的 ELIZA 效应。1970 年代,Carnegie Mellon University 开发的 Harpy,是早期的语音识别系统,它利用语言模型减少错误,能理解大约 1000 个单词 。
到了 1980 年代,IBM 的 Tangora 使用统计方法识别多达 20000 个单词,为现代语音转文本软件奠定了基础。1990 年代,Dragon NaturallySpeaking 成为首批商业语音识别系统之一,能够实时将语音转录为文本,改变了人们与计算机的交互方式。同年,IBM Simon 智能手机结合了基本的语音识别和短信功能,预示着多功能数字助理的到来。
2011 年,Apple 推出 Siri,利用自然语言处理理解用户请求,执行各种任务并进行基本对话。2014 年,Amazon 的 Alexa 问世,迅速融入智能家居生态系统,不仅能回答问题,还能管理家庭设备、下单购物和提供娱乐 。这些系统都可被视为 “Agents”,其中部分借助人工智能的系统,如 Siri 和 Alexa,属于 “AI Agents”。
二、LLM Agents 的崛起
随着 LLM 的发展,LLM Agents 应运而生。LLM Agents 是能够利用 LLM 对问题进行推理、制定解决方案并借助一系列工具、内存和检索执行计划的系统。它主要包含四个关键组件:检索、推理、记忆和工具使用。
检索功能使 Agent 能够获取实时数据,确保信息的准确性。例如,在金融领域,Agent 可以获取最新的市场趋势数据,为投资者提供及时的建议。推理方面,通过先进的提示技术,如思维链,引导 Agent 做出决策。以医疗领域为例,Agent 可以根据患者的症状和医学知识进行推理,提供初步的诊断建议。记忆包括短期记忆(近期对话历史)、长期记忆(结构化信息存储)和特定任务回忆,使 Agent 能够适应不同场景并提供个性化服务。工具使用则让 Agent 能够与外部系统交互,获取数据或执行操作,比如在电商场景中,Agent 可以调用库存系统查看商品是否有货 。
三、ReAct 框架解析
3.1 ReAct 框架概述
ReAct,即 Reasoning and Acting,于 2023 年 3 月在论文 “ReAct: Synergizing Reasoning and Acting in Language Models” 中被提出。它旨在让 LLM 在解决任务时更像人类一样思考和行动。
ReAct 框架主要包含三个步骤:推理、行动和观察。当接收到问题时,Agent 首先进行推理,生成解决问题的思路、计划或策略。然后,根据推理结果采取行动,比如搜索信息或与环境进行交互。最后,Agent 观察行动产生的新信息,并利用这些信息进一步推理和行动,直到得出最终答案。
以 “What is the population of the capital of France?” 为例,ReAct Agent 会先推理出需要将问题拆分为两部分:找出法国的首都,然后查询该首都的人口。接着,它会执行搜索 “capital of France” 的行动,观察搜索结果得知法国首都是巴黎。之后,再次推理需要查找巴黎的人口,并采取搜索 “population of Paris” 的行动 。
3.2 ReAct 框架的优势
ReAct 框架具有显著的优势。首先是协同组合,它将推理和行动相结合,发挥两者的协同作用。通过推理指导行动,行动又为进一步推理提供依据,形成一个高效的循环。其次,ReAct 框架提高了可解释性和可信度。它生成的任务解决轨迹比没有推理痕迹的基线更具可解释性,让人们能够区分模型内部知识和外部环境信息。最后,ReAct 框架使问题解决过程更具事实依据和可靠性。借助外部知识库,Agent 能够获取更准确的信息,从而得出更可靠的答案 。
四、基于 ReAct 框架构建文本到 SQL 的 Agent
4.1 数据库搭建
为了构建一个文本到 SQL 的 Agent,首先需要搭建一个示例数据库。这里使用 SQLite 数据库,并创建两个表:“companies” 表用于存储公司详细信息,包括 id、title 和 description;“customers” 表用于存储客户信息,包括 id、name、revenue 以及一个外键 company_id,用于关联 “companies” 表。
import sqlite3
def create_sample_database():
"""
Create a simple SQLite database with a 'companies' table and a 'customers' table.
Each company has an id, title, and description.
Each customer has an id, name, revenue, and a foreign key company_id referencing the companies table.
This function resets the database for a clean slate.
"""
conn = sqlite3.connect("sample.db")
cur = conn.cursor()
# Enable foreign key support in SQLite.
cur.execute("PRAGMA foreign_keys = ON;")
# Create the companies table.
cur.execute("""
CREATE TABLE companies (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
description TEXT
)
""")
# Create the customers table with a foreign key to companies.
cur.execute("""
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
revenue REAL NOT NULL,
company_id INTEGER,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE SET NULL
)
""")
# Insert sample data into companies.
companies_data = [
(1, 'Acme Corp', 'Leading provider of innovative solutions'),
(2, 'Beta Inc', 'Specializes in data analytics and insights'),
(3, 'Gamma LLC', 'Pioneer in cloud computing services')
]
cur.executemany("INSERT INTO companies (id, title, description) VALUES (?, ?, ?)", companies_data)
# Insert sample data into customers.
customers_data = [
(1, 'Alice', 1500.0, 1),
(2, 'Bob', 2400.0, 2),
(3, 'Charlie', 1800.0, 1),
(4, 'Diana', 3200.0, 3),
(5, 'Ethan', 2100.0, 2)
]
cur.executemany("INSERT INTO customers (id, name, revenue, company_id) VALUES (?, ?, ?, ?)", customers_data)
conn.commit()
return conn
4.2 系统提示设置
接下来,需要为 LLM 设置系统提示,向其提供数据库模式。系统提示告知 LLM 有关表及其列的信息,以便它能够生成有效的 SQL 查询。
system_prompt = f"""
You are a helpful assistant that translates natural language queries into SQL queries for the following SQLite database schema.
Table "companies":
- id: INTEGER PRIMARY KEY
- title: TEXT NOT NULL
- description: TEXT
Table "customers":
- id: INTEGER PRIMARY KEY
- name: TEXT NOT NULL
- revenue: REAL NOT NULL
- company_id: INTEGER (Foreign key referencing companies(id))
Instructions:
1. When you receive a text query that is relevant to this schema, generate the corresponding SQL query. Return only the SQL query with no additional commentary or characters like ``` or quotes e.g. SELECT * FROM COMPANIES.
2. If you receive a text query that includes an error message, generate a corrected SQL query that fixes the error, again returning only the SQL query.
3. If the query is irrelevant, do not output any extra text.
"""
4.3 ReAct 逻辑实现
Agent 的核心逻辑围绕 ReAct 循环展开:使用 LLM 从自然语言请求生成 SQL 查询,执行查询,如果出现错误,则将错误消息反馈给 LLM,以便其调整并迭代,直到查询成功运行。
import time
def test():
nl_request = input("Enter natural language query: ").strip()
if not nl_request:
print("No natural language query provided.")
return
conn = sqlite3.connect("sample.db")
max_iterations = 5
iteration = 0
feedback = None
final_result = None
while iteration < max_iterations:
iteration += 1
print(f"--- Iteration {iteration} ---")
sql_query = generate_sql_query(nl_request, feedback)
if not sql_query:
print("No corresponding SQL query for this query.")
break
result, error = execute_query(conn, sql_query)
if error:
print(f"SQL execution error: {error}")
feedback = f"The query resulted in the following error: {error}. Please adjust the SQL query accordingly."
time.sleep(1)
else:
if not result:
print("No results found.")
else:
print("Query executed successfully. Results:")
for row in result:
print(row)
final_result = result
break
if final_result is None:
print("Failed to generate a valid SQL query after several iterations.")
conn.close()
在这个简单的示例中,由于数据库较为简单,Agent 通常能一次生成正确的 SQL 查询。但在更复杂的数据库场景中,ReAct Agent 可能需要多次迭代来优化查询,确保最终的 SQL 准确匹配用户的请求 。
五、ReAct 框架的应用拓展
除了文本到 SQL 的转换,ReAct 框架在其他领域也有着广泛的应用前景。在智能客服领域,ReAct Agent 可以更好地理解用户的复杂问题,通过推理和行动,调用知识库、查询相关数据,为用户提供更准确、更全面的解答。在智能写作辅助方面,它可以根据作者的写作意图,推理出合适的写作思路,然后调用各种工具,如语法检查工具、素材库等,帮助作者提升写作质量 。
在数据分析领域,ReAct Agent 能够根据用户提出的分析需求,推理出所需的数据和分析方法,然后调用相应的数据处理工具和算法,生成分析报告。例如,当用户想要分析某产品在不同地区的销售趋势时,Agent 可以先推理出需要从销售数据库中获取相关数据,然后使用数据分析工具进行数据处理和可视化,最终向用户呈现清晰的分析结果 。
本文详细介绍了 LLM Agents 的发展历程,重点探讨了 ReAct 框架。从 AI Agents 的早期雏形到 LLM Agents 的兴起,再到 ReAct 框架的深入剖析和实际应用,我们看到了人工智能在交互能力和问题解决能力上的不断进步。ReAct 框架通过将推理和行动相结合,为 LLM Agents 的发展提供了一个强大的解决方案,展现出了显著的优势和广泛的应用潜力 。