AI 原生应用的核心特征:不是 UI,而是 Agentic 交互内核
本文将深入探讨 AI 原生应用的真正核心特征。我们将从根本上重新思考应用的交互模式,介绍 Agentic 交互(代理式交互)的概念,并展示它如何成为 AI 原生应用的灵魂。我们不仅会讨论理论概念,还会通过实际的代码示例,手把手教你如何构建一个具有 Agentic 交互内核的简单应用。你将学习到如何设计能够理解意图、制定计划、执行任务并从反馈中学习的智能代理。
AI 原生应用的核心特征:不是 UI,而是 Agentic 交互内核
标题选项
- 重新定义应用:AI 原生时代的 Agentic 交互内核革命
- 超越界面:探索 AI 原生应用的 Agentic 交互本质
- 从工具到伙伴:Agentic 交互如何重塑 AI 原生应用体验
- UI 只是表象:深入理解 AI 原生应用的 Agentic 交互内核
- 下一代应用范式:Agentic 交互作为 AI 原生应用的核心
引言
痛点引入
你是否有过这样的经历:使用一款号称"AI 驱动"的应用,却发现它只是在传统界面上加了一个聊天窗口?或者你曾经对某个 AI 助手充满期待,结果却发现它只能回答预设好的问题,无法真正理解你的意图,更不用说主动帮你完成复杂任务了?
在这个"AI +"的时代,许多应用都在争先恐后地贴上"AI 原生"的标签,但大多数都只是停留在表面的 UI 改造上。它们可能拥有漂亮的界面、流畅的动画,但核心交互逻辑仍然是传统的命令-响应模式。用户依然需要学习如何操作应用,而不是应用理解用户的需求。
文章内容概述
本文将深入探讨 AI 原生应用的真正核心特征。我们将从根本上重新思考应用的交互模式,介绍 Agentic 交互(代理式交互)的概念,并展示它如何成为 AI 原生应用的灵魂。
我们不仅会讨论理论概念,还会通过实际的代码示例,手把手教你如何构建一个具有 Agentic 交互内核的简单应用。你将学习到如何设计能够理解意图、制定计划、执行任务并从反馈中学习的智能代理。
读者收益
读完本文,你将:
- 理解 AI 原生应用与传统应用的本质区别
- 掌握 Agentic 交互的核心概念和设计原则
- 学会如何构建具有基本代理能力的应用
- 了解 Agentic 交互系统的架构设计和实现方法
- 获得关于 AI 原生应用未来发展趋势的洞见
无论你是产品经理、设计师还是开发者,这篇文章都将帮助你重新思考如何打造真正的 AI 原生体验。
准备工作
在开始我们的探索之旅前,让我们先确保你具备必要的基础和环境。
技术栈/知识
为了更好地理解和实践本文内容,建议你具备以下知识:
- 基本的编程概念和经验(我们将使用 Python)
- 对人工智能和机器学习基本概念的了解
- 熟悉 RESTful API 的概念和使用
- 基本的系统设计思维
环境/工具
你需要准备以下开发环境:
- Python 3.8 或更高版本
- 代码编辑器(如 VS Code、PyCharm 等)
- 有效的 OpenAI API 密钥(或其他 LLM API 访问权限)
- 基本的命令行操作能力
在后续的实战环节中,我们将使用以下 Python 库:
openai:用于访问大语言模型langchain:用于构建 LLM 应用的框架fastapi:用于构建 API 服务streamlit:用于快速构建数据应用界面
核心概念与背景
在进入实战之前,让我们先深入理解一些核心概念,建立必要的理论基础。
从传统应用到 AI 原生应用的范式转变
问题背景
自计算机诞生以来,应用程序的交互模式经历了几次重大演变。从最初的命令行界面(CLI),到图形用户界面(GUI),再到移动设备上的触摸界面,每一次变革都让技术更加平易近人。然而,这些交互模式本质上都是"指令驱动"的——用户必须学习如何与系统交互,按照系统设计的方式发出指令。
随着人工智能技术的快速发展,特别是大语言模型(LLM)的出现,我们正在见证一场新的交互革命。AI 原生应用不再只是简单地将 AI 技术附加到传统应用上,而是从根本上重新设计应用的交互模式和架构。
问题描述
传统应用设计面临的核心挑战是:
- 学习曲线:用户需要花费时间学习如何使用应用
- 刚性交互:应用只能按照预设的流程响应用户操作
- 有限适应性:难以处理非标准化的输入和意外情况
- 被动响应:应用不会主动预测或适应用户需求
而大多数所谓的"AI 增强"应用只是在传统界面上添加了一个聊天窗口,本质上仍然没有摆脱这些限制。
概念结构与核心要素组成
AI 原生应用的核心要素包括:
| 要素 | 描述 | 传统应用 | AI 原生应用 |
|---|---|---|---|
| 交互模式 | 用户与系统的沟通方式 | 指令-响应 | 意图-行动 |
| 主动性 | 系统是否能主动采取行动 | 被动 | 主动 |
| 适应性 | 系统适应新情况的能力 | 有限 | 高度灵活 |
| 学习能力 | 系统从经验中改进的能力 | 无(需手动更新) | 持续学习 |
| 目标导向 | 系统是否理解并追求目标 | 任务导向 | 目标导向 |
Agentic 交互的核心概念
“Agentic"一词源自"agent”(代理),在人工智能领域,Agent 指的是能够感知环境、做出决策并采取行动以实现目标的实体。Agentic 交互则是指基于这种代理能力的交互模式。
在 AI 原生应用的语境下,Agentic 交互内核具有以下核心特征:
- 意图理解:不仅理解用户说什么,更理解用户想要什么
- 目标推理:能够将模糊的需求转化为明确的目标
- 任务规划:为实现目标制定和调整计划
- 工具使用:能够调用各种工具和服务完成任务
- 自主执行:在没有持续用户输入的情况下主动执行任务
- 反馈学习:从结果中学习并不断优化表现
概念之间的关系
让我们通过 Mermaid 图来可视化这些概念之间的关系:
现在,让我们再看看这些组件之间的交互流程:
数学模型:Agentic 决策过程
Agentic 交互内核的决策过程可以用马尔可夫决策过程(MDP)来建模。一个 MDP 由以下要素组成:
- 状态空间 SSS:系统可能处于的所有状态
- 行动空间 AAA:代理可以采取的所有行动
- 转移概率 P(s′∣s,a)P(s'|s,a)P(s′∣s,a):在状态 sss 采取行动 aaa 后转移到状态 s′s's′ 的概率
- 奖励函数 R(s,a,s′)R(s,a,s')R(s,a,s′):在状态 sss 采取行动 aaa 转移到状态 s′s's′ 后获得的奖励
- 折扣因子 γ∈[0,1]\gamma \in [0,1]γ∈[0,1]:表示未来奖励的现值
Agentic 交互内核的目标是找到一个策略 π:S→A\pi: S \rightarrow Aπ:S→A,最大化预期累积奖励:
E[∑t=0∞γtR(st,at,st+1)] E\left[\sum_{t=0}^{\infty} \gamma^t R(s_t, a_t, s_{t+1})\right] E[t=0∑∞γtR(st,at,st+1)]
其中 at=π(st)a_t = \pi(s_t)at=π(st) 是在状态 sts_tst 时根据策略 π\piπ 选择的行动。
在实际的 AI 原生应用中,我们通常使用部分可观察马尔可夫决策过程(POMDP),因为系统无法完全观察到环境的真实状态,只能通过观察来推断。
核心内容:手把手实战
现在,让我们进入实战环节,构建一个具有 Agentic 交互内核的简单应用。我们将创建一个"智能旅行规划助手",它能够理解用户的旅行需求,制定旅行计划,并调用各种工具来完成预订、查找信息等任务。
步骤一:环境搭建与依赖安装
首先,我们需要设置开发环境并安装必要的依赖。
做什么
创建一个项目目录,设置虚拟环境,并安装所需的 Python 库。
为什么这么做
使用虚拟环境可以避免项目依赖与系统全局依赖冲突,确保我们的开发环境干净且可重现。
代码示例
在命令行中执行以下命令:
# 创建项目目录
mkdir agentic-travel-assistant
cd agentic-travel-assistant
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
# 创建必要的文件
touch requirements.txt
touch main.py
touch .env
现在,编辑 requirements.txt 文件,添加以下内容:
openai>=1.0.0
langchain>=0.1.0
langchain-openai>=0.0.2
langchainhub>=0.1.14
python-dotenv>=1.0.0
fastapi>=0.104.0
uvicorn>=0.24.0
streamlit>=1.28.0
pydantic>=2.5.0
然后安装这些依赖:
pip install -r requirements.txt
接下来,编辑 .env 文件,添加你的 API 密钥:
OPENAI_API_KEY=你的OpenAI_API密钥
步骤二:设计 Agentic 交互内核的基础架构
在开始编写代码之前,让我们先设计系统的整体架构。
核心概念:Agentic 系统的模块化设计
一个完整的 Agentic 交互内核通常由以下几个核心模块组成:
- 接口层(Interface Layer):处理与用户的直接交互
- 意图理解模块(Intent Understanding Module):解析用户输入,识别意图和实体
- 记忆模块(Memory Module):存储交互历史、用户偏好和世界知识
- 规划模块(Planning Module):制定实现目标的步骤和策略
- 执行模块(Execution Module):执行规划好的步骤,调用工具
- 工具集(Tool Set):可供代理使用的各种工具和服务
- 反思与学习模块(Reflection & Learning Module):分析结果,优化未来表现
让我们用 Mermaid 图来表示这个架构:
步骤三:实现基础组件
现在,让我们开始实现这个架构的各个组件。我们将从基础组件开始,逐步构建完整的系统。
记忆模块实现
首先,让我们实现一个简单的记忆模块,用于存储对话历史和用户偏好。
# main.py
from typing import List, Dict, Any
from datetime import datetime
from langchain.memory import ConversationBufferMemory
from langchain.schema import BaseMessage
import json
class TravelAssistantMemory:
"""旅行助手记忆模块"""
def __init__(self):
# 对话历史记忆
self.conversation_memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history",
input_key="input"
)
# 用户偏好存储
self.user_preferences = {}
# 旅行计划存储
self.trip_plans = {}
def add_message(self, role: str, content: str) -> None:
"""添加消息到对话历史"""
if role == "user":
self.conversation_memory.chat_memory.add_user_message(content)
elif role == "assistant":
self.conversation_memory.chat_memory.add_ai_message(content)
def get_conversation_history(self) -> List[BaseMessage]:
"""获取对话历史"""
return self.conversation_memory.chat_memory.messages
def set_user_preference(self, key: str, value: Any) -> None:
"""设置用户偏好"""
self.user_preferences[key] = value
self.user_preferences["updated_at"] = datetime.now().isoformat()
def get_user_preference(self, key: str, default: Any = None) -> Any:
"""获取用户偏好"""
return self.user_preferences.get(key, default)
def save_trip_plan(self, plan_id: str, plan_details: Dict[str, Any]) -> None:
"""保存旅行计划"""
self.trip_plans[plan_id] = {
"details": plan_details,
"created_at": datetime.now().isoformat(),
"updated_at": datetime.now().isoformat()
}
def get_trip_plan(self, plan_id: str) -> Dict[str, Any]:
"""获取旅行计划"""
return self.trip_plans.get(plan_id, {})
def get_memory_context(self) -> str:
"""获取记忆上下文,用于提示词"""
context_parts = []
# 添加用户偏好
if self.user_preferences:
context_parts.append("用户偏好:")
for key, value in self.user_preferences.items():
if key != "updated_at":
context_parts.append(f"- {key}: {value}")
# 添加现有旅行计划
if self.trip_plans:
context_parts.append("\n现有旅行计划:")
for plan_id, plan_info in self.trip_plans.items():
context_parts.append(f"- 计划 {plan_id}: 创建于 {plan_info['created_at']}")
return "\n".join(context_parts)
这个记忆模块有三个主要功能:
- 存储和检索对话历史
- 记录用户偏好
- 保存和管理旅行计划
工具实现
接下来,让我们实现一些旅行助手可能需要用到的工具。为了演示,我们将创建模拟工具,但你可以轻松地将它们替换为真实的 API 调用。
# main.py (继续添加)
from langchain.tools import BaseTool, StructuredTool, Tool
from pydantic import BaseModel, Field
from typing import Optional, Type
import random
# 工具输入模型定义
class WeatherQueryInput(BaseModel):
"""天气查询工具的输入"""
location: str = Field(description="要查询天气的地点")
date: Optional[str] = Field(description="要查询的日期,格式为YYYY-MM-DD,默认为今天")
class FlightSearchInput(BaseModel):
"""航班查询工具的输入"""
origin: str = Field(description="出发城市")
destination: str = Field(description="目的地城市")
date: str = Field(description="出发日期,格式为YYYY-MM-DD")
return_date: Optional[str] = Field(description="返程日期,格式为YYYY-MM-DD,可选")
class HotelSearchInput(BaseModel):
"""酒店查询工具的输入"""
location: str = Field(description="酒店所在城市或地区")
check_in_date: str = Field(description="入住日期,格式为YYYY-MM-DD")
check_out_date: str = Field(description="退房日期,格式为YYYY-MM-DD")
price_range: Optional[str] = Field(description="价格范围,如'低','中','高'")
class AttractionSearchInput(BaseModel):
"""景点查询工具的输入"""
location: str = Field(description="景点所在城市或地区")
interests: Optional[str] = Field(description="兴趣点,如'历史','自然','美食'等")
# 天气查询工具
class WeatherQueryTool(BaseTool):
name = "weather_query"
description = "查询指定地点的天气情况"
args_schema: Type[BaseModel] = WeatherQueryInput
def _run(self, location: str, date: Optional[str] = None) -> str:
"""模拟天气查询"""
# 在实际应用中,这里应该调用真实的天气API
conditions = ["晴朗", "多云", "小雨", "阴天", "大风"]
temperatures = {"低": (5, 15), "中": (15, 25), "高": (25, 35)}
# 随机选择天气条件和温度
condition = random.choice(conditions)
temp_range = random.choice(list(temperatures.values()))
temp = random.randint(*temp_range)
date_str = date if date else "今天"
return f"{date_str}{location}的天气:{condition},温度{temp}°C"
# 航班查询工具
class FlightSearchTool(BaseTool):
name = "flight_search"
description = "查询航班信息"
args_schema: Type[BaseModel] = FlightSearchInput
def _run(self, origin: str, destination: str, date: str, return_date: Optional[str] = None) -> str:
"""模拟航班查询"""
# 在实际应用中,这里应该调用真实的航班API
airlines = ["中国国航", "东方航空", "南方航空", "海南航空"]
times = ["08:30-11:45", "14:20-17:10", "18:45-21:30"]
prices = [880, 1200, 1560, 1890]
results = []
for i in range(3):
airline = random.choice(airlines)
time = random.choice(times)
price = random.choice(prices)
results.append(f"{i+1}. {airline} {time} {price}元")
trip_type = "单程" if not return_date else "往返"
return f"查询{origin}到{destination}{date}{trip_type}航班:\n" + "\n".join(results)
# 酒店查询工具
class HotelSearchTool(BaseTool):
name = "hotel_search"
description = "查询酒店信息"
args_schema: Type[BaseModel] = HotelSearchInput
def _run(self, location: str, check_in_date: str, check_out_date: str, price_range: Optional[str] = None) -> str:
"""模拟酒店查询"""
# 在实际应用中,这里应该调用真实的酒店API
hotels = ["万豪酒店", "希尔顿酒店", "如家快捷", "汉庭酒店", "Airbnb民宿"]
ratings = [4.5, 4.2, 4.7, 4.0, 4.8]
price_ranges = {
"低": (200, 400),
"中": (400, 800),
"高": (800, 2000)
}
selected_range = price_range if price_range else random.choice(list(price_ranges.keys()))
min_price, max_price = price_ranges[selected_range]
results = []
for i in range(3):
hotel = random.choice(hotels)
rating = random.choice(ratings)
price = random.randint(min_price, max_price)
results.append(f"{i+1}. {hotel} 评分:{rating} {price}元/晚")
return f"查询{location}{check_in_date}至{check_out_date}酒店:\n" + "\n".join(results)
# 景点查询工具
class AttractionSearchTool(BaseTool):
name = "attraction_search"
description = "查询景点信息"
args_schema: Type[BaseModel] = AttractionSearchInput
def _run(self, location: str, interests: Optional[str] = None) -> str:
"""模拟景点查询"""
# 在实际应用中,这里应该调用真实的景点API
all_attractions = {
"北京": ["故宫博物院", "长城", "颐和园", "天坛", "鸟巢"],
"上海": ["外滩", "东方明珠", "城隍庙", "迪士尼乐园", "南京路"],
"杭州": ["西湖", "灵隐寺", "千岛湖", "宋城", "雷峰塔"],
"西安": ["兵马俑", "古城墙", "大雁塔", "华清池", "钟鼓楼"],
"成都": ["大熊猫基地", "宽窄巷子", "锦里古街", "都江堰", "青城山"]
}
city_attractions = all_attractions.get(location, [f"{location}著名景点1", f"{location}著名景点2", f"{location}著名景点3"])
if interests:
# 如果有兴趣偏好,我们可以"针对性"地推荐
interest_attractions = [f"{interest}相关景点: {attraction}" for attraction, interest in zip(city_attractions[:3], interests.split(","))]
return f"根据您的兴趣({interests}),推荐{location}以下景点:\n" + "\n".join([f"{i+1}. {attr}" for i, attr in enumerate(interest_attractions)])
else:
return f"推荐{location}以下景点:\n" + "\n".join([f"{i+1}. {attr}" for i, attr in enumerate(city_attractions[:5])])
步骤四:实现意图理解模块
意图理解模块负责分析用户输入,提取关键信息,并确定用户的真实意图。
# main.py (继续添加)
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
class IntentUnderstandingModule:
"""意图理解模块"""
def __init__(self, llm: ChatOpenAI):
self.llm = llm
# 定义意图分类提示模板
intent_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的旅行助手意图分析器。你的任务是分析用户输入,识别用户的意图和关键信息。\n\n"
"可能的意图类型包括:\n"
"- 天气查询: 用户想了解某个地方的天气\n"
"- 航班查询: 用户想查询航班信息\n"
"- 酒店查询: 用户想查询或预订酒店\n"
"- 景点推荐: 用户想了解某个地方的景点\n"
"- 行程规划: 用户想规划整个旅行行程\n"
"- 一般咨询: 用户询问旅行相关的一般问题\n"
"- 闲聊: 用户只是想闲聊\n\n"
"请以JSON格式输出,包含以下字段:\n"
"- intent: 识别出的主要意图(从上述列表中选择)\n"
"- confidence: 意图识别的置信度(0-1之间的小数)\n"
"- entities: 提取出的关键实体,可能包括location(地点)、date(日期)、origin(出发地)、destination(目的地)等\n"
"- needs_clarification: 是否需要向用户澄清更多信息(true/false)\n"
"- clarification_question: 如果需要澄清,提供澄清问题"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "用户输入: {input}"),
])
# 创建意图识别链
self.intent_chain = LLMChain(
llm=self.llm,
prompt=intent_prompt,
output_key="intent_result"
)
def analyze_intent(self, user_input: str, chat_history: List[BaseMessage]) -> Dict[str, Any]:
"""分析用户意图"""
result = self.intent_chain.run(
input=user_input,
chat_history=chat_history
)
# 尝试解析LLM返回的JSON
try:
# 有时候LLM会在JSON前后添加额外文本,我们需要提取JSON部分
json_start = result.find("{")
json_end = result.rfind("}") + 1
if json_start != -1 and json_end != -1:
json_str = result[json_start:json_end]
return json.loads(json_str)
except Exception as e:
print(f"解析意图结果失败: {e}")
# 如果解析失败,返回默认值
return {
"intent": "一般咨询",
"confidence": 0.5,
"entities": {},
"needs_clarification": True,
"clarification_question": "我不太确定您的需求,能详细说明一下吗?"
}
步骤五:实现规划和执行模块
规划模块负责根据用户意图和可用信息制定行动计划,执行模块则负责执行这个计划。
# main.py (继续添加)
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain.prompts import MessagesPlaceholder, ChatPromptTemplate
class TravelPlanner:
"""旅行规划与执行模块"""
def __init__(self, llm: ChatOpenAI, memory: TravelAssistantMemory):
self.llm = llm
self.memory = memory
# 初始化工具
self.tools = [
WeatherQueryTool(),
FlightSearchTool(),
HotelSearchTool(),
AttractionSearchTool()
]
# 创建代理提示词
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的旅行助手,帮助用户规划和安排旅行。\n\n"
"关于用户的已知信息:\n{memory_context}\n\n"
"请根据用户需求,使用提供的工具帮助用户完成旅行规划。"
"在执行过程中,请主动思考并决定何时使用何种工具。"
"如果信息不完整,可以向用户询问更多细节。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 创建代理
self.agent = create_openai_functions_agent(
llm=self.llm,
tools=self.tools,
prompt=prompt
)
# 创建代理执行器
self.agent_executor = AgentExecutor(
agent=self.agent,
tools=self.tools,
verbose=True, # 设为True可以看到详细执行过程
max_iterations=10, # 限制最大迭代次数
early_stopping_method="generate" # 当认为任务完成时提前停止
)
def plan_and_execute(self, user_input: str, intent_result: Dict[str, Any]) -> str:
"""根据分析的意图规划和执行任务"""
try:
# 获取记忆上下文
memory_context = self.memory.get_memory_context()
# 如果意图分析显示需要澄清信息,直接返回澄清问题
if intent_result.get("needs_clarification", False):
return intent_result.get("clarification_question", "我需要更多信息来帮助您。")
# 构建增强的用户输入,包含意图分析结果
enhanced_input = f"{user_input}\n\n(已分析意图: {intent_result.get('intent', '未知')}, 关键信息: {intent_result.get('entities', {})})"
# 执行代理
result = self.agent_executor.invoke({
"input": enhanced_input,
"chat_history": self.memory.get_conversation_history(),
"memory_context": memory_context
})
return result["output"]
except Exception as e:
print(f"执行规划时出错: {e}")
return "抱歉,在处理您的请求时遇到了一些问题。请稍后再试或换一种方式提问。"
步骤六:整合所有组件
现在,让我们将所有组件整合在一起,创建一个完整的 Agentic 旅行助手。
# main.py (继续添加)
class AgenticTravelAssistant:
"""Agentic旅行助手主类"""
def __init__(self):
# 初始化LLM
self.llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
openai_api_key=os.getenv("OPENAI_API_KEY")
)
# 初始化记忆模块
self.memory = TravelAssistantMemory()
# 初始化意图理解模块
self.intent_module = IntentUnderstandingModule(self.llm)
# 初始化规划与执行模块
self.planner = TravelPlanner(self.llm, self.memory)
def process_input(self, user_input: str) -> str:
"""处理用户输入的主方法"""
# 1. 分析用户意图
intent_result = self.intent_module.analyze_intent(
user_input,
self.memory.get_conversation_history()
)
print(f"识别到的意图: {intent_result.get('intent', '未知')}")
print(f"置信度: {intent_result.get('confidence', 0)}")
print(f"提取的实体: {intent_result.get('entities', {})}")
# 2. 将用户消息添加到记忆
self.memory.add_message("user", user_input)
# 3. 规划和执行任务
response = self.planner.plan_and_execute(user_input, intent_result)
# 4. 将助手响应添加到记忆
self.memory.add_message("assistant", response)
# 5. 尝试提取和存储用户偏好(简化实现)
self._extract_user_preferences(user_input, response)
return response
def _extract_user_preferences(self, user_input: str, assistant_response: str) -> None:
"""从交互中提取用户偏好(简化实现)"""
# 在实际应用中,这里可以使用另一个LLM调用来分析对话并提取偏好
# 这里仅作为示例,实现一个非常基础的偏好提取
if "预算" in user_input or "价格" in user_input:
# 简单提取预算偏好的示例
if "便宜" in user_input or "低" in user_input:
self.memory.set_user_preference("price_range", "低")
elif "中等" in user_input or "适中" in user_input:
self.memory.set_user_preference("price_range", "中")
elif "高档" in user_input or "高" in user_input:
self.memory.set_user_preference("price_range", "高")
# 提取旅行目的地偏好
# (在实际应用中,这里应该有更复杂的逻辑)
步骤七:创建用户界面
最后,让我们创建一个简单的用户界面,使用 Streamlit 来与我们的 Agentic 旅行助手交互。
# 创建一个新文件 streamlit_app.py
import streamlit as st
import sys
import os
# 添加当前目录到路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from main import AgenticTravelAssistant
# 页面配置
st.set_page_config(
page_title="Agentic旅行助手",
page_icon="✈️",
layout="centered"
)
# 标题
st.title("✈️ Agentic旅行助手")
st.markdown("欢迎使用智能旅行助手!我可以帮您查询天气、航班、酒店,推荐景点,甚至规划完整的旅行行程。")
# 初始化助手(如果尚未初始化)
if "assistant" not in st.session_state:
st.session_state.assistant = AgenticTravelAssistant()
st.session_state.messages = []
# 显示历史消息
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 处理用户输入
if prompt := st.chat_input("请告诉我您的旅行需求..."):
# 显示用户消息
with st.chat_message("user"):
st.markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
# 显示正在思考的提示
with st.chat_message("assistant"):
with st.spinner("正在思考..."):
response = st.session_state.assistant.process_input(prompt)
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})
运行我们的应用
现在,我们已经完成了基础的 Agentic 旅行助手。让我们运行它来看看效果:
# 先确保你在项目目录中并且虚拟环境已激活
# 运行 Streamlit 应用
streamlit run streamlit_app.py
这将启动一个本地服务器,并在浏览器中打开应用界面。你可以尝试问一些问题,比如:
- “北京今天天气怎么样?”
- “我想从上海去杭州,下周五出发,帮我查一下航班”
- “帮我推荐西安的景点”
- “我想规划一个三天的成都之旅,预算中等”
进阶探讨
现在我们已经构建了一个基本的 Agentic 交互系统,让我们来探讨一些更高级的话题。
多代理协作系统
在复杂的应用场景中,单一代理可能无法高效完成所有任务。多代理协作系统将不同专业能力的代理组织起来,通过协作完成复杂任务。
概念架构
多代理系统的优势在于:
- 专业化:每个代理可以专注于特定领域,提供更专业的服务
- 可扩展性:可以轻松添加新的专业代理
- 并行处理:多个代理可以同时处理不同子任务
- 容错性:单个代理的故障不会导致整个系统崩溃
长期记忆与知识管理
我们的示例实现了基本的短期对话记忆,但真正强大的 Agentic 系统需要能够长期记忆和管理知识。
记忆层次结构
一个完整的记忆系统通常包含多个层次:
- 感觉记忆(Sensory Memory):极短期存储原始感知输入
- 短期记忆(Short-Term Memory):当前上下文中的活跃信息
- 长期记忆(Long-Term Memory):
- 语义记忆(Semantic Memory):关于世界的一般知识
- 情景记忆(Episodic Memory):个人经历的事件
- 程序记忆(Procedural Memory):如何执行任务的知识
向量存储与检索
实现长期记忆的常用方法是使用向量数据库(Vector Databases):
# 这是一个概念示例,展示如何使用向量存储实现长期记忆
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
import datetime
class LongTermMemory:
"""长期记忆系统"""
def __init__(self, persist_directory="./chroma_db"):
self.embeddings = OpenAIEmbeddings()
self.vectorstore = Chroma(
persist_directory=persist_directory,
embedding_function=self.embeddings
)
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
def store_memory(self, content: str, memory_type: str = "interaction", metadata: dict = None) -> None:
"""存储记忆"""
if metadata is None:
metadata = {}
metadata.update({
"memory_type": memory_type,
"timestamp": datetime.datetime.now().isoformat()
})
documents = self.text_splitter.create_documents([content], metadatas=[metadata])
self.vectorstore.add_documents(documents)
self.vectorstore.persist()
def retrieve_memories(self, query: str, memory_type: str = None, top_k: int = 5) -> list:
"""检索相关记忆"""
filter_dict = {}
if memory_type:
filter_dict["memory_type"] = memory_type
results = self.vectorstore.similarity_search(
query,
k=top_k,
filter=filter_dict if filter_dict else None
)
return results
反思与自我改进能力
真正的 Agentic 系统不仅能够执行任务,还能够反思自己的表现并进行自我改进。
反思循环
实现反思能力的一种方法是定期让 LLM 分析自己的表现:
class ReflectionModule:
"""反思与自我改进模块"""
def __init__(self, llm: ChatOpenAI):
self.llm = llm
def reflect_on_performance(self, conversation_history: List[BaseMessage]) -> Dict[str, Any]:
"""反思对话表现"""
# 构建反思提示词
reflection_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的AI助手性能分析师。请分析以下对话历史,评估助手的表现并提出改进建议。\n\n"
"请以JSON格式输出,包含以下字段:\n"
"- overall_score: 总体表现评分(1-10)\n"
"- strengths: 助手表现良好的方面(数组)\n"
"- weaknesses: 助手表现不佳的方面(数组)\n"
"- improvement_suggestions: 具体改进建议(数组)\n"
"- missed_opportunities: 助手错失的提供更好服务的机会(数组)"),
MessagesPlaceholder(variable_name="conversation_history")
])
chain = LLMChain(llm=self.llm, prompt=reflection_prompt)
result = chain.run(conversation_history=conversation_history)
# 解析结果(简化版)
try:
json_start = result.find("{")
json_end = result.rfind("}") + 1
if json_start != -1 and json_end != -1:
json_str = result[json_start:json_end]
return json.loads(json_str)
except Exception as e:
print(f"解析反思结果失败: {e}")
return {
"overall_score": 5,
"strengths": [],
"weaknesses": [],
"improvement_suggestions": ["无法分析对话历史"],
"missed_opportunities": []
}
最佳实践与设计原则
在构建 Agentic 交互系统时,以下最佳实践和设计原则将帮助你创建更强大、更可靠的应用。
1. 明确的目标分解
将复杂目标分解为可管理的子任务:
- 使用 LLM 将用户的抽象请求转换为具体步骤
- 为每个步骤定义明确的完成条件
- 实现子任务之间的依赖管理
2. 工具选择与调用
高效的工具使用是 Agentic 系统的关键:
- 为每个工具提供清晰的描述和使用示例
- 实现工具调用验证,确保输入格式正确
- 考虑工具调用失败的处理和重试机制
- 定期评估工具的实用性,淘汰不必要的工具
3. 有效提示词设计
提示词是与 LLM 沟通的桥梁:
- 提供明确的角色设定和任务描述
- 包含相关的上下文信息和约束条件
- 指定期望的输出格式
- 提供少量示例(Few-shot learning)
- 迭代优化提示词,基于实际结果进行调整
4. 错误处理与恢复
强大的错误处理机制确保系统稳健运行:
- 实现多层错误捕获和处理
- 为常见错误场景预设恢复策略
- 设计优雅的降级路径,当高级功能不可用时使用简单方法
- 记录详细的错误日志,便于分析和改进
5. 安全与隐私考虑
Agentic 系统的安全性至关重要:
- 实现用户授权和身份验证
- 对敏感操作进行确认或额外验证
- 过滤和监控工具调用,防止滥用
- 实施数据最小化原则,只收集必要信息
- 提供用户对数据的控制权和透明度
更多推荐

所有评论(0)