系统需要 4 个阶段:
① 文件上传(Upload)
用户把 PDF、DOCX、TXT 等文件上传到 Django 后端。
后端做的事情:
-
接收文件 (
request.FILES["file"]) -
保存到服务器本地目录:
/your_project/uploads/ -
调用 process_file() 解析文件内容
-
PDF 用 PyPDF2
-
DOCX 用 python-docx
-
TXT 用 open()
-
-
把解析出的文本送入向量数据库(如 ChromaDB)
你现在的问题是 process_file 没有调用 → 必须在上传成功后调用它。
② 文档拆分 + 向量化(Embed)
读取到的文档要:
✔ 拆分成小段(chunk)
1 段大约 300~500 字。
✔ 每段生成 embedding 向量
使用:
model = SentenceTransformer("all-MiniLM-L6-v2")
✔ 存储到 Chroma DB
格式类似:
| segment_id | text | embedding |
|---|---|---|
| doc1-1 | "第一段 ..." | [0.21, ...] |
| doc1-2 | "第二段 ..." | [...] |
你现在代码中已经初始化好了 Chroma,只需要在上传文件解析后调用:
collection.add(
documents=[chunk1, chunk2, ...],
ids=["doc1-1", "doc1-2", ...]
)
③ 用户输入问题(Query)
前端发 POST 请求给:
/send_message/
后端做两件事:
✔ 3.1 语义搜索(Retrieve)
例如:
results = collection.query(query_texts=[user_question], n_results=3)
得到最相关的 2~3 条文档片段。
✔ 3.2 拼接上下文(Context)
context = "\n".join(results["documents"][0])
④ 生成回答(Generate)
将用户原问题 + 文档上下文发给大模型:
Prompt 示意:
你是一个图书问答助手。以下是从文档中检索的相关内容:
{context}
根据这些内容回答用户的问题:{query}
模型返回的 answer 发给前端。
🔥 整个系统流程图(简化)
用户上传文件
↓
Django后端接收文件
↓
process_file()
↓
文档拆分 + 向量化
↓
存入 Chroma DB
↓
============================
用户提问
============================
↓
Retrieve(语义搜索)
↓
返回最相关文档片段
↓
拼接 Prompt + 文档
↓
大模型生成回答
↓
返回答案给前端
⭐ 为你总结成一句话:
上传文件 → 文档解析 → 向量数据库存储 → 用户提问 → 检索相关文档 → 大模型基于文档回答问题。