deepseekers 第一个全面拥抱 deepseek 的国产 AI Agent 框架
探索国产AI框架的创新实践,深入了解DeepSeekers如何助力企业与个人高效应用AI技术。
先说几个核心判断:轻量级、全面支持DeepSeek系列模型(包括deepseek-chat和deepseek-r1),这才是面向个人和中小企业实际应用场景的AI Agent框架该有的样子。整个开发过程,我们用实例来驱动——这本身就是复合目标。
目标
打造一个轻量级的AI Agent框架,全面支持DeepSeek系列模型,目标用户是个人和中小企业,解决真实场景问题。
概述
用实例驱动AI Agent框架的开发,是贯穿始终的主线。现阶段,Agent和Task的实现已经初步完成。Task由若干Step组成,Step是最小的执行单元。Task和Step都面向实际业务逻辑场景来设计——如果了解过LangChain,这里的Task有点像LangGraph,用来有效组织Step;而组成Task的Step则类似于LangGraph中的Node。相对于Task和Step更偏向业务,Agent更偏向LLM,它对LLM进行包裹和装饰,让LLM更容易、更流畅地与外界交互,使用工具,输出结构化结果。
项目结构
- 文件:对Agent、Task、Message、Result这些核心概念的抽象。
core
- :针对实际落地场景给出完整解决方案。
extension
- :提供构建增强知识库的各种组件。
rag
第一阶段:三个落地场景
第一阶段主要瞄准三个落地场景:邮件助手、数据分析、项目空间。为什么选这三个?因为它们在AI Agent能力测试中各有独特作用。先说邮件助手。
场景1:邮件助手
选择邮件助手,理由很直接:我实际接触过这样的需求——一个实实在在存在的客户需求,所以算是有些经验。而且邮件处理是工作中的高频场景,客户来自海外的情况就更加常见了。
面临挑战
结构化数据
非结构化数据提取是第一个坎。邮件里经常出现图片、音频、超链接。需要从这些多媒体内容中提取信息,形成结构化数据,供下一个流程使用。
import email from bs4 import BeautifulSoup from PIL import Image import 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 urlparse
def 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:
pass
class 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) # 执行回调函数
邮件获取
- :Python标准库,用于解析邮件内容。
email库
- :也是Python标准库,用于与SMTP服务器交互,发送电子邮件。通常与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
classifier = pipeline("sentiment-analysis")
图在邮件中的应用
基于自然语言处理和图,构建邮件中间出现实体与知识库中实体之间的关系。基于实体及关系构建关系图:
import spacy
import networkx as nx
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:str
class 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。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名