01-从0到1:构建企业级AI Agent框架的完整思路

48 阅读6分钟

从0到1:构建企业级AI Agent框架的完整思路

前言

在AI大模型时代,企业面临着如何将AI能力与自身业务深度结合的挑战。本文将分享我们从0到1构建企业级AI Agent框架的完整思路,涵盖技术选型、架构设计、核心功能实现等方面。

适合读者: 后端开发、AI应用开发者、技术架构师


一、项目背景与痛点

1.1 企业AI应用的核心痛点

在调研了多家企业的AI应用需求后,我们发现了以下核心痛点:

  1. 数据隐私问题 - 企业不愿将私有数据发送到第三方API
  2. 定制化困难 - 通用AI无法理解企业专有知识
  3. 配置复杂 - 现有AI框架对非技术人员不友好
  4. 成本高昂 - API调用费用随着使用量线性增长
  5. 无法二次开发 - 闭源方案难以满足个性化需求

1.2 我们的解决方案

基于这些痛点,我们设计了一套完整的企业级AI Agent框架:

核心特性:
✅ 本地化部署 - 数据不出企业内网
✅ RAG检索增强 - 让AI理解企业知识库
✅ 开源可定制 - 完全可二次开发
✅ 零API成本 - 使用本地大模型
✅ 流式交互 - 实时对话体验

二、技术架构设计

2.1 三层架构

我们采用经典的三层架构,职责清晰、易于扩展:

┌─────────────────────────────────────────────────────┐
│                  Frontend Layer                      │
│          Next.js + React + TailwindCSS              │
│              (用户交互界面)                           │
└──────────────────┬──────────────────────────────────┘
                   │ HTTP/SSE
                   ▼
┌─────────────────────────────────────────────────────┐
│                  Server Layer                        │
│        FastAPI + PostgreSQL + Redis + JWT           │
│         (业务逻辑、认证、数据管理)                     │
└──────────────────┬──────────────────────────────────┘
                   │ HTTP/SSE
                   ▼
┌─────────────────────────────────────────────────────┐
│                   Agent Layer                        │
│      LangChain + Ollama + Weaviate + Pandas         │
│         (AI推理、向量检索、知识库)                     │
└─────────────────────────────────────────────────────┘

2.2 技术栈选型

层级技术栈选型理由
前端Next.js 13SSR支持、优秀的开发体验
前端TailwindCSS快速构建现代化UI
前端TypeScript类型安全、减少运行时错误
后端FastAPI高性能异步框架、自动API文档
后端PostgreSQL成熟的关系型数据库
后端Redis高性能缓存、会话管理
AI层LangChain完整的RAG工具链
AI层Ollama本地LLM部署、保护隐私
AI层Weaviate高性能向量数据库
AI层Pandas数据清洗与处理

##三、核心功能实现

3.1 RAG检索增强生成

RAG是让AI理解企业知识的关键技术:

# 数据处理流程
CSV数据 → Pandas清洗 → 文本分块 → 向量化 → Weaviate存储

# 问答流程
用户问题 → 向量化 → 相似度检索 → 组装Prompt → LLM生成答案

核心代码示例:

from langchain_community.vectorstores import Weaviate
from langchain_community.embeddings import OllamaEmbeddings

# 1. 初始化向量模型
embeddings = OllamaEmbeddings(
    model="nomic-embed-text",
    base_url="http://localhost:11434"
)

# 2. 连接向量数据库
vectorstore = Weaviate(
    client=weaviate_client,
    index_name="ServiceTickets",
    text_key="content",
    embedding=embeddings
)

# 3. 相似度检索
def search_similar_tickets(question: str, k: int = 5):
    """检索相似的客服工单"""
    docs = vectorstore.similarity_search(question, k=k)
    return docs

3.2 流式对话实现

使用SSE(Server-Sent Events)实现实时打字机效果:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse

@app.post("/chat/stream")
async def chat_stream(question: str):
    """流式问答接口"""
    
    async def event_generator():
        # 1. 思考状态
        yield f"event: thinking\ndata: {json.dumps({'status': 'retrieving'})}\n\n"
        
        # 2. 检索相关文档
        docs = search_similar_tickets(question)
        yield f"event: sources\ndata: {json.dumps({'count': len(docs)})}\n\n"
        
        # 3. 流式生成答案
        async for chunk in llm.astream(prompt):
            yield f"event: token\ndata: {json.dumps({'token': chunk})}\n\n"
        
        # 4. 完成
        yield f"event: done\ndata: {json.dumps({'status': 'completed'})}\n\n"
    
    return StreamingResponse(
        event_generator(),
        media_type="text/event-stream"
    )

3.3 JWT双Token认证

实现安全的无状态认证:

from jose import jwt
from datetime import datetime, timedelta

# Access Token: 30分钟有效期
access_token = jwt.encode(
    {
        "user_id": user.id,
        "exp": datetime.utcnow() + timedelta(minutes=30),
        "type": "access"
    },
    SECRET_KEY,
    algorithm="HS256"
)

# Refresh Token: 7天有效期
refresh_token = jwt.encode(
    {
        "user_id": user.id,
        "exp": datetime.utcnow() + timedelta(days=7),
        "type": "refresh"
    },
    SECRET_KEY,
    algorithm="HS256"
)

四、数据流转全流程

4.1 完整的问答流程

1. 用户输入问题
   ↓
2. Frontend发送SSE请求到Server
   ↓
3. Server转发到Agent层
   ↓
4. Agent将问题向量化
   ↓
5. Weaviate检索相似文档(Top-K)
   ↓
6. 组装Prompt模板
   ↓
7. Ollama LLM流式生成答案
   ↓
8. 逐Token返回到Frontend
   ↓
9. 前端实时渲染(打字机效果)

4.2 数据导入流程

import pandas as pd
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 1. 读取CSV数据
df = pd.read_csv("service_tickets.csv")

# 2. 数据清洗
df = df.dropna()  # 删除空值
df['content'] = df['title'] + "\n" + df['description']

# 3. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_text(df['content'])

# 4. 向量化并存储到Weaviate
vectorstore.add_texts(chunks)

五、架构优势

5.1 本地化部署的价值

对比项云端API本地部署
数据安全❌ 数据上传到第三方✅ 数据不出内网
成本❌ 按Token计费✅ 一次性硬件成本
定制化❌ 无法微调模型✅ 可自定义模型
响应速度❌ 受网络影响✅ 本地毫秒级
可用性❌ 依赖第三方服务✅ 完全自主可控

5.2 三层架构的扩展性

Frontend层:可替换为移动端、桌面端
   ↓
Server层:可横向扩展、负载均衡
   ↓
Agent层:可接入多个AI模型、多个知识库

六、实际应用场景

6.1 智能客服系统

场景:企业客服知识库问答
数据源:历史工单CSV(10万+条)
效果:秒级响应、准确率85%+

6.2 电商导购助手

场景:商品推荐与文案生成
数据源:商品信息、用户评价
效果:个性化推荐、自动生成营销文案

6.3 企业知识库

场景:内部文档检索与问答
数据源:技术文档、操作手册
效果:新员工培训效率提升50%

七、性能指标

基于实际测试数据:

指标数值
问答响应时间平均2-3秒
向量检索速度<100ms
并发支持100+ QPS
知识库容量支持百万级文档
部署成本单台服务器(16核32G)

八、踩坑经验

8.1 向量化模型选择

错误做法: 使用OpenAI Embedding API

  • 问题:数据上传到第三方、成本高

正确做法: 使用Ollama本地Embedding模型

embeddings = OllamaEmbeddings(model="nomic-embed-text")

8.2 SSE流式传输

错误做法: 使用WebSocket

  • 问题:需要维护连接状态、复杂度高

正确做法: 使用SSE

headers = {
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "X-Accel-Buffering": "no"  # 关键:禁用Nginx缓冲
}

8.3 数据清洗

错误做法: 直接导入原始CSV

  • 问题:脏数据影响检索质量

正确做法: 使用Pandas清洗

df = df.dropna()  # 删除空值
df = df.drop_duplicates()  # 去重
df['content'] = df['content'].str.strip()  # 去除空格

九、未来规划

  1. 多模态支持 - 支持图片、语音输入
  2. Agent编排 - 支持多Agent协作
  3. 模型微调 - 基于企业数据微调模型
  4. 可视化配置 - 无代码配置知识库
  5. MCP协议支持 - 接入标准AI协议

十、总结

本文介绍了从0到1构建企业级AI Agent框架的完整思路:

三层架构 - 职责清晰、易于扩展
本地化部署 - 保护数据隐私、降低成本
RAG技术 - 让AI理解企业知识
流式交互 - 提升用户体验
开源可定制 - 满足个性化需求

下一篇预告: 《三层架构设计:前端+业务+AI层的职责划分》


参考资源

技术文档:


作者简介: 资深开发者,创业者。专注于视频通讯技术领域。国内首本Flutter著作《Flutter技术入门与实战》作者,另著有《Dart语言实战》及《WebRTC音视频开发》等书籍。多年从事视频会议、远程教育等技术研发,对于Android、iOS以及跨平台开发技术有比较深入的研究和应用,作为主要程序员开发了多个应用项目,涉及医疗、交通、银行等领域。

学习资料:

欢迎交流: 如有问题欢迎在评论区讨论 🚀