🧠 向所有学习者致敬!
“学习不是装满一桶水,而是点燃一把火。” —— 叶芝
我的博客主页: https://lizheng.blog.csdn.net
🌐 欢迎点击加入AI人工智能社区!
🚀 让我们一起努力,共创AI未来! 🚀
AI Agents:开启智能协调新时代
AI的世界正在经历一场深刻的变革。多年来,我们一直专注于构建专门的AI模型,每个模型都在特定任务上表现出色。例如,有生成文本的模型、分析情感的模型,以及对文档进行分类的模型。这些模型如同技艺精湛的专家,凭借各自的专业能力出色地完成特定任务。然而,一直缺少一些关键能力:协调这些能力的能力、理解上下文的能力,以及决定下一步该做什么的能力。
想象一下人类专家如何处理复杂任务。当侦探调查案件时,他们不会孤立地收集证据。他们会询问证人,并根据所了解的情况决定下一步追踪哪些线索。他们可能会注意到一个矛盾之处,从而返回重新审视早期的证据。每条信息都会影响他们的下一步行动,并且他们会在脑海中保持对整个调查的完整画面。
AI Agents:革命性的转变
这种碎片化的AI方法带来了重大挑战。它给用户带来了管理复杂工作流程的沉重负担,在步骤之间丢失了宝贵的上下文,并且缺乏现实任务所需的适应性。每个模型都孤立运行,就像专家们无法相互交流,也无法根据同事的发现调整自己的工作一样。
AI智能体的出现带来了革命性的变化。它们代表了我们在处理人工智能时的根本性转变。智能体的行为更像是一个熟练的协调员,在保持对任务整体理解的同时协调多种能力。它可以基于沿途学到的信息做出明智的决策,就像人类专家一样。
AI智能体有何不同?
让我们看看智能体如何处理一个具体任务:分析一篇关于新医疗治疗方法的研究论文。
传统的人工智能方法将分析分解为孤立的步骤:总结论文、提取关键词、对研究类型进行分类以及生成见解。每个模型独立执行任务,对其他模型的发现一无所知。如果总结部分显示论文的方法不明确,也没有自动化的方式回过头去更仔细地检查该部分内容。这个过程是僵化的、预先设定好的,而且常常会忽略关键的联系。
然而,人工智能智能体会像人类研究人员一样灵活地处理这项任务。它可能会先进行大致的概述,但可以根据发现动态调整重点。当遇到重要的方法学细节时,它可以选择更深入地分析该部分内容。如果发现了对其他研究的有趣引用,它可以标记这些引用以便进一步调查。智能体在全面理解论文的同时,会根据新出现的见解积极引导分析过程。
这种动态的、具有上下文感知的方法,代表了传统人工智能和智能体之间的关键区别。智能体不是执行固定的步骤序列,而是在分析过程中充当智能向导,根据一路上所学的一切做出战略性决策。
智能体的架构
AI智能体基于几个基本原则构建,使其能够采用更复杂的问题解决方法。
首先是状态管理。可以将其视为智能体的工作记忆——它保持对其所学内容和目标的理解的能力。就像人类调查员在检查个别证据时牢记整个案件一样,智能体在执行特定操作时也保持对其整体任务的意识。
然后是决策框架。这不仅仅是选择预先确定的选项,而是理解可用的工具和方法,并根据当前情况选择最合适的。这类似于侦探可能决定是采访另一位证人还是分析物证,基于他们迄今为止所学到的。
最后是有效使用工具的能力。智能体不仅仅拥有多种能力——它还知道何时以及如何使用它们。这就像一个工匠,不仅知道他们有哪些工具,还知道每种工具最适合的时机以及如何有效地组合使用它们。
构建我们的第一个Agent:文本分析系统(智能研究助手)
您可以在我的GitHub仓库中找到完整的代码,以及42个其他教程,这些教程涵盖了创建各种AI代理,按难度级别和用例类型分类:
设置环境
创建虚拟环境
首先,打开终端并为该项目创建一个新目录:
mkdir ai_agent_project
cd ai_agent_project
创建并激活虚拟环境:
# Windows
python -m venv agent_env
agent_env\Scripts\activate
# macOS/Linux
python3 -m venv agent_env
source agent_env/bin/activate
安装所需的包
在激活虚拟环境后,安装必要的包:
pip install langgraph langchain langchain-openai python-dotenv
设置您的API密钥
您需要一个OpenAI API密钥才能使用他们的模型。以下是获取密钥的方法:
• 创建一个账户或登录
• 导航到API密钥部分
• 点击“创建新密钥”
• 复制您的API密钥
现在在您的项目目录中创建一个.env
文件:
# Windows
echo OPENAI_API_KEY=your-api-key-here > .env
# macOS/Linux
echo "OPENAI_API_KEY=your-api-key-here" > .env
将your-api-key-here
替换为您的实际OpenAI API密钥。
创建测试文件
让我们确保一切正常工作。创建一个名为test_setup.py
的文件:
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
# 加载环境变量
load_dotenv()
# 初始化ChatOpenAI实例
llm = ChatOpenAI(model="gpt-4o-mini")
# 测试设置
response = llm.invoke("Hello! Are you working?")
print(response.content)
运行它以验证您的设置:
python test_setup.py
如果您看到响应,恭喜您!您的环境已准备就绪。
现在一切准备就绪,让我们开始构建我们的代理。首先,我们需要导入我们将要使用的工具:
import os
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
这些导入在我们代理的功能中发挥着至关重要的作用。StateGraph
类将为我们代理的结构提供基础,而PromptTemplate
和ChatOpenAI
则为我们提供了有效与AI模型互动的工具。
设置Agent的记忆
就像人类智力需要记忆一样,我们的代理需要一种跟踪信息的方式。我们使用TypedDict
创建这个:
class State(TypedDict):
text: str
classification: str
entities: List[str]
summary: str
这种状态设计反映了人类处理信息的方式。当我们阅读文档时,我们同时保持几条信息:我们记住原始文本,理解它是什么类型的文档,注意重要的名称或概念,并形成对其主要观点的简明理解。我们的状态结构捕捉了这些相同的元素。
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
然后我们初始化要使用的LLM(在这种情况下是gpt-4o-mini
,但您可以使用任何您想要的LLM)。如果您使用OpenAI API,您需要在他们的网站上创建一个私人令牌,以便您可以使用它。将温度设置为0意味着模型将在每一步始终选择最可能的标记,从而使输出具有确定性和一致性。这导致更集中和精确的响应,但与较高温度设置相比,可能创造性较低,因为较高温度设置会在标记选择中引入更多随机性。
创建Agent的核心能力
现在我们将创建代理将使用的实际技能。每个能力都作为执行特定类型分析的函数实现。
首先,让我们创建我们的分类能力:
def classification_node(state: State):
'''将文本分类为新闻、博客、研究或其他类别'''
prompt = PromptTemplate(
input_variables=["text"],
template="将以下文本分类为新闻、博客、研究或其他类别。\n\n文本:{text}\n\n类别:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
classification = llm.invoke([message]).content.strip()
return {"classification": classification}
这个函数就像一个熟练的图书管理员,可以快速确定他们正在查看的文档类型。请注意,我们如何使用提示模板向我们的AI模型提供清晰、一致的指示。该函数接受我们当前的状态(包括我们正在分析的文本)并返回其分类。
接下来,我们创建我们的实体提取能力:
def entity_extraction_node(state: State):
'''从文本中提取所有实体(人、组织、地点)'''
prompt = PromptTemplate(
input_variables=["text"],
template="从以下文本中提取所有实体(人、组织、地点)。请将结果提供为逗号分隔的列表。\n\n文本:{text}\n\n实体:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
entities = llm.invoke([message]).content.strip().split(", ")
return {"entities": entities}
这个函数就像一个细心的读者,能够识别并记住文本中提到的所有重要名称、组织和地点。它处理文本并返回这些关键实体的列表。
最后,我们实现我们的摘要能力:
def summarization_node(state: State):
'''用一句简短的句子总结文本'''
prompt = PromptTemplate(
input_variables=["text"],
template="用一句简短的句子总结以下文本。\n\n文本:{text}\n\n摘要:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
summary = llm.invoke([message]).content.strip()
return {"summary": summary}
这个函数就像一个熟练的编辑,能够将文档的核心内容提炼成简明的摘要。它接受我们的文本并创建一个信息丰富且简洁的总结。
能力结合在一起
最激动人心的部分来了——我们将这些能力连接成一个协调的系统:
workflow = StateGraph(State)
# 向图中添加节点
workflow.add_node("classification_node", classification_node)
workflow.add_node("entity_extraction", entity_extraction_node)
workflow.add_node("summarization", summarization_node)
# 向图中添加边
workflow.set_entry_point("classification_node") # 设置图的入口点
workflow.add_edge("classification_node", "entity_extraction")
workflow.add_edge("entity_extraction", "summarization")
workflow.add_edge("summarization", END)
# 编译图
app = workflow.compile()
恭喜!我们刚刚构建了一个智能代理!
它的结构如下:
运行Agent
现在我们已经构建了代理,是时候看看它在真实文本中的表现。这是理论与实践相结合的地方,也是我们真正理解基于图的方法的力量的地方。让我们用一个具体的示例来测试我们的代理:
sample_text = """
OpenAI已宣布GPT-4模型,这是一个大型多模态模型,在各种专业基准上表现出人类水平的性能。它旨在提高AI系统的对齐和安全性。
此外,该模型旨在比其前身GPT-3更高效和可扩展。GPT-4模型预计将在未来几个月发布,并将向公众开放以供研究和开发使用。
"""
state_input = {"text": sample_text}
result = app.invoke(state_input)
print("分类:", result["classification"])
print("\n实体:", result["entities"])
print("\n摘要:", result["summary"])
当我们运行这段代码时,我们的代理通过其每个能力处理文本,我们得到以下输出:
分类:新闻
实体:['OpenAI', 'GPT-4', 'GPT-3']
摘要:OpenAI即将推出的GPT-4模型是一个多模态AI,旨在实现人类水平的性能、提高安全性,并比GPT-3更高效。
分析一下我们的代理如何协调其不同的能力以全面理解文本。
首先,我们的分类节点正确地将其识别为新闻文章。这是合理的,因为文本的公告风格格式和对当前发展的关注。代理识别了新闻写作的特征——及时的信息、事实的呈现和对特定发展的关注。
接下来,实体提取能力识别了这个故事中的关键参与者:OpenAI作为组织,GPT-4和GPT-3作为正在讨论的关键技术实体。请注意,它专注于最相关的实体,过滤掉不太重要的细节,以便给我们一个清晰的关于这段文本的内容。
最后,摘要能力将所有这些理解汇聚在一起,创建了一个简洁而全面的摘要。摘要捕捉了要点——GPT-4的公告、与GPT-3的关键改进及其重要性。这不仅仅是随机选择的句子;它是对最重要信息的智能提炼。
理解协调处理的力量
使这个结果特别令人印象深刻的是,每一步都建立在其他步骤之上,以创建对文本的完整理解。分类提供了上下文,有助于框定实体提取,而这两者又为摘要过程提供了信息。
想想这如何反映人类的阅读理解。当我们阅读文本时,我们自然会形成对文本类型的理解,注意重要的名称和概念,并形成心理摘要——同时保持对这些不同理解方面之间关系的认识。
总结
这个构建的示例展示了一种可以应用于许多场景的基本模式。它不仅可以用它来分析一篇关于AI的新闻文章,还可以应用于以下工作:
• 医疗研究论文:其中理解研究类型、关键医学术语和核心发现至关重要;
• 法律文件:其中识别相关方、关键条款和整体影响是必不可少的;
• 财务报告:其中理解报告类型、关键指标和主要结论驱动决策。
局限性
尽管我们的代理功能强大,但它仍然在我们定义的边界内运作。它的能力由我们创建的节点和我们在它们之间建立的连接决定。这种设计使得Agent的行为可预测且可靠,但也带来了一些局限性。
首先是适应性问题。与人类在面对新情况时可以自然调整其方法不同,我们的代理遵循固定的任务路径。如果输入文本包含意外模式或需要不同的分析方法,代理无法动态修改其工作流程以更好地处理这些情况。
其次是上下文理解的挑战。虽然我们的代理可以有效处理文本,但它纯粹在提供的文本范围内运作。它无法利用更广泛的知识或理解文化参考、隐含意义等微妙的细节,而这些可能对准确分析至关重要。不过,如果信息可以在互联网上找到,您可以通过集成互联网搜索组件来克服这一点。
代理还面临AI系统中的一个常见挑战——黑箱问题。虽然我们可以观察到每个节点的最终输出,但我们无法完全了解代理如何得出结论。这使得调试问题或理解代理为何偶尔会产生意外结果变得更加困难。虽然使用推理模型(如GPT-4或DeepSeek R1)可以展示其思考方式,但您仍然无法完全控制它。
最后是自主性问题。我们的代理需要仔细的人类监督,特别是在验证其输出和确保准确性方面。与许多AI系统一样,它旨在增强人类能力,而不是完全取代它们。
这些局限性塑造了我们在现实世界应用中使用和部署此类代理的方式。理解它们有助于我们设计更有效的系统,并知道何时需要人类专业知识的参与。