news 2026/8/24 1:50:48

构建具备记忆能力的邮件智能体:从RAG到Agent的工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
构建具备记忆能力的邮件智能体:从RAG到Agent的工程实践

在实际邮件处理场景中,无论是个人邮箱还是客服工单系统,都面临一个核心矛盾:如何让自动化回复既精准又具备连续性。简单的关键词匹配或固定模板回复,无法理解用户的历史诉求和上下文,导致每次交互都像是“初次见面”,用户体验割裂,问题解决效率低下。而具备“记忆”能力的邮件智能体,正是为了解决这一痛点而生。它能够记住与特定联系人或特定会话的历史交互内容,并基于这些记忆,在后续回复中做出更连贯、更个性化的决策。

本文将围绕“Lindy 邮件智能体”这一概念,深入探讨如何为邮件处理系统构建记忆能力,并实现基于记忆的自动回复。我们将从核心概念入手,逐步构建一个具备基础记忆与回复功能的原型系统。整个过程将涵盖记忆的存储与检索机制、自动回复的决策逻辑,以及如何将大模型、Agent、工具调用等前沿概念融入一个可运行的工程实践中。无论你是希望为现有邮件系统增加智能,还是想深入理解AI Agent中“记忆”模块的实现,本文都将提供一条清晰的路径。

1. 理解邮件智能体的核心:记忆与上下文

在讨论具体实现之前,我们必须先厘清几个关键概念,以及它们在邮件处理场景下的具体含义。

1.1 什么是邮件智能体的“记忆”?

在AI Agent的语境中,“记忆”并非指生物记忆,而是一种数据持久化机制,用于存储和检索与特定实体(如用户、会话、任务)相关的历史信息。对于邮件智能体而言,记忆主要分为两类:

  1. 会话记忆:针对单次邮件往来线程的记忆。它记录了当前会话中已交换的所有邮件内容、提取的关键信息(如订单号、问题描述、解决方案步骤)以及智能体已执行的操作(如已查询的数据库、已回复的内容)。这确保了智能体在回复一封长线程邮件时,不会遗忘线程开头的信息。
  2. 长期记忆:针对特定发件人(或联系人)的记忆。它超越了单次会话,存储了与该联系人的所有历史交互中总结出的偏好、历史问题、身份信息等。例如,记住某位用户是VIP客户、偏好电话沟通、或曾报告过某个特定设备的故障。

没有记忆的智能体,每次处理邮件都像一张白纸,只能基于当前邮件内容做出反应,无法提供连贯的服务。

1.2 记忆、RAG与Agent的关系

当前热门的几个技术概念在此交汇:

  • 大模型:作为智能体的“大脑”,负责理解邮件内容、生成回复文本、进行逻辑推理。它需要高质量的输入(上下文)。
  • Prompt:是引导大模型完成特定任务的指令和上下文模板。一个设计良好的Prompt需要嵌入相关的记忆信息。
  • RAG:为智能体提供了从外部知识库(如产品手册、FAQ、历史工单)中检索相关信息的能力。这可以看作是一种“外部知识记忆”。
  • Agent:是具备自主决策能力的程序。它利用大模型进行思考,根据记忆和当前状态,决定调用哪个工具(如查询数据库、发送回复、创建待办事项)。
  • 记忆:是Agent的“个人经历库”,为决策提供历史上下文。它与RAG检索的外部知识共同构成Agent的认知基础。
  • 工具调用:是Agent执行动作的方式,例如调用邮件发送API、查询CRM系统。
  • Workflow:定义了Agent处理邮件的标准化流程,例如“接收邮件 -> 解析内容 -> 检索记忆 -> 决策 -> 调用工具 -> 更新记忆”。

我们的邮件智能体,就是一个集成了记忆模块、能够进行工具调用、并按照一定Workflow运行的Agent,其核心决策依赖于大模型和精心设计的Prompt

1.3 为什么“新开会话丢失上下文”是个关键问题?

许多初代的AI编程助手或聊天机器人都有一个通病:每次开启新会话,之前聊过的内容全部清零。这在邮件场景下是灾难性的。用户可能在第三封邮件中说“还是上次那个问题”,如果智能体忘记了“上次那个问题”是什么,就无法有效协助。因此,我们的系统设计必须优先解决记忆的持久化和关联检索问题。

2. 系统设计与环境准备

我们将构建一个简化但核心功能完整的邮件智能体原型。它不直接连接真实邮件服务器,而是通过模拟的邮件接收接口来演示整个工作流程。

2.1 系统架构概览

整个系统包含以下核心组件:

  1. 模拟邮件接收器:一个HTTP端点,接收模拟的邮件数据(发件人、主题、正文)。
  2. 记忆存储库:使用数据库存储会话记忆和长期记忆。这里为了简化,使用SQLite。
  3. 记忆检索器:根据当前邮件信息(如发件人、会话ID),从记忆存储库中检索相关历史记录。
  4. 大模型集成层:调用大模型API(如OpenAI GPT、国内合规大模型API),将邮件内容、检索到的记忆组合成Prompt,请求生成回复和决策。
  5. 工作流引擎:控制处理流程,协调各组件工作。
  6. 动作执行器:执行模型决策出的动作,如“发送回复”、“转人工”、“标记待办”。

2.2 技术栈与依赖配置

我们选择Python作为实现语言,因为它有丰富的大模型和AI相关库。

项目环境准备:

  1. 创建项目目录并初始化虚拟环境:

    mkdir lindy-mail-agent && cd lindy-mail-agent python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate
  2. 安装核心依赖:创建requirements.txt文件,内容如下:

    fastapi==0.104.1 uvicorn==0.24.0 sqlalchemy==2.0.23 pydantic==2.5.0 openai==1.3.0 # 或其他兼容大模型SDK,如 dashscope, zhipuai python-dotenv==1.0.0

    执行安装:

    pip install -r requirements.txt
  3. 准备大模型API密钥:创建.env文件,存放你的API密钥(请使用合规的大模型服务):

    # .env 文件示例 OPENAI_API_KEY=your_openai_api_key_here # 或者使用国内模型 # DASHSCOPE_API_KEY=your_dashscope_api_key_here MODEL_NAME=gpt-3.5-turbo # 或 qwen-max, glm-4等

2.3 项目结构设计

一个清晰的项目结构有助于维护和扩展。

lindy-mail-agent/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 应用入口 │ ├── models.py # SQLAlchemy 数据模型 & Pydantic 请求/响应模型 │ ├── memory.py # 记忆存储与检索核心逻辑 │ ├── agent.py # 智能体决策与工作流逻辑 │ ├── prompts.py # 存放各类Prompt模板 │ └── config.py # 配置文件 ├── requirements.txt ├── .env └── README.md

3. 构建记忆存储与检索模块

记忆模块是智能体的基石。我们设计一个简单的数据库模型来存储记忆。

3.1 定义数据模型

app/models.py中,我们定义两个核心表:ConversationMemory(会话记忆)和LongTermMemory(长期记忆)。

# app/models.py from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, sessionmaker from datetime import datetime import os from dotenv import load_dotenv load_dotenv() Base = declarative_base() class ConversationMemory(Base): """存储单次邮件会话的记忆""" __tablename__ = 'conversation_memories' id = Column(Integer, primary_key=True) # 会话唯一标识,可以用邮件线程ID或自定义UUID session_id = Column(String(255), nullable=False, index=True) # 发件人邮箱,用于关联长期记忆 sender_email = Column(String(255), nullable=False, index=True) # 记忆内容,可以是原始邮件片段或提取的摘要 content = Column(Text, nullable=False) # 记忆类型,如 'user_message', 'agent_response', 'extracted_info' memory_type = Column(String(50)) # 时间戳 created_at = Column(DateTime, default=datetime.utcnow) def __repr__(self): return f"<ConversationMemory(session_id={self.session_id}, type={self.memory_type})>" class LongTermMemory(Base): """存储与特定发件人相关的长期记忆""" __tablename__ = 'long_term_memories' id = Column(Integer, primary_key=True) # 关联的发件人邮箱 sender_email = Column(String(255), nullable=False, index=True, unique=False) # 记忆键,用于分类,如 'preference', 'past_issue', 'customer_tier' memory_key = Column(String(100), nullable=False) # 记忆值 memory_value = Column(Text, nullable=False) # 更新时间 updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 复合索引,确保同一用户的同类型记忆只有一条(或可多条) __table_args__ = (Index('idx_email_key', 'sender_email', 'memory_key'),) # 数据库连接(使用SQLite作为示例) DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./mail_agent.db") engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False} if DATABASE_URL.startswith("sqlite") else {}) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 创建表 Base.metadata.create_all(bind=engine)

3.2 实现记忆的存储与检索类

app/memory.py中,我们创建MemoryManager类来封装所有记忆操作。

# app/memory.py from sqlalchemy.orm import Session from .models import SessionLocal, ConversationMemory, LongTermMemory from typing import List, Optional, Dict, Any import json class MemoryManager: def __init__(self): self.db: Session = SessionLocal() def add_conversation_memory(self, session_id: str, sender_email: str, content: str, memory_type: str = "user_message"): """添加一条会话记忆""" memory = ConversationMemory( session_id=session_id, sender_email=sender_email, content=content, memory_type=memory_type ) self.db.add(memory) self.db.commit() return memory def get_conversation_history(self, session_id: str, limit: int = 10) -> List[Dict[str, Any]]: """获取指定会话的历史记录,按时间倒序""" memories = self.db.query(ConversationMemory).filter( ConversationMemory.session_id == session_id ).order_by(ConversationMemory.created_at.desc()).limit(limit).all() # 返回格式化的历史,便于放入Prompt history = [] for mem in reversed(memories): # 反转回时间顺序 role = "user" if mem.memory_type == "user_message" else "assistant" history.append({"role": role, "content": mem.content}) return history def upsert_long_term_memory(self, sender_email: str, key: str, value: str): """更新或插入一条长期记忆""" existing = self.db.query(LongTermMemory).filter( LongTermMemory.sender_email == sender_email, LongTermMemory.memory_key == key ).first() if existing: existing.memory_value = value else: memory = LongTermMemory(sender_email=sender_email, memory_key=key, memory_value=value) self.db.add(memory) self.db.commit() def get_long_term_memories(self, sender_email: str) -> Dict[str, str]: """获取指定发件人的所有长期记忆""" memories = self.db.query(LongTermMemory).filter( LongTermMemory.sender_email == sender_email ).all() return {mem.memory_key: mem.memory_value for mem in memories} def close(self): self.db.close()

关键解释:

  • add_conversation_memory: 每次处理邮件,无论是用户来信还是智能体回复,都调用此方法存储,形成会话流水账。
  • get_conversation_history: 在生成回复前调用,获取最近的对话历史,作为上下文提供给大模型。这里限制limit是为了防止上下文过长。
  • upsert_long_term_memory: 当从对话中提取出重要用户特征(如“偏好英文回复”)时,调用此方法更新长期记忆。
  • 使用SQLite是为了演示简便,生产环境应更换为PostgreSQL或MySQL,并考虑记忆内容的向量化存储和语义检索,以支持更复杂的“相关记忆”查找,而非仅按会话ID或键查询。

4. 实现智能体工作流与自动回复

智能体是系统的指挥中心。它按既定工作流运行:接收邮件 -> 检索记忆 -> 决策 -> 执行 -> 更新记忆。

4.1 设计Prompt模板

Prompt是与大模型沟通的桥梁。在app/prompts.py中定义。

# app/prompts.py from typing import Dict, List def build_agent_prompt( current_email: Dict, # 包含 subject, body, sender conversation_history: List[Dict], long_term_memories: Dict[str, str] ) -> str: """ 构建驱动智能体决策的Prompt。 返回一个结构化的字符串,包含系统指令、记忆上下文和当前请求。 """ # 格式化长期记忆 lt_memory_str = "" if long_term_memories: lt_memory_str = "\n关于这位用户的长期记忆:\n" for k, v in long_term_memories.items(): lt_memory_str += f"- {k}: {v}\n" # 格式化对话历史 history_str = "" if conversation_history: history_str = "\n本次会话历史(最近几次交流):\n" for msg in conversation_history: role = "用户" if msg["role"] == "user" else "助理" history_str += f"{role}: {msg['content']}\n" prompt = f""" 你是一个专业的邮件助理智能体(Lindy)。你的任务是分析收到的邮件,结合记忆,决定如何回复或处理。 {lt_memory_str} {history_str} 当前收到一封新邮件: 发件人:{current_email['sender']} 主题:{current_email['subject']} 正文: {current_email['body']} 请根据以上信息,按以下JSON格式输出你的决策: {{ "thought_process": "你的思考过程,分析用户意图、相关记忆等", "action": "需执行的动作,可选值:reply_directly(直接回复), need_more_info(需要更多信息), escalate_to_human(转人工), create_todo(创建待办)", "reply_content": "如果action是reply_directly,这里填写回复的邮件正文(用礼貌、专业的口吻)。否则留空或写N/A。", "extracted_info_for_memory": {{ "key1": "从本次交互中提取的值得长期记忆的信息,如用户偏好、问题类型等", "key2": "..." }} }} 请确保你的回复是纯JSON格式,便于程序解析。 """ return prompt

4.2 构建智能体核心逻辑

app/agent.py中,我们创建MailAgent类。

# app/agent.py from .memory import MemoryManager from .prompts import build_agent_prompt import openai # 或 from openai import OpenAI import json import os from dotenv import load_dotenv from typing import Dict, Any load_dotenv() class MailAgent: def __init__(self): self.memory_manager = MemoryManager() # 初始化大模型客户端,这里以OpenAI格式为例 self.client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) self.model = os.getenv("MODEL_NAME", "gpt-3.5-turbo") def process_email(self, session_id: str, sender: str, subject: str, body: str) -> Dict[str, Any]: """ 处理一封邮件的核心工作流。 返回处理结果。 """ # 1. 存储当前用户邮件到会话记忆 self.memory_manager.add_conversation_memory(session_id, sender, body, "user_message") # 2. 检索记忆 conv_history = self.memory_manager.get_conversation_history(session_id, limit=5) long_term_mem = self.memory_manager.get_long_term_memories(sender) # 3. 构建Prompt并调用大模型 current_email = {"sender": sender, "subject": subject, "body": body} prompt = build_agent_prompt(current_email, conv_history, long_term_mem) try: response = self.client.chat.completions.create( model=self.model, messages=[{"role": "user", "content": prompt}], temperature=0.2, # 低温度使输出更稳定 response_format={"type": "json_object"} # 要求返回JSON ) decision_str = response.choices[0].message.content decision = json.loads(decision_str) except Exception as e: # 模型调用失败,降级处理 decision = { "thought_process": f"模型调用失败: {e}", "action": "escalate_to_human", "reply_content": "N/A", "extracted_info_for_memory": {} } # 4. 执行动作(这里主要演示回复) result = {"decision": decision} if decision.get("action") == "reply_directly" and decision.get("reply_content"): reply_content = decision["reply_content"] # 模拟发送回复(实际应调用邮件发送API) print(f"[模拟] 发送回复给 {sender}: {reply_content[:100]}...") # 将助理回复也存入会话记忆 self.memory_manager.add_conversation_memory(session_id, sender, reply_content, "agent_response") result["reply_sent"] = True result["reply_preview"] = reply_content[:200] else: result["reply_sent"] = False result["action_needed"] = decision.get("action") # 5. 更新长期记忆 extracted_info = decision.get("extracted_info_for_memory", {}) if extracted_info and isinstance(extracted_info, dict): for key, value in extracted_info.items(): if value and value != "N/A": self.memory_manager.upsert_long_term_memory(sender, key, value) # 6. 返回处理结果 return result def close(self): self.memory_manager.close()

工作流详解:

  1. 记忆存储:收到邮件,先存入会话记忆表。
  2. 记忆检索:获取该会话的历史和该发件人的长期记忆。
  3. 模型决策:将记忆和当前邮件组合成Prompt,请求大模型分析并输出结构化决策(JSON)。
  4. 动作执行:根据决策的action字段执行相应操作。本例主要实现reply_directly
  5. 记忆更新:将模型提取的extracted_info_for_memory更新到长期记忆表中。
  6. 资源清理:处理完成后关闭数据库连接。

5. 创建API接口并运行验证

我们将使用FastAPI创建一个简单的HTTP接口来模拟接收邮件并触发智能体处理。

5.1 定义API端点

app/main.py中创建FastAPI应用。

# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from .agent import MailAgent import uuid app = FastAPI(title="Lindy Mail Agent API") # 请求数据模型 class EmailRequest(BaseModel): sender: str subject: str body: str # 可选,如果不提供则自动生成一个会话ID(模拟新会话) session_id: str = None # 响应数据模型 class EmailResponse(BaseModel): session_id: str processed: bool decision: dict reply_sent: bool reply_preview: str = None action_needed: str = None @app.post("/process_email/", response_model=EmailResponse) async def process_email(request: EmailRequest): """接收一封邮件,交由智能体处理""" agent = MailAgent() try: # 如果未提供session_id,则生成一个(模拟新邮件线程) session_id = request.session_id if request.session_id else f"sess_{uuid.uuid4().hex[:8]}" result = agent.process_email( session_id=session_id, sender=request.sender, subject=request.subject, body=request.body ) response_data = { "session_id": session_id, "processed": True, "decision": result.get("decision", {}), "reply_sent": result.get("reply_sent", False), "reply_preview": result.get("reply_preview"), "action_needed": result.get("action_needed") } return EmailResponse(**response_data) except Exception as e: raise HTTPException(status_code=500, detail=f"处理邮件时出错: {str(e)}") finally: agent.close() @app.get("/") async def root(): return {"message": "Lindy Mail Agent is running."}

5.2 运行与测试

  1. 启动服务:

    uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
  2. 模拟发送邮件进行测试:使用curl或 Postman 等工具调用API。

    测试用例1:新用户首次咨询

    curl -X POST "http://localhost:8000/process_email/" \ -H "Content-Type: application/json" \ -d '{ "sender": "customer_a@example.com", "subject": "产品价格咨询", "body": "你好,我想了解一下你们旗舰版产品的价格和功能区别。" }'

    预期结果:智能体没有该用户的长期记忆,但会根据邮件内容生成一个专业的回复,并可能将customer_a@example.cominquiry_type提取为price_and_feature存入长期记忆。

    测试用例2:同一用户再次询问(测试记忆)

    curl -X POST "http://localhost:8000/process_email/" \ -H "Content-Type: application/json" \ -d '{ "sender": "customer_a@example.com", "subject": "Re: 产品价格咨询", "body": "谢谢回复,关于旗舰版,它的存储空间具体是多少?", "session_id": "sess_abc123" # 使用第一次回复的session_id,模拟同一会话 }'

    预期结果:智能体会检索到会话历史(第一次的问答)和长期记忆(知道用户咨询过价格功能)。它的回复会更具连续性,例如:“正如我上次提到的,旗舰版包含...关于存储空间,具体是...”

  3. 检查数据库:使用SQLite浏览器或命令行查看mail_agent.db文件,确认conversation_memorieslong_term_memories表中已正确存入数据。

6. 常见问题排查与优化

在实际部署和运行中,你可能会遇到以下问题。

6.1 模型调用失败或返回非JSON

现象:API返回500错误,日志显示json.decoder.JSONDecodeError可能原因

  1. 大模型没有严格遵守response_format参数,返回了非JSON内容。
  2. API密钥错误、网络问题或模型服务不可用。排查与解决
  3. 检查API配置:确认.env文件中的OPENAI_API_KEYMODEL_NAME正确,且账户有余额。
  4. 增强JSON解析健壮性:在agent.pyprocess_email方法中,用try-except包裹json.loads,并在解析失败时提供降级策略。
    try: decision = json.loads(decision_str) except json.JSONDecodeError: # 尝试提取可能的JSON部分,或直接降级 print(f"模型返回非标准JSON: {decision_str[:200]}") decision = { "thought_process": "模型返回格式异常,转为人工处理。", "action": "escalate_to_human", "reply_content": "N/A", "extracted_info_for_memory": {} }
  5. 调整Prompt:在Prompt中更强烈地要求返回JSON,并给出更严格的格式示例。

6.2 记忆检索不相关或效率低

现象:随着数据量增长,按session_idsender_email的简单检索可能无法找到最相关的历史信息,或者检索速度变慢。解决方案

  1. 引入向量化记忆:将会话记忆的内容通过嵌入模型转换为向量,存储在向量数据库(如Chroma, Weaviate, Pinecone)中。检索时,使用当前邮件内容的向量进行语义相似度搜索,找到最相关的历史片段,而非仅仅按会话ID。
  2. 记忆摘要:对于长会话,不要存储所有原始消息。可以定期(或在会话结束时)让大模型生成一个“会话摘要”,只存储摘要,大幅减少存储和检索的负担。
  3. 数据库索引优化:确保session_idsender_email字段已建立索引。

6.3 上下文长度限制与Token超限

现象:当会话历史很长时,拼接的Prompt可能超过大模型的上下文窗口限制,导致调用失败。解决方案

  1. 限制历史条数:如代码中的limit=5,只取最近N条消息。
  2. 动态摘要:在Prompt中不直接放入全部历史,而是先让模型根据当前问题,从历史中提取最关键的信息,形成一个简短的“上下文摘要”,再将摘要放入主Prompt。
  3. 使用支持长上下文模型:选择上下文窗口更大的模型。

6.4 长期记忆的更新策略冲突

现象:模型提取的extracted_info_for_memory可能不准确或相互矛盾,导致长期记忆被错误覆盖。解决方案

  1. 置信度过滤:让模型在提取信息时附带一个置信度分数,只存储高置信度的信息。
  2. 人工审核:对于关键信息(如客户等级、合同金额)的更新,可以先存入“待审核”表,由人工确认后再更新到正式长期记忆。
  3. 版本化或追加:对于某些记忆(如“历史问题”),可以采用追加模式而非覆盖,记录该用户所有报告过的问题列表。

7. 生产环境最佳实践与扩展方向

将原型发展为生产可用的系统,需要考虑更多因素。

7.1 生产环境检查清单

维度学习/开发环境生产环境建议
数据库SQLitePostgreSQL/MySQL,考虑读写分离、备份策略。记忆向量化推荐专用向量库。
大模型API直接调用配置重试、熔断、降级、多个API Key轮询。设置合理的超时和限流。
安全性本地运行API接口需增加认证(API Key/JWT)。用户邮箱等PII信息需脱敏或加密存储。
可观测性打印日志集成结构化日志(如JSON Log),记录每次处理的session_id、模型调用耗时、决策结果。接入监控和告警。
性能顺序处理引入消息队列(如RabbitMQ, Redis Queue),异步处理邮件,避免HTTP请求阻塞。
记忆管理永不过期设计记忆过期和归档策略。定期清理过于陈旧的会话记忆,或将长期记忆迁移到冷存储。

7.2 扩展功能方向

  1. 集成真实邮件服务:使用imaplib/smtplib或第三方库(如exchangelibfor Outlook, Gmail API)替换模拟接口,实现真正的邮箱监听和发送。
  2. 工具调用增强:让Agent能执行更丰富的动作,如:
    • query_knowledge_base: 从公司内部知识库(通过RAG)检索答案。
    • check_order_status: 调用内部订单系统API查询状态。
    • schedule_meeting: 调用日历API安排会议。 这需要扩展Prompt中的动作定义,并实现相应的工具函数。
  3. 工作流引擎复杂化:使用LangGraph或类似框架来定义更复杂、带状态循环的决策流程。例如,当动作为need_more_info时,自动进入一个“追问”子流程。
  4. 多模态处理:支持处理邮件中的图片、附件,提取其中的文字信息(使用OCR)或分析附件内容。
  5. 评估与持续学习:建立反馈机制,收集人工对自动回复的评分(好/差),用于微调模型或优化Prompt。

7.3 关键配置参数说明

app/config.py中集中管理配置,以下是一些关键参数:

# app/config.py import os from dotenv import load_dotenv load_dotenv() class Config: # 大模型相关 LLM_API_KEY = os.getenv("LLM_API_KEY") LLM_BASE_URL = os.getenv("LLM_BASE_URL", "https://api.openai.com/v1") # 适配国内模型 LLM_MODEL = os.getenv("LLM_MODEL", "gpt-3.5-turbo") LLM_TEMPERATURE = float(os.getenv("LLM_TEMPERATURE", "0.2")) LLM_MAX_TOKENS = int(os.getenv("LLM_MAX_TOKENS", "2000")) # 记忆相关 CONVERSATION_HISTORY_LIMIT = int(os.getenv("CONVERSATION_HISTORY_LIMIT", "5")) # 是否启用长期记忆 ENABLE_LONG_TERM_MEMORY = os.getenv("ENABLE_LONG_TERM_MEMORY", "true").lower() == "true" # 数据库 DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./mail_agent.db") # 代理与超时 HTTP_PROXY = os.getenv("HTTP_PROXY") REQUEST_TIMEOUT = int(os.getenv("REQUEST_TIMEOUT", "30"))

构建一个具备记忆能力的邮件智能体,核心在于将离散的邮件交互转化为连续的、有状态的对话。通过本文的实践,你不仅实现了一个原型,更重要的是理解了记忆存储、检索、更新与大模型协同工作的完整链路。在实际项目中,应从简单的规则和关键词匹配入手,逐步引入语义记忆和复杂决策,并始终将系统的可靠性、可解释性和安全性置于首位。下一步,你可以尝试为你的智能体添加第一个真正的工具调用,例如连接一个FAQ数据库,让它从“能记忆”进化到“能查资料、能行动”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 1:50:19

接口测试全流程实战与面试指南

1. 接口测试全流程实战指南最近在技术社区看到不少同行讨论接口测试的面试准备问题&#xff0c;作为经历过数十次技术面试的老测试工程师&#xff0c;我想分享一套经过实战检验的接口测试全流程方案。这套方法不仅适合面试准备&#xff0c;更能直接应用于日常测试工作&#xff…

作者头像 李华
网站建设 2026/8/24 1:47:36

SAP S/4HANA CDS View:从数据建模到应用开发的核心技术解析

1. 从ABAP字典到CDS&#xff1a;一次根本性的范式转移如果你在SAP圈子里待了有些年头&#xff0c;尤其是从ECC时代一路走来&#xff0c;那么对SE11&#xff08;ABAP字典&#xff09;和SE16&#xff08;数据浏览器&#xff09;这两个事务代码一定再熟悉不过了。我们曾经依赖它们…

作者头像 李华
网站建设 2026/8/24 1:46:53

场景感知智能体技能检索:从语义匹配到上下文驱动的范式演进

1. 从“技能匹配”到“场景感知”&#xff1a;智能体技能检索的范式演进在构建一个复杂的智能体系统时&#xff0c;我们常常会面临一个核心挑战&#xff1a;当用户提出一个复杂请求时&#xff0c;如何从成百上千个内置技能中&#xff0c;精准、高效地找到最合适的那一个或那一组…

作者头像 李华
网站建设 2026/8/24 1:45:34

03-熬夜伤肝:中医教你给肝脏充电

03-熬夜伤肝&#xff1a;中医教你给肝脏充电 凌晨两点&#xff0c;你的IDE还亮着&#xff0c;屏幕上的代码一行行滚动&#xff0c;咖啡已经喝了第三杯&#xff0c;bug还是没找到。你打了个哈欠&#xff0c;揉了揉干涩的眼睛&#xff0c;心里想着"再改最后一个就睡"。…

作者头像 李华