别再只会调大模型了:用 Python 搭一套自己的知识库问答系统(RAG 实战指南)

简介: 别再只会调大模型了:用 Python 搭一套自己的知识库问答系统(RAG 实战指南)

别再只会调大模型了:用 Python 搭一套自己的知识库问答系统(RAG 实战指南)

大家好,我是 Echo_Wish。

这两年很多人玩大模型,张口就是“接个 API 就行”。
但真正落地的时候你会发现一个残酷现实:

大模型很聪明,但它对你公司的资料一无所知。

你让它回答:

  • 公司内部规范?
  • 产品技术白皮书?
  • 项目历史文档?
  • 你的博客沉淀?

它只能开始“编”。

这时候,RAG(Retrieval-Augmented Generation)就登场了。

今天我带你从 0 开始,用 Python 搭一个自己的知识库问答系统。
不整虚的,直接实战。


一、RAG 到底是什么?一句话讲明白

RAG = 检索 + 大模型生成。

流程非常简单:

用户问题
   ↓
向量检索(从知识库找相关内容)
   ↓
把检索结果拼进 prompt
   ↓
交给大模型生成答案

也就是说:

模型负责“说话”,知识库负责“内容”。

你不给模型资料,它只能瞎猜;
你给它精准资料,它就能像专家一样回答。


二、系统整体架构长什么样?

先看一个简化版结构图:

核心组件就四块:

  1. 文档加载
  2. 文本切块
  3. 向量化(Embedding)
  4. 向量检索 + LLM 生成

我们一步步来。


三、第一步:准备文档

假设我们有一堆 Markdown / PDF / TXT 文档。

先装几个依赖:

pip install langchain faiss-cpu sentence-transformers openai

四、第二步:文档切块(Chunking)

很多人忽略这一点。

如果你把整本 PDF 一次性 embedding,
检索效果会差得离谱。

正确做法是:切块。

from langchain.text_splitter import RecursiveCharacterTextSplitter

text = open("knowledge.txt", "r", encoding="utf-8").read()

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100
)

docs = splitter.create_documents([text])

print("切块数量:", len(docs))

为什么要 overlap?

因为语义是连续的,
你不做重叠,信息会断层。


五、第三步:生成向量(Embedding)

Embedding 是 RAG 的灵魂。

我们用 sentence-transformers 举例:

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer("all-MiniLM-L6-v2")

texts = [doc.page_content for doc in docs]
embeddings = model.encode(texts)

print("向量维度:", embeddings.shape)

此时,每个文本块都变成了一个向量。

这就是“语义表示”。


六、第四步:构建向量数据库

这里我们用 FAISS。

import faiss

dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)

index.add(np.array(embeddings))

print("向量库大小:", index.ntotal)

现在你已经有了一个可搜索的知识库。


七、第五步:实现检索

当用户提问时:

query = "公司数据库怎么做备份?"

query_vec = model.encode([query])

D, I = index.search(np.array(query_vec), k=3)

for idx in I[0]:
    print("命中内容:", texts[idx])

这一步会返回最相关的 3 段文本。

注意:

RAG 的好坏,80% 在检索。

如果检索错了,后面再强的大模型都没用。


八、第六步:交给大模型生成答案

把检索到的内容拼进 prompt:

import openai

context = "\n".join([texts[i] for i in I[0]])

prompt = f"""
基于以下资料回答问题:

{context}

问题:{query}
"""

response = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[{
   "role": "user", "content": prompt}]
)

print(response["choices"][0]["message"]["content"])

此时,大模型不是“猜”,
而是“基于资料回答”。

这就是 RAG 的核心价值。


九、做成一个简单问答系统

我们封装一下:

def ask_question(query):
    query_vec = model.encode([query])
    D, I = index.search(np.array(query_vec), k=3)

    context = "\n".join([texts[i] for i in I[0]])

    prompt = f"""
    基于以下资料回答问题:
    {context}
    问题:{query}
    """

    response = openai.ChatCompletion.create(
        model="gpt-4o-mini",
        messages=[{
   "role": "user", "content": prompt}]
    )

    return response["choices"][0]["message"]["content"]

你已经拥有一个基础知识库问答系统。


十、真实落地要注意什么?

说点真话。

很多人做 RAG 做着做着发现:

  • 检索不准
  • 答案乱拼
  • 重复内容多
  • 上下文不连贯

这时候你要做三件事:

1️⃣ 优化切块策略

不是固定 500 字就完事。
有时候按标题切更好。

2️⃣ 用更强的 Embedding 模型

Embedding 决定检索质量。

3️⃣ 做 rerank

可以再加一层排序模型,提升命中质量。


十一、我的一点感受

我自己做过很多 RAG 项目。

最大的误区是:

把 RAG 当成“接 API”。

其实它更像一个“搜索系统 + 提示工程”的融合体。

你需要理解:

  • 向量空间
  • 语义相似度
  • Prompt 结构
  • 数据治理

RAG 做得好,是企业级生产力工具。
做得不好,就是一个高级“拼接器”。


十二、未来怎么玩?

再往前一步,可以加:

  • 多知识库路由
  • 权限控制
  • 实时更新
  • 增量向量索引
  • Agent 自动调用

RAG 不是终点。

它是企业智能化的入口。


结尾

如果你还没做过 RAG,我建议你一定动手试一次。

当你第一次看到模型准确引用你自己的文档回答问题时——

那种感觉,就像你亲手造了一个“会读书的助理”。

目录
相关文章
|
2月前
|
人工智能 搜索推荐 数据库
从零搭建RAG系统:原理剖析+代码实践,解锁大模型“记忆力”新姿势
RAG(检索增强生成)为大模型配备“外接大脑”,通过连接专属知识库,提升回答准确性。广泛应用于医疗、法律、客服等领域,兼具专业性与可解释性。本文详解其原理、实战步骤与优化技巧,助你快速构建个性化AI助手。
1045 11
|
24天前
|
自然语言处理 PyTorch 算法框架/工具
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
360 10
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
|
4天前
|
人工智能 Linux API
阿里云/本地 OpenClaw 多 Agent 协作系统完全构建指南:八大智能体架构+Obsidian联动+常见问题解答
传统单Agent智能体存在明显局限:任务混杂、上下文冲突、专业度不足、记忆混乱、难以长期进化。OpenClaw支持的**多Agent协同架构**,可以将AI拆分为一组分工明确、独立记忆、各司其职的“脑区”,通过统一调度中心实现规划、分析、创作、构建、审查、检索、学习全流程闭环。再结合Obsidian知识库实现外部记忆托管,可构建一套**可生长、可协作、可管控、可沉淀**的私有AI系统。
166 4
|
存储
ClickHouse物化视图
ClickHouse物化视图
891 1
|
1月前
|
数据采集 供应链 物联网
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
268 3
|
2月前
|
存储 人工智能 Java
用 AgentScope Java 开家 AI 奶茶店
开一家 AI 奶茶店,让 AgentScope Java 替你打理一切。
854 24
|
1月前
|
存储 数据采集 人工智能
未来三年的核心竞争力:构建你的专属智能体
未来三年核心竞争力在于构建专属智能体——它不仅是工具,更是具备主动推理、长期记忆、多模态执行与社交协作能力的“第二大脑”。通过私有化部署、Agent集群编排与API生态接入,学生可实现人机深度协同,在职场与教育中赢得先机。(239字)
301 4
|
28天前
|
JSON 自然语言处理 数据格式
别再“随缘提问”了:聊聊 LLM 的 Prompt Design,怎么把大模型调教得更靠谱?
别再“随缘提问”了:聊聊 LLM 的 Prompt Design,怎么把大模型调教得更靠谱?
196 4
|
8天前
|
SQL 机器学习/深度学习 人工智能
从 NL2SQL 到本体论智能问数:为什么复杂企业数据问答需要新的方法
当“大模型+数据问答”成智能化入口,真正难点不在NL2SQL,而在理解业务对象、关系、口径与动作。本文剖析传统方法的天花板,提出以本体论构建业务语义层——将问数从“查表工具”升维为“决策基础设施”,揭示UINO等厂商通过ABC(Acquire-Build-Compute)范式,推动智能问数迈向可持续演进的语义底座。
|
25天前
|
Serverless
阿里云产品二月刊来啦
千问 Qwen3.5-Plus 重磅登场,百炼 Coding Plan 支持多款开闭源模型,桌面 Agent 工具 CoPaw 开源,函数计算 AgentRun 重磅上线知识库功能|产品二月刊
299 6