第 1 篇:项目起点——《从零搭建企业级 LLM 应用》

系列记录:《从零搭建企业级 LLM 应用》,这是第 1 篇
下一篇:框架选型——LangChain、LangGraph、CrewAI


为什么开始写这个

我想通过搭建一个给企业用的知识库智能助手的小项目,来学习搭建智能体的全工作流程、框架等。

这些记录是我自己复盘用的,也顺便整理成文。不是教程,就是我在这个过程中的思考、纠结和踩坑。


初步想法

最开始的规划比现在大不少,为了能逐步推进和实现,于是开始做减法。

  • 知识库检索问答——“公司的财务报销流程是什么?”
  • 基于企业相关 Excel 数据进行数据统计——“上个月各部门考勤异常统计”
  • 能帮忙写报告——“根据知识库相关文件帮我写一份季度工作总结”

初步架构设计

初步架构分层图:

L1  用户界面层    Streamlit(Web 页面)
L2  网关层       登录认证 · 角色权限 · 操作日志
L3  智能体层     一个路由器 + 三个 Agent
L4  基础设施     知识库检索 · 代码沙箱 · LLM · 数据库

每层之间定好接口之后,各层之间互不干扰,便于开发过程中定位问题。


选技术栈的几个决定

SQLite——就一个文件,省事

  • SQLite:轻量级嵌入式数据库,数据库就是一个文件,零配置,适合单机、低并发、移动端或原型项目。

  • PostgreSQL:企业级全功能数据库,支持高并发、复杂查询、大规模数据、多用户协作,适合生产环境后端系统。

考虑到SQLite的轻量级,以及对数据库的需求不大,所以选了SQLite

Streamlit——纯 Python,不用写前端

为了快速搭建项目,先将智能体核心形成闭环,故暂时选择了能够快速搭建前端的 Streamlit。Streamlit 的好处是写 Python 就是在写页面。打算后续再用其他前端框架做,不过暂时还没想好选择什么框架合适。

if st.button("登录"):
    user = authenticate_user(username, password)
    ...

一行代码就是一个按钮、一个输入框。Streamlit的缺点是每次点击重跑整个脚本的模型,所有状态必须手动管理。后面踩了不少相关的坑,留到第 6 篇再说。

Qwen——中文处理好,且便宜

Qwen对中文文档的处理效果还是不错的,比同价位的 GPT-3.5 好一些。而且 qwen-plus 的定价不贵…新人还有不少免费额度

还有一个细节——我在代理层用的是 ChatOpenAI,Qwen 的 API 兼容 OpenAI 格式。这意味着如果哪天想换模型,改一行 base_url 就行。甚至我在代码里留了一段注释掉的 Ollama 本地部署配置,外网挂了可以直接切本地模型。


数据库:初步建了 4 张表

users        -- 用户名、密码哈希(bcrypt)、角色(admin/user)
audit_logs   -- 谁、什么时间、做了什么操作
conversations -- 对话列表
messages     -- 每条消息的内容、所属对话、推理步骤

几点小设计:

  • 密码存 bcrypt 哈希,不存明文,泄漏了也解不开
  • 禁用账号用 is_active=0 而非物理删除,保留审计记录
  • 登录失败不区分"用户名不存在"还是"密码错误",防止被暴力枚举

认证:两级角色,简单够用

admin   → 全部功能 + 管理后台
user    → 问答 + 数据 + 写文档

审计日志:记录所有操作

每次登录、对话、管理操作都自动写入审计日志,管理员后台可以按用户名、操作类型、日期筛选查询。


一些记录

每个模块都是"先跑通 → 再优化"。第一版不追求完美,跑起来发现问题再针对性修。

实际上第一版代码只有一个 agent.py 文件,所有逻辑都塞在一起。是在不断重构中,才慢慢分出 core/、agents/、rules/、data/ 这些目录的。先跑通再整理,比一开始就追求整洁高效得多。


下一篇记录:框架选型——LangChain、LangGraph、CrewAI

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐