【从零到RAG】用Python实现本地AI问答系统(Transformer + FAISS + HuggingFace)In this line of code, minValueIndex is a variable that is assigned the return value of self. searchMin (nums, target). Here, self refers to the instance of the current class, and searchMin is a method of that instance. This method takes two parameters: nums and target.
1.Built a local conversational AI assistant with context memory and retrieval-augmented generation (RAG) using Hugging Face Transformers
🚀 从零实现本地 RAG 系统:Transformer → HuggingFace → 向量检索(完整实战)
📌 一、背景
今天我从 Transformer 基础 出发,逐步完成了一个完整的:
💥 本地 RAG(Retrieval-Augmented Generation)问答系统
整个过程从:
-
手写 Mini Transformer
-
到 Hugging Face 调用大模型
-
再到 FAISS 向量检索
最终实现了:
✅ 基于自定义知识库的智能问答系统(本地运行)
🧠 二、核心知识梳理
1️⃣ Transformer 基础
Transformer 的核心是:
-
Self-Attention(自注意力)
-
Feed Forward Network
-
多层堆叠
在 GPT 类模型中:
❗ 使用 Masked Self-Attention
作用:
👉 防止模型"看到未来",保证自回归生成
2️⃣ GPT vs BERT(关键区别)
| 模型 | 类型 | 能力 |
|---|---|---|
| GPT | Decoder-only | 生成 |
| BERT | Encoder-only | 理解 |
👉 后面做 RAG:
-
BERT → 做 embedding
-
GPT → 做生成
3️⃣ LLM 的本质
Prompt → Transformer → Next Token → Next Token...
👉 所有大模型本质都是:
💥 预测下一个词
🚀 三、从 HuggingFace 开始(真实模型)
我先用:
from transformers import AutoTokenizer, AutoModelForCausalLM
加载模型:
model = AutoModelForCausalLM.from_pretrained("microsoft/phi-2")
实现:
👉 本地文本生成 / 简单聊天
⚠️ 遇到的问题
❌ GPT2 复读问题
原因:
-
GPT2 是"续写模型"
-
不适合问答格式
解决:
Question:
Answer:
或者直接换模型(phi)
🧠 四、RAG 核心思想
传统 LLM:
用户问题 → 模型回答(可能胡说)
RAG:
用户问题 → 检索知识 → 再回答
👉 核心流程:
Query → Embedding → Vector Search → Context → LLM
🔥 五、实现步骤(重点)
1️⃣ 文本 → 向量(Embedding)
使用:
pip install sentence-transformers
代码:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode([
"Machine learning is a field of AI.",
"Transformers use self-attention."
])
2️⃣ FAISS 向量检索
pip install faiss-cpu
import faiss
import numpy as np
index = faiss.IndexFlatL2(384)
index.add(np.array(embeddings))
query_vec = model.encode(["What is transformer?"])
D, I = index.search(np.array(query_vec), 2)
3️⃣ 构建 RAG 系统
核心逻辑:
docs = retrieve(query)
prompt = f"""
Context:
{docs}
Question: {query}
Answer:
"""
4️⃣ 长文本处理(关键升级)
问题:
👉 文档太长,embedding效果差
解决:
👉 chunking(切块)
def chunk_text(text, chunk_size=300, overlap=50):
...
💥 六、最终系统结构
用户问题
↓
Embedding(BERT类)
↓
FAISS 检索
↓
拼接上下文
↓
LLM(phi-2)
↓
回答
🧪 七、效果展示
输入:
What is FAISS?
输出:
FAISS is a library for efficient similarity search.
输入:
What is the difference between BERT and GPT?
输出:
BERT is an encoder-only model, GPT is decoder-only.
🧠 八、关键收获
今天最大的收获不是代码,而是理解:
💥 1. LLM 不等于智能
没有知识 → 会胡说
💥 2. RAG 才是落地关键
检索 + 生成 = 可控 AI
💥 3. Transformer 三大体系
Encoder(理解)→ BERT
Decoder(生成)→ GPT
Encoder-Decoder → T5
🚀 九、下一步计划
-
支持 PDF 文档读取
-
加入多轮对话 memory
-
使用更强 embedding(bge-large)
-
接入向量数据库(Chroma / Pinecone)
🎯 总结
今天从:
Transformer 理论
→ HuggingFace 模型
→ 向量检索
→ RAG系统
完成了一条完整链路。
👉 从"学 AI"迈向"做 AI 系统"。
🔥 一句话总结
💥 RAG = 让大模型"有依据地说话"