目标
轻量级、全面支持 deepseek 系列模型,其中包括 deepseek-chat 和 deepseek-r1 的 AI Agent 框架。面向个人和中小企业实际应用场景。
概述
开发过程以实例来驱动 AI Agent 框架的开发,这个也是复合目标。
一般思想
在现阶段,应用主要初步完成了 Agent 和 Task 的实现,Task 是由若干 Step 组成的,Step 是最小执行的单元,Task 和 Step 都是面向实际业务逻辑场景来设计的,如果你了解或接触过 langchain ,这里的 Task 可能有点类似 langGraph ,是用于有效组织 Step 的单元,而组成 Task 的 Step 有点类似于 langgraph 中 node。相对于 Task 和 Step 偏向于业务,Agent 则更偏向于 LLM,对于 LLM 进行包裹和装饰,通过 Agent LLM 可以更容易和流畅与外界交互,使用工具和结构化输出。
项目结构
core 文件是对于 Agent、Task、Message 以及 Result 这些核心概念的抽象 extension 针对实际落地场景给出完整的解决方案 rag 中提供构建增强知识库的各种组件
第一个阶段主要围绕 3 个落地场景进行展开
邮件助手 数据分析 项目空间
首先我们来说一说为什么选择这 3 场景,以及这 3 场景在 AI Agent 能力具测试中具有哪些作用
可以访问哔哩哔哩获取观看相关视频,zidea 2015
场景 1 邮件助手
选择这个场景的一个主要原因,就是我个人实际接触过这样的需求,这是一个实实在在存在的客户需求,所以相对来说具有一定经验。还有就是这个场景是一个发生在工作中的高频的场景,特别客户是来自于海外情况下,更为常见。
面临挑战
结构化数据
非结构化数据提取,例如邮件中出现图片理解,音频或者超链接。提取多媒体内容然后形成结构化数据来供下一个流程。
import emailfrom bs4 import BeautifulSoupfrom PIL import Imageimport pydub
可以通过以上库来提取图片上信息,然后统一形成结构化数据
class EmailMetaData(BaseModel): sender:str = Field(title="sender",description="邮件发送人") reciever:str = Field(title="reciever",description="邮件介绍送人") email_cc:List[str] = Field(title="cc",description="邮件抄送") email_attech:List[Union[str,Path]] = Field(title="cc",description="邮件附件") email_image:List[Dict[str,Any]] = Field(title="email images",description="邮件中显出的图")
邮件中存在超链接处理方案
通过建立黑名单和白名单对于链接进行分类,对于未注册的链接需要询问 Human 来进行确定才可以访问。 对于超链接用途给予理解和分析
from urllib.parse import urlparsedef classify_link(url): ...
首先需要超链接判断是否处于白名单,白名单是可以配置的,然后需要判断超链接类型,然后不同超链接类型做出相应的动作。
urllib.parse.urlparse()
函数用于解析 URL。
parsed_url.scheme
属性表示 URL 的协议。
parsed_url.path
属性表示 URL 的路径。
隐私和安全
对于隐私信息通过覆盖、替换和加密等方式进行处理
邮件所处上下文理解
对于上下文的理解主要是,
def content_chunking_step(agent,context,use_cache): """chunking"""def retrieve_step(agent,context,use_cache): """retrieve"""def create_local_relation_graph(agent,context,use_cache): """创建邮件内部关系图"
beyond 邮件
收集项目以外更丰富的信息
技术上的解决方案
针对面临挑战中出现各个问题一一给出解决方案
对于邮件出现图片和视频理解,可以通过 OCR 来提取图像文本,然后交给 LLM 来理解
首先是
程序设计
对于智能邮件场景,内建了一个邮件处理模板任务,可以适合一些比较通过场景
class AutoEmailTask(Task): def __init__(self, name, description, agent, verbose = False): super().__init__(name, description, agent, verbose) def run(self, query, conf): return super().run(query, conf)
结构化数据
因为在邮件中,除了文本通常还会包含图片、表格,超链接等这些非结构化的多媒体的重要信息,那么这些可能需要通过 Agent 对其理解进一步形成结构化数据。
提取信息形成结构化的数据,例如从邮件头部信息提取邮件的发件人、收件人、主题、发送时间等。从正文内容中提取邮件的文本内容,可能包含纯文本、HTML、图片等。
class EmailMetaData(BaseModel): sender:str = Field(title="sender",description="邮件发送人") reciever:str = Field(title="reciever",description="邮件介绍送人") email_cc:List[str] = Field(title="cc",description="邮件抄送") email_attech:List[Union[str,Path]] = Field(title="cc",description="邮件附件") ...
对于邮件数据结构设计,然后将邮件抽象为一个 Documentory 这样数据结构,
class Documentory: @staticmethod def from_image(self,image:Union[Path,str]): ....
参考下面 OCR 技术具体实现
信息抽象
在结构化信息的基础上,进行信息抽象,然后再去创建一些特定的事件。例如邮件出现的关于交付、和会议这样就有一定时间有效性事件,会创建对应事件发送或通知用户。整个过程是通过对于内容进行实体识别,提取时间、地点和人名等关键的实体名词,然后基于这些关键实体名词来理解创建
class MeetingEvent: passclass DeliveryEvent: pass
邮件理解
对于邮件中出现实体名词进行提取,形成事件例如生成会议事件
class MeetingEvent: def __init__(self, meeting_memer, time, location): self.meeting_memer = meeting_memer # 参会人员列表 self.time = time # 会议时间 self.location = location # 会议地点 def __str__(self): return f"会议时间:{self.time},地点:{self.location},参会人员:{self.meeting_memer}"
def trigger(self): # ... (事件触发逻辑) if self.callback: self.callback(self) # 执行回调函数
邮件获取
email 库
smtplib: 这个库也属于 Python 标准库,主要用于与 SMTP(Simple Mail Transfer Protocol)服务器进行交互,发送电子邮件。通常会与 email 库结合使用,email 库负责构建邮件内容,smtplib 负责发送邮件。
外部知识
通过 API 或者检索数据库以及浏览网页来获取更多的关于项目的数据信息,这部分内容类似 Rag 除此之外还会搜索知识图谱,以及检索召回关联邮件以及历史对话
检索和更新知识图谱 召回 公司客户组织图,检索邮件相关人 关于客户询问去知识库进行检索
涉及技术
文本解析
邮件内容格式多样,包含纯文本、HTML、富文本等,需要统一解析。
结构化非结构化数据
提取邮件概要
OCR 图像识别
OCR 模型这里首推 paddlepaddle 系列提供的 paddleOCR
def image_ocr_step(agent,context,use_cache): """对于图像""" from paddleocr import PaddleOCR, draw_ocr ocr = PaddleOCR(use_angle_cls=True, lang='ch') res = [] if context['email']: email_data:EmailDocument = context['email'] if email_data.meta_data.email_image: for img_path in email_data.meta_data.email_image: result = ocr.ocr(img_path, cls=True) # 返回的是 List[ImageResult]
舆情分析
使用情感分析技术,判断邮件情感极性(积极、消极、中性)。这个部分内容随后展开。
from transformers import pipeline# 创建情感分析pipelineclassifier = pipeline("sentiment-analysis")图在邮件中应用
基于自然语言处理和图来构建邮件中出现实例和知识库中实体之间关系。基于实体以及他们之间关系来构建关系图
import spacyimport networkx as nx# 加载spaCy模型nlp = spacy.load("zh_core_web_sm")def build_email_graph(email_content): # 处理邮件内容 doc = nlp(email_content) # 创建图 graph = nx.Graph() # 添加实体为节点 for entity in doc.ents: graph.add_node(entity.text, type=entity.label_) # 添加关系为边 for token in doc:
智能决策
利用自然语言处理(NLP)技术,理解邮件内容,自动提取关键信息,并生成结构化数据。
基于注意力机制生成邮件
对于传入的邮件内容,Agent 理解将用户感兴趣的内容生成 Query 然后会给予对于理解 Query
class EmailQuery(BaseModel): query:str reply:strclass EmailMessage: role:str content:str extra:Any
计算每一个 Query 和 EmailMessage 的相似性从而形成注意力机制应用到 Query 所以对于每一个 Query 的 reply 生成都是从 EmailMessage 获取信息的加权线性组合。
邮件脱敏
使用脱敏技术,如替换、遮蔽、加密等,对敏感信息进行处理。
def content_chunking_step(agent,context,use_cache): """chunking"""def retrieve_step(agent,context,use_cache): """retrieve"""def create_local_relation_graph(agent,context,use_cache): """创建邮件内部关系图"""def email_style_rewrite(agent,context,use_cache): """按照风格对于邮件进行rewrite"""def write_email_base_on_attention(agent,context,use_cache): """生成邮件"""def email_review(agent,context,use_cache): """对于邮件脱敏加密和复核"""
邮件风格
根据用户风格,调整AI Agent的回复风格,提高用户体验,可以通过 example 借助 prompt 。主要是一个通过 example 提示 Agent
