掘金 人工智能 08月21日
老顾深度解析【字节跳动的AI项目DeerFlow】源码之工程结构(六)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了DeerFlow开源项目在工程化方面值得学习的技术亮点。文章详细介绍了项目的目录结构,并逐一阐述了各目录和文件的作用,包括文档、示例、源代码、测试、前端代码、环境变量、启动脚本、配置文件、容器化配置、主入口文件、依赖管理、后端启动文件以及虚拟环境文件等。特别强调了`pyproject.toml`文件的重要性,详细解读了其在构建系统、项目信息、依赖管理、可选依赖、测试配置、覆盖率报告、构建目标以及代码格式化等方面的配置。此外,文章还深入探讨了`src`目录下的关键模块,如`config`中的配置管理、`prompts`中的提示词模板、`server`中FastAPI框架的应用及`text/event-stream`流式输出技术,以及`tools/decorators.py`中的日志装饰器和混入类。最后,对`server.py`的启动脚本进行了详细分析,包括其功能、参数解析、日志配置和优雅关闭机制。本文为Python开发者提供了宝贵的工程实践经验。

📄 **工程目录结构清晰,职责分明**:DeerFlow项目拥有一个规范且易于理解的工程目录结构,包括`docs`用于存放介绍和使用说明,`examples`提供案例,`src`包含核心Python源代码,`tests`用于单元测试,`web`存放前端代码。此外,`.env`、`bootstrap`脚本、`conf.yaml`、`docker-compose.yml`、`Dockerfile`等文件也分别负责环境变量、启动、配置、容器化等关键功能,为项目的开发、部署和维护提供了良好的基础。

📝 **`pyproject.toml`是项目配置的核心**:该文件详细定义了项目的构建系统(使用`hatchling`)、基本信息(名称、版本、描述、Python版本要求)、核心依赖项(如`httpx`、`langchain-community`)、可选依赖(如开发和测试环境的依赖)、测试框架(`pytest`)的配置(包括路径、文件模式、覆盖率选项和警告过滤)、代码覆盖率目标(`fail_under`)以及构建目标(`wheel`包的包含内容)和代码格式化工具(`black`)的配置。这使得项目能够标准化管理依赖、测试和构建流程。

💡 **FastAPI与流式输出技术赋能实时交互**:项目在`src/server`目录下使用FastAPI框架作为与前端交互的入口。其中,`StreamingResponse`配合`media_type="text/event-stream"`实现了Server-Sent Events(SSE)流式输出技术,这对于AI生成文本的实时返回、日志更新、实时通知等场景至关重要,能够提供更流畅和及时的用户体验。前端可通过`EventSource`对象接收和处理这些流式数据。

🛠️ **日志装饰器与混入类提升可观测性**:`src/tools/decorators.py`提供了一套实用的日志增强机制,包括`log_io`函数装饰器,用于记录函数调用的输入输出;`LoggedToolMixin`混入类,为工具类添加日志记录功能;以及`create_logged_tool`工厂函数,能够动态创建带有日志功能的工具类。这些机制极大地简化了为函数和类添加日志记录的过程,有助于调试和监控。

🚀 **`server.py`实现健壮的API服务启动**:该脚本负责启动DeerFlow的API服务,基于`uvicorn`运行`src.server:app`。它支持通过命令行参数灵活配置服务器的`host`、`port`、`log_level`以及是否开启`reload`(自动重载)功能。同时,通过注册`SIGTERM`和`SIGINT`信号处理器,确保了服务器在接收到终止或中断信号时能够进行优雅关闭,保障了服务的稳定性。

前言

老顾花了很多的篇幅已经介绍了关于DeerFlow项目中的AI Agent多智能体相关的源码。需要了解的人可以看前面的文章。

这篇文章老顾给大家介绍一下DeerFlow工程方面的技术点,也是值得我们学习的地方。

工程结构

-DEER-FLOW--docs----xx.md--examples----yy.md--src--tests--web--.env--.python-version--bootstrap.bat--bootstrap.sh--conf.yaml--docker-compose.yml--Dockerfile--main.py--Makefile--pyproject.toml--server.py--uv.lock

上面是deerflow的工程目录结构,我们来看一下各自的作用

**docs:**存放着相关核心介绍,如怎么使用配置

**examples:**md格式的文档,一些案例的报告

**src:**项目的Python的源代码就在此目录下

**tests:**单元测试

**web:**前端页面代码

**.env:**项目的全局的环境变量都在此处

**.python-version:**uv虚拟环境配置的python版本

**bootstrap.bat:**windows版本的执行脚本,启动后端和前端

**bootstrap.sh:**linux版本的执行脚本,启动后端和前端

**conf.yaml:**大模型相关的配置

**docker-compose.yml:**容器的编排文件

**Dockerfile:**容器的镜像文件配置

**main.py:**支持用户通过命令行或交互式界面提问

**Makefile:**提供一组用于开发、测试、格式化和运行项目的命令

**pyproject.toml:**里面包含了依赖的包,打包方式等

**server.py:**项目后端的启动入口

**uv.lock:**uv虚拟环境的系统文件

我们来重点看一下**pyproject.toml文件,**里面的信息是比较重要的

pyproject.toml

1. 构建系统配置

[build-system]requires = ["hatchling"]build-backend = "hatchling.build"

2. 项目基本信息

[project]name = "deer-flow"version = "0.1.0"description = "DeerFlow project"readme = "README.md"requires-python = ">=3.12"

3. 项目依赖

dependencies = [    "httpx>=0.28.1",    "langchain-community>=0.3.19",    "langchain-experimental>=0.3.4",    ...]

4. 可选依赖

[project.optional-dependencies]dev = [    "black>=24.2.0",    "langgraph-cli[inmem]>=0.2.10",]test = [    "pytest>=7.4.0",    "pytest-cov>=4.1.0",    "pytest-asyncio>=1.0.0",]

5. 测试配置

[tool.pytest.ini_options]testpaths = ["tests"]python_files = ["test_*.py"]addopts = "-v --cov=src --cov-report=term-missing"filterwarnings = [    "ignore::DeprecationWarning",    "ignore::UserWarning",]

6. 覆盖率报告配置

[tool.coverage.report]fail_under = 25

7. 构建目标配置

[tool.hatch.build.targets.wheel]packages = ["src"]

8. 代码格式化工具配置

[tool.black]line-length = 88target-version = ["py312"]include = '.pyi?$'extend-exclude = '''^/build/'''

该 pyproject.toml 文件定义了项目的构建工具、基本信息、依赖项、可选依赖、测试配置、代码覆盖率、构建目标以及代码格式化规则。它是现代 Python 项目的标准配置文件,能够帮助开发者快速配置和管理项目。

下面我们来看看src目录下面有哪些点,可以值得学习的

src源码

一、config

里面存放了项目的配置信息,其中里面有个configuration.py文件,

此文件 configuration.py 用于定义程序的配置类 Configuration,它提供了一种结构化的方式来管理应用程序的可配置参数。这些参数可以来源于环境变量或 RunnableConfig 对象

以下是对代码的详细解释:

    配置管理:通过 dataclass 定义了程序运行所需的配置项,如资源列表、最大迭代次数、报告风格等。灵活的配置来源:支持从环境变量或传入的 RunnableConfig 中读取配置值,提供了灵活性。默认值管理:为每个配置项提供了默认值或默认工厂函数,确保即使没有显式提供配置,程序也能正常运行。

二、prompts

此目录下面存放了智能体中所需要的提示词文件,里面template.py文件定义了获取提示词模板的方法。

三、server

此目录中app.py是与前端交互的请求入口地址,里面采用了fastapi框架;里面有个比较重要的Stream流失输出的技术点 ,StreamingResponse中media_type="text/event-stream" ,

media_type="text/event-stream" 的作用是设置 HTTP 响应的内容类型为 Server-Sent Events (SSE) 流。SSE 是一种允许服务器向客户端(通常是浏览器)持续推送数据的技术。

1、作用:

2、一般应用场景:

    实时日志更新:如监控系统、任务执行日志的实时展示。实时通知:用户消息提醒、系统告警。流式数据传输:AI 生成文本的逐步返回(如 ChatGPT 类型的流式回复)。股票价格、天气更新等:需要服务器持续推送数据更新的场景。

3、前端如何接收:

前端使用 EventSource 对象来接收 text/event-stream 数据。

4、示例代码:

const eventSource = new EventSource('/api/chat/stream');eventSource.onmessage = function(event) {    console.log('Received data:', event.data);    // 处理服务器发送的数据    const data = JSON.parse(event.data);        if (data.event === "stream_end") {        console.log("Stream has ended");        eventSource.close();  // 主动关闭连接        return;    }};eventSource.onerror = function(err) {    console.error('EventSource failed:', err);};

5、消息格式说明

服务器发送的数据需要遵循 SSE 协议格式,例如:

event: messagedata: {"content": "Hello", "role": "assistant"}

里面的其他目录,都是以不同的Agent作为文件夹归类的,如:rag、ppt、podcast等Agent

四、日志装饰

我们来看一下src/tools/decorators.py这个文件,里面就是对logger日志做一些增强。

1. 函数装饰器 log_io

def log_io(func: Callable) -> Callable:

2. 混入类 LoggedToolMixin

class LoggedToolMixin:

这是一个混入类,为工具类提供日志记录功能:

3. 工厂函数 create_logged_tool

def create_logged_tool(base_tool_class: Type[T]) -> Type[T]:

这套系统允许开发者通过简单的装饰器或类工厂方式,为现有的工具函数和类添加自动化的输入输出日志记录功能,便于调试和监控工具的执行情况。

server.py

这段代码是一个用于运行 DeerFlow API 服务的服务器脚本,主要功能是启动一个基于 uvicornASGI 服务器。下面是代码的详细解释:

主要功能

signal.signal(signal.SIGTERM, handle_shutdown)signal.signal(signal.SIGINT, handle_shutdown)

服务器启动

uvicorn.run(    "src.server:app",    host=args.host,    port=args.port,    reload=reload,    log_level=args.log_level,)

总结

到此DeerFlow老顾介绍了工程方面的一些技术点,一些信息是值得我们学习的,尤其我们对Python工程化不是太熟悉的小伙伴。

整个DeerFlow的开源项目的介绍,这里就全部介绍完了。希望可以帮助小伙伴们学习,谢谢大家!!!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

DeerFlow Python工程化 pyproject.toml FastAPI SSE 日志装饰器 uvicorn
相关文章