2025-02-21 21:00·物联全栈123
尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能。
最近,RAG(检索增强生成)和Agent开发成为了技术圈的热门话题。今天,我们就来聊聊什么是Agent,并亲手用langchain调用本地ollama模型构建一个简单的Agent,让你快速体验Agent开发的乐趣。
Agent不仅仅是更聪明的聊天机器人,它们是能够感知环境、做出决策并采取行动的智能体。
先来看聊聊为什么需要了解Agent设计?
1. Agent能做什么?
Agent的能力远不止聊天,它更像一个“数字分身”,可以帮你处理各种任务,具体来说,Agent可以:
- 信息处理大师:
- 自动翻译: 跨越语言障碍,快速翻译各种文档、网页、对话。
- 智能总结: 从海量信息中提炼要点,帮你快速掌握核心内容。
- 深度分析: 分析数据、报告、趋势,提供洞察和建议。
- 内容生成: 撰写报告、邮件、文章、代码等,提高内容生产效率。
- 任务执行能手:
- 自动化流程: 自动执行重复性任务,如数据录入、邮件回复、日程安排等。
- 智能调度: 根据你的指令,协调多个工具和服务,完成复杂任务。
- 主动服务: 根据你的习惯和偏好,主动提供信息、建议或执行任务。
- 创意灵感伙伴:
- 头脑风暴: 帮你发散思维,提供创新想法和解决方案。
- 内容润色: 优化你的文案、设计、代码等,提升作品质量。
- 个性化推荐: 根据你的兴趣,推荐相关资源、工具或灵感。
举例说明:
- 职场人士: Agent可以帮你自动整理会议纪要、分析竞争对手报告、生成项目计划书等。
- 自由职业者: Agent可以帮你管理项目进度、自动回复客户邮件、寻找新的工作机会等。
- 创作者: Agent可以帮你收集素材、润色文案、生成设计草图等。
- 普通用户: Agent根据你的阅读习惯推荐新闻,根据你的口味定制音乐歌单。
2. Agent与RAG的区别?
RAG(Retrieval-Augmented Generation,检索增强生成)和Agent是两种不同的技术,但它们可以结合使用,发挥更大的作用:
- RAG:
- 定义: 一种结合了检索和生成的技术,它首先从知识库中检索相关信息,然后利用这些信息生成更准确、更丰富的回复。
- 核心: 知识库和生成模型。
- 应用: 主要用于问答系统、聊天机器人等,提供更准确、更全面的答案。
- Agent:
- 定义: 能够感知环境、做出决策并采取行动的智能体。
- 核心: 意图识别、工具选择、行动执行。
- 应用: 范围更广,可以用于各种需要自主决策和行动的场景,如自动化任务、智能助手、流程优化等。
区别总结:
特征 | RAG | Agent |
核心 | 知识检索与生成 | 意图识别、决策与行动 |
能力 | 提供更准确、丰富的答案 | 感知环境、自主决策、执行任务 |
应用 | 问答系统、聊天机器人等 | 自动化、智能助手、流程优化等 |
自主性 | 相对较低 | 较高 |
是否需要行动 | 不需要 | 需要 |
RAG与Agent的关系:
- RAG可以作为Agent的工具: Agent可以利用RAG技术,从知识库中获取信息,辅助决策和行动。例如,一个智能客服Agent可以利用RAG技术,从产品文档中检索信息,回答用户的问题。
- Agent可以增强RAG的应用: Agent可以将RAG的输出作为输入,进行进一步处理,或与其他工具结合,完成更复杂的任务。例如,一个新闻摘要Agent可以利用RAG技术生成新闻摘要,然后自动发布到社交媒体。
3. Agent如何改变自由职业者和上班族?
Agent将对自由职业者和上班族的工作方式产生深远影响:
对于自由职业者:
- 提高效率: Agent可以自动处理许多重复性、耗时的任务,如项目管理、客户沟通、财务管理等,让自由职业者有更多时间专注于核心业务。
- 拓展业务: Agent可以帮助自由职业者寻找新的工作机会、拓展人脉、提升技能,从而获得更多的收入来源。
- 提升竞争力: Agent可以帮助自由职业者提供更专业、更高效的服务,从而在竞争激烈的市场中脱颖而出。
- 赋能创造: 摆脱重复工作,专注创意本身。
对于上班族:
- 减轻负担: Agent可以帮助上班族处理日常工作中的琐碎任务,如邮件回复、数据整理、会议安排等,减轻工作压力。
- 提升效率: Agent可以帮助上班族更快地完成任务、获取信息、做出决策,从而提高工作效率。
- 赋能创新: Agent可以帮助上班族分析数据、发现趋势、寻找灵感,从而激发创新思维。
- 促进协作: Agent可以作为团队协作的桥梁,帮助团队成员更好地沟通、共享信息、协同工作。
开始动手设计Agent
1. Agent的核心理念:意图识别与链式处理
Agent的核心在于“行动”。不同于传统的问答系统,Agent需要理解用户的意图,并据此选择合适的工具(或“链”)来完成任务。
- 意图识别(Intent Recognition): 这是Agent的“大脑”,负责解读用户的需求。
- 链式处理(Chain Processing): 这是Agent的“工具箱”,包含各种预定义的处理流程。
我们今天要构建的Agent,就基于这两个核心理念。
2. 动手实践:构建一个多功能AI助手
接下来,我们将使用LangChain和Gradio,一步步构建一个AI助手。LangChain是一个强大的Agent开发框架,而Gradio则能让我们快速创建交互界面。
2.1 环境准备
确保你已经安装了必要的Python库,建议使用python 3.11以及以上版本:
pip install langchain langchain-core langchain-ollama gradio
另外你本地需要部署ollama,并且下载了phi3或qwen或者deepseek模型
2.2 代码解析
下面是Agent的核心代码,我会逐段解释:
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM
from langchain_core.output_parsers import StrOutputParser
from typing import Dict, Any
import json
import sys
class SimpleAgent:
def __init__(self, model):
self.model = model
self.chains = self._initialize_chains()
self.chat_history = []
- 引入库: 导入必要的模块。
- SimpleAgent类: 这是我们的Agent类。
- __init__方法:初始化Agent,传入一个大语言模型(LLM),并初始化处理链。
- chat_history:用于存储用户与agent的对话历史。
def _initialize_chains(self) -> Dict[str, Any]:
"""初始化各种处理链"""
def create_chain(template):
prompt = ChatPromptTemplate.from_template(template)
return prompt | self.model | StrOutputParser()
return {
"翻译": create_chain("将以下内容翻译成英文:\n{input}"),
"总结": create_chain("简要总结以下内容:\n{input}"),
"分析": create_chain(
"""分析以下内容:\n{input}\n
要求:\n1. 提取关键点\n2. 分析主要观点\n3. 给出建议"""
),
"创意": create_chain(
"""基于以下主题进行创意发散:\n{input}\n
要求:\n1. 提供3个创新想法\n2. 每个想法的可行性分析\n3. 实施建议"""
)
}
- _initialize_chains方法: 定义Agent的处理链。
- create_chain函数:这是一个辅助函数,用于创建LangChain的处理链。它接收一个提示模板,并将其与模型和输出解析器连接起来。
- 处理链字典: 定义了四个处理链:翻译、总结、分析、创意。每个链都有一个明确的提示模板,告诉LLM如何处理输入。
专业视角: 这里使用了LangChain的LCEL(LangChain Expression Language)语法,|符号表示将不同的组件连接成一个处理链。这种链式结构非常灵活,可以方便地扩展和修改。
def _analyze_intent(self, user_input: str) -> str:
"""分析用户意图"""
intent_prompt = ChatPromptTemplate.from_template(
"""分析用户输入,判断需要使用哪种处理链:
用户输入: {input}
可用的处理链:
1. 翻译 - 进行中英文翻译
2. 总结 - 总结主要内容
3. 分析 - 深入分析内容
4. 创意 - 创意发散思维
只返回处理链名称,如:翻译、总结、分析、创意"""
)
intent_chain = intent_prompt | self.model | StrOutputParser()
return intent_chain.invoke({"input": user_input}).strip()
- _analyze_intent方法: 这是Agent的意图识别模块。
- 提示模板: 定义了一个提示模板,要求LLM根据用户输入判断应该使用哪个处理链。
- 创建链: 将提示模板与模型和输出解析器连接,形成一个意图识别链。
- 调用: 使用.invoke()方法调用LLM,并返回识别出的意图(处理链名称)。
专业视角: 意图识别是Agent设计的关键。这里使用了LLM作为意图分类器,但也可以使用其他方法,如传统的机器学习分类器或基于规则的系统。
def process(self, user_input: str) -> dict:
"""处理用户输入"""
try:
intent = self._analyze_intent(user_input)
if intent not in self.chains:
return {
"status": "error",
"message": f"未知的处理类型:{intent}"
}
result = self.chains[intent].invoke({"input": user_input})
# 记录对话历史
self.chat_history.append(("用户", user_input))
self.chat_history.append(("助手", f"[{intent}]\n{result}"))
return {
"status": "success",
"intent": intent,
"result": result
}
except Exception as e:
return {
"status": "error",
"message": str(e)
}
- process方法: 这是Agent的核心处理逻辑。
- 意图识别: 调用_analyze_intent方法获取用户意图。
- 处理链选择: 根据识别出的意图,选择相应的处理链。
- 执行: 调用选定处理链的.invoke()方法,传入用户输入,获取结果。
- 返回结果: 将处理结果封装成字典返回。
- 错误处理 使用try except进行错误处理。
专业视角: 这里的处理流程非常清晰:意图识别 -> 处理链选择 -> 执行。这种模块化设计使得Agent易于扩展和维护。
def create_ui(agent):
"""创建 Gradio 界面"""
def process_message(message: str, history: list) -> list:
"""处理用户消息并返回更新后的对话历史"""
if not message:
return history
try:
result = agent.process(message)
if result["status"] == "success":
response = f"意图识别: {result['intent']}\n\n{result['result']}"
history = history or [] # 确保history是列表
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": response})
else:
history = history or []
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": f"处理失败: {result['message']}"})
return history
except Exception as e:
history = history or []
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": f"错误: {str(e)}"})
return history
# 创建界面
with gr.Blocks(title="AI 助手", theme=gr.themes.Soft()) as interface:
gr.Markdown("""
# 智能处理助手
这个助手可以:
1. 翻译 - 中英互译
2. 总结 - 内容摘要
3. 分析 - 深入分析
4. 创意 - 创意发散
## 示例输入:
- "将这句话翻译成英文:人工智能正在改变世界"
- "总结一下:最近AI技术发展迅速,应用广泛..."
- "分析:远程办公带来的影响"
- "创意:如何改善城市交通拥堵问题"
""")
chatbot = gr.Chatbot(
label="对话历史",
height=500,
show_copy_button=True,
type="messages" # 使用新的消息格式
)
with gr.Row():
input_text = gr.Textbox(
label="输入文本",
placeholder="请输入需要处理的内容...",
lines=3
)
with gr.Row():
submit_btn = gr.Button("提交", variant="primary")
clear_btn = gr.Button("清除历史")
# 绑定事件
submit_btn.click(
process_message,
inputs=[input_text, chatbot], # 添加 chatbot 作为输入
outputs=chatbot,
queue=False
).then(
lambda: "",
None,
input_text,
queue=False
)
clear_btn.click(lambda: [], None, chatbot, queue=False) # 返回空列表清除历史
return interface
- create_ui函数: 使用Gradio创建交互界面。
- 布局: 使用gr.Blocks、gr.Markdown、gr.Chatbot、gr.Textbox、gr.Button等组件构建界面。
- 事件绑定: 使用.click()方法将按钮点击事件与process_message函数绑定。
- 更新对话历史: process_message接受用户输入,调用Agent的process方法,并将结果添加到Gradio聊天机器人的历史记录。
专业视角: Gradio使得创建交互界面变得非常简单。你可以在此基础上,进一步美化界面,添加更多交互元素。
def main():
try:
# 初始化模型
model = OllamaLLM(
model="phi3:latest",
temperature=0.7,
num_ctx=2048,
base_url="http://localhost:11434",
)
# 创建 Agent
agent = SimpleAgent(model)
# 创建并启动 UI
interface = create_ui(agent)
interface.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
inbrowser=True
)
except Exception as e:
print(f"程序错误: {str(e)}")
print("\n按回车键继续...")
input()
if __name__ == "__main__":
main()
- main函数: 程序的入口。
- 初始化模型: 使用OllamaLLM加载本地部署的Ollama大语言模型。
- 创建Agent: 实例化SimpleAgent类。
- 启动界面: 创建并启动Gradio界面。
2.3 运行Agent
- 保存代码为agent.py。
- 在命令行中运行:python agent.py
- 打开浏览器,访问显示的地址(通常是http://localhost:7860)。
现在,你就可以和你的AI助手互动了!
3. 进阶思考:Agent的未来
我们今天构建的Agent只是一个简单的示例,但它展示了Agent开发的基本流程。未来,Agent的发展方向包括:
- 多模态Agent: 能够处理文本、图像、音频等多种输入。
- 自主Agent: 能够在没有明确指令的情况下,自主完成复杂任务。
- 协作Agent: 多个Agent协同工作,解决更复杂的问题。
- Agent与物联网: Agent可以作为物联网设备的“大脑”,实现设备的智能化控制和管理。
4. 互动环节
目前我已经设计出了自媒体新闻汇集智能体,github趋势汇总智能体,文章编写和生成视频智能体,工业PID算法智能体等。核心思想就是将工作流程交给agent来完成!
- 你觉得Agent在哪些领域最有潜力?
- 你还想给这个Agent添加什么功能?
- 你在Agent开发中遇到了哪些挑战?
欢迎在评论区留言,分享你的想法和经验!让我们一起探索Agent的无限可能!