ToApp
15.35M · 2026-03-23
想入门AI Agent开发,先要了解一下LLM/RAG/Agent的技术路线: LLM/RAG/Agent已经成为人工智能领域进步的关键技术理解这三者的概念与关系是做好面向AI编程开发的基础。
| 大模型(LLM) | 索引增强搜索(RAG) | 智能体(Agent) | |
|---|---|---|---|
| 定义 | 大型语言模型(LLM),如GPT系列、BERT等,是利用大量文本数据训练的模型,能够生成连贯的文本、理解语言、回答问题等。 | 检索增强生成技术结合了传统的信息检索技术和最新的生成式模型。它先从一个大型的知识库中检索出与查询最相关的信息,然后基于这些信息生成回答。 | 智能体是指具有一定智能的程序或设备,能够感知环境并根据感知结果做出响应或决策的实体。它们可以是简单的软件程序或复杂的机器人。 |
| 作用 | LLM作为基础技术,提供了强大的语言理解和生成能力,是构建复杂人工智能系统的基石。 | RAG可以视为在LLM基础上的扩展或应用,利用LLM的生成能力和外部知识库的丰富信息来提供更准确、信息丰富的输出。 | 智能体可以利用LLM进行自然语言处理,通过RAG技术获得和利用知识,以在更广泛的环境中做出决策和执行任务。它们通常位于应用层级,是对LLM和RAG技术在特定环境下的集成和应用。 |
一个AIAgent应用涵盖了LLM、记忆、工具、Prompt、规划、知识库、执行者等模块,但每个应用的流程又比较接近,对开发者和非开发者都不友好。
有没有一个平台,能在可视化界面通过鼠标拖拽对应的模块+提示词等内容,就可以让无编程基础的人也可以快速创建一个AlAgent应用并调试部署?
LLMOps 是一个基于LLM的应用程序的生命周期管理平台或者工具,涵盖了LLM应用的开发、部署、配置、运维。LLMOps的旨在简化和优化LLM应用程序的各个环节以确保LLM应用高效、可靠和安全地运行。
LLMOps对使用者友好,极大降低了企业创建AI Agent应用的成本, 把复杂的部分留给了LLMOps开发者。
| 步骤 | 未使用LLMOps平台 | 使用LLMOps平台 | 时间差异 |
|---|---|---|---|
| 开发应用前&后端 | 集成和封装LLM能力,花费较多时间开发前端应用 | 直接使用LLMOps的后端服务,可基于开放API、WebApp直接开发 | -80% |
| 提示工程 | 仅能通过API或Playground进行 | Prompt可视化编排,所见即所得完成调试 | -25% |
| 数据准备与嵌入 | 编写代码实现长文本数据处理、嵌入 | 在LLMOps平台上传文本、文件 | -80% |
| 应用日志与分析 | 编写代码查看日志,访问数据库查看 | 平台提供实时日志与分析 | -70% |
| AI插件开发与集成 | 编写代码创建、集成AI插件 | 平台提供可视化工具创建、快速集成自定义插件能力 | -50% |
| AI工作流开发 | 编写代码完成每一个工作流 | 可视化编排工作流,所见即所得调试 | -80% |
不使用LLMOps 整理需求、Prompt编写、部署LLM、对接LLM接口、处理应用数据、记录日志、应用工具开发、AI工作流开发、前后端交互开发、前后端部署。
使用LLMOps:需求整理、Prompt编写、上传数据、勾选关联插件、可视化编排工作流、选择LLM模型、发布。
1.表示层:面向用户与生态
2. 接入层:流量入口与安全
3. 控制层:业务编排与权限
4. 服务层:原子化能力输出
5. 核心层:大模型与 Agent 引擎
6. 存储层:多模数据统一管理
7. 资源层:基础设施与弹性算力
1. 分层解耦,团队可分工
2. 生产级工程化能力
3. 天生适配 LLM 应用痛点
4. 极强扩展性
5. 安全与合规可控
使用 Flask+DeepSeek+Postgres封装一个简单对话的机器人,首先要接入那个大模型都要先注册一个用户,创建一个应用,会有唯一的一个API_KEY进行网络通信,一个粗糙的开始就是一个好的开始,万丈高楼平地起~
1.虚拟环境
python-m venv env 命令在Python 2.7+或Python 3.3+以上可以使用。# 创建虚拟环境 (env)是当前的虚拟环境
PS E:pythonProjectllmopsllmops-api> python -m venv env
PS E:pythonProjectllmopsllmops-api> .envScriptsactivate
(env) PS E:pythonProjectllmopsllmops-api> deactivate
PS E:pythonProjectllmopsllmops-api>
2.配置国内 PyPI 加速I器
命令行配置(Windows/macOS/Linux 通用), 激活虚拟环境后执行 pip config set global.index-url
(env) PS E:pythonProjectllmopsllmops-api> pip config set global.index-url
Writing to C:Users15117AppDataRoamingpippip.ini
(env) PS E:pythonProjectllmopsllmops-api> pip config list
global.index-url='https://mirrors.cloud.tencent.com/pypi/simple/'
3.Postgres数据库
可以直接去官网下载安装客户端,支持Linux、Mac、Windows,安装的过程中有两个目录特别重要,一个是安装目录里面包含了很多应用程序,一个目录是数据储存的目录。
#
D:Program Files (x86)PostgreSQL16bin
D:Program Files (x86)PostgreSQL16data
可以让AI帮我写一个Windows的启动/停止的.bat脚本,脚本如下(亲测可用):启动脚本 start_postgres.bat
@echo off
chcp 65001 > nul
title PostgreSQL 16 启动脚本
:: 设置PostgreSQL的路径
set "PG_BIN=D:Program Files (x86)PostgreSQL16bin"
set "PG_DATA=D:Program Files (x86)PostgreSQL16data"
:: 切换到bin目录
cd /d "%PG_BIN%"
:: 检查是否以管理员身份运行
net session >nul 2>&1
if %errorLevel% neq 0 (
echo 请以管理员身份运行此脚本!
pause
exit /b 1
)
echo 正在启动PostgreSQL 16...
pg_ctl.exe start -D "%PG_DATA%" -w
:: 检查启动结果
if %errorLevel% equ 0 (
echo PostgreSQL 16 启动成功!
) else (
echo PostgreSQL 16 启动失败,请检查日志或路径是否正确!
)
pause
单独的停止脚本(stop_postgres.bat)
@echo off
chcp 65001 > nul
title PostgreSQL 16 停止脚本
:: 设置PostgreSQL的路径
set "PG_BIN=D:Program Files (x86)PostgreSQL16bin"
set "PG_DATA=D:Program Files (x86)PostgreSQL16data"
:: 切换到bin目录
cd /d "%PG_BIN%"
:: 检查是否以管理员身份运行
net session >nul 2>&1
if %errorLevel% neq 0 (
echo 请以管理员身份运行此脚本!
pause
exit /b 1
)
echo 正在停止PostgreSQL 16...
pg_ctl.exe stop -D "%PG_DATA%" -m fast -w
:: 检查停止结果
if %errorLevel% equ 0 (
echo PostgreSQL 16 停止成功!
) else (
echo PostgreSQL 16 停止失败,请检查服务是否正在运行!
)
pause
我使用的是Flask框架进行实践,再实践之前我已经在Deepseek应用平台创建了应用生成了key值,敏感的配置信息,一般生成在根目录下的.env文件中,这已经是很多程序员的共识。
1.加载.env 文件,实现配置文件分离
在Python项目中,如果想将.env文件的信息加载成环境变量,可以使用python-dotenv库,通过os.getenv即可获取在环境变量中的配置信息,将代码与配置分离,方便后期维护。
# 安装
# pip install python-dotenv
# 加载
import dotenv
dotenv.load_dotenv()
2. Flask-wtf 参数安全校验
# pip install -U Flask-WTF
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Length
class CompletionRequest(FlaskForm):
""" 基础聊天参数校验 """
query = StringField('query', validators=[
DataRequired(message="用户的提问是必填"),
Length(min=1, max=1000, message="用户的提问长度不能超过1000")
])
3. 响应接口设计与实现
先定义一个枚举字典HttpCode类,封装统一的输入输出,其实就是统一的结构体,封装完统一的输出如下:
{
"code": "success",
"data": {
"description": "这是一个简单的Deepseek对话的测试机器人",
"id": "cab840dc-29c1-4f8d-b2eb-b792a7f1235a",
"name": "划水鸭AI聊天机器人"
},
"message": ""
}
python的代码简单如下:
from enum import Enum
class HttpCode(str, Enum):
SUCCESS = 'success' # 成功
FAIL = 'fail' # 失败
class Response:
code: HttpCode = HttpCode.SUCCESS
message: str = ""
data: Any = field(default_factory=dict)
def json(data: Response = None):
return jsonify(data), 200
def success_json(data: Any = None):
return json(Response(code=HttpCode.SUCCESS, message="", data=data))
4. 异常处理
也是同样的道理,对于项目中的错误处理和异常也统一处理
class CustomException(Exception):
code: HttpCode = HttpCode.FAIL
message: str = ""
data: Any = field(default_factory=dict)
def __init__(self, message: str = None, data: Any = None):
super().__init__()
self.message = message
self.data = data
class FailException(CustomException):
pass
class NotFoundException(CustomException):
code = HttpCode.NOT_FOUND
5. PyTest测试用例
Pytest是一个功能强大且易于使用的Python测试框架,用于编写和运行“单元测试“用例、集成测试和功能测试,对比 unitest框架,Pytest的优势非常明显:
pip install pytest
pytest会递归查找当前目录及子目录下的所有以test开始或者_test结尾的Python脚本,执行其中符合规则的函数和方法,不需要显 示调用,在Pytest中,基础的配置可以放在 pytest.ini配置文件中,格式如下:
[pytest]
# pytest cache
cache_dir = tmp/.pytest_cache
# pytest options
addopts = -v -s
2.fixture 设置测试环境
import pytest
from app.http.app import app
@pytest.fixture
def client():
"""获取Flask应用的测试应用,并返回"""
app.config["TESTING"] = True
with app.test_client() as client:
yield client
3.参数化测试,调用方法:
import pytest
from pkg.response import HttpCode
class TestAppHandler:
@pytest.mark.parametrize("query", [None, "你好,你是谁?"])
def test_completion(self, query, client):
resp = client.post("/app/completion", json={"query": query})
assert resp.status_code == 200
if query is None:
assert resp.json.get("code") == HttpCode.VALIDATE_ERROR
else:
assert resp.json.get("code") == HttpCode.SUCCESS
pytest 执行结果:
(env) PS E:pythonProjectllmopsllmops-apitest> pytest -v -s
=========================== test session starts ===========================
platform win32 -- Python 3.10.11, pytest-9.0.2, pluggy-1.6.0 -- E:pythonProjectllmopsllmops-apienvScriptspython.exe
cachedir: tmp.pytest_cache
rootdir: E:pythonProjectllmopsllmops-api
configfile: pytest.ini
plugins: anyio-4.12.1
collected 2 items
internalhandlertest_app_handler.py::TestAppHandler::test_completion[None] PASSED
internalhandlertest_app_handler.py::TestAppHandler::test_completion[u4f60u597duff0cu4f60u662fu8c01uff1f] PASSED
=========================== 2 passed in 6.08s ===========================
4.Flask_SQLAlchemy 数据操作
# pip install flask-sqlalchemy psycopg2
#SQLAlchemy数据库配置
SQLALCHEMY_DATABASE_URI=postgresql://user:password@127.0.0.1:5432/llmops?client_encoding=utf8
SQLALCHEMY_POOL_SIZE=30
SQLALCHEMY_POOL_RECYCLE=3600
SQLALCHEMY_ECHO=True
5.项目的实践步骤
项目的加载流程和步骤:
1、加载根目录下的.env文件,读取敏感配置
2、Injector是全局加载的依赖注入库
3、加载路由Router,Flask的路由蓝图完成,注册到蓝图中
4、SQLAlchemy 在启动Http服务的时候自动加载了
import dotenv
from pkg.sqlalchemy import SQLAlchemy
from injector import Injector
from app.http.module import ExtensionModule
from internal.router import Router
from internal.server import Http
from config import Config
dotenv.load_dotenv()
conf = Config()
injector = Injector([ExtensionModule])
app = Http(__name__, conf=conf, db=injector.get(SQLAlchemy), router=injector.get(Router))
if __name__ == '__main__':
app.run(debug=True)
至此,一个接入Deepseek简单的聊天机器人就已经运行起来了,有需要源码的小伙伴可以私聊我,一起加油~