检索增强生成(RAG)入门指南:构建知识库与LLM协同系统

检索增强生成(RAG)初学者指南

大语言模型(LLM)使我们能够高效、可靠且快速地处理大量文本数据。过去两年最流行的应用场景之一就是检索增强生成(Retrieval-Augmented Generation, RAG)。

RAG允许我们获取若干文档(从几个到数十万个),创建文档知识库,然后进行查询并基于文档获得带有相关来源的答案。相比需要耗时数小时甚至数天的手动搜索,我们只需几秒延迟就能让LLM完成搜索。

云端部署 vs 本地部署

构建RAG系统包含两个核心部分:知识数据库和LLM。前者如同图书馆,后者则像高效的图书管理员。

创建此类系统的首要决策是选择云端还是本地部署。本地部署在大规模时具有成本优势,同时能更好保障隐私;而云端方案则启动成本低且几乎无需维护。为清晰演示RAG概念,本指南将采用云端部署方案,但文末会补充本地部署的注意事项。

知识(向量)数据库

首先需要创建知识数据库(技术上称为向量数据库)。具体方法是通过嵌入模型处理文档,为每个文档生成向量。嵌入模型擅长理解文本,生成的向量在向量空间中会使相似文档彼此靠近。

这种特性极其便利,我们通过一个假设组织的四份文档在二维向量空间中的分布来说明:

如图所示,两份人力资源文档被归为一组,且远离其他类型文档。当收到HR相关问题时,我们可以计算该问题的嵌入向量,其结果也会靠近这两份HR文档。

通过简单的欧几里得距离计算,就能匹配最相关的文档提供给LLM回答问题。MTEB排行榜比较了各种嵌入算法,值得注意的是许多开源模型已超越OpenAI等专有供应商。

选择模型时需关注三个指标:总体评分、模型大小和最大token数。模型大小决定加载所需显存和嵌入计算速度;最大token数限制单次嵌入的文本量,大文件可能需要分割处理。注意嵌入模型仅处理文本,PDF需转换格式,图像等富媒体内容需要添加描述(使用AI图像标注模型)或舍弃。

开源本地嵌入模型可通过transformers库运行,OpenAI嵌入模型则需要API密钥。以下是使用OpenAI API创建嵌入和简易基于pickle文件系统的向量数据库的Python代码:

python 复制代码
import os
from openai import OpenAI
import pickle

# 配置OpenAI API密钥
openai = OpenAI(api_key="your_openai_api_key")

# 存放.txt文件的目录
directory = "doc1"
embeddings_store = {}

def embed_text(text):
    """使用OpenAI嵌入模型处理文本"""
    response = openai.embeddings.create(
        input=text,
        model="text-embedding-3-large"  # 成本考量可使用text-embedding-3-small
    )
    return response.data[0].embedding

# 后续文件处理、存储和加载函数...(完整代码见原文)

大语言模型(LLM)集成

构建文档数据库后,创建函数获取查询最相关的3个文档:

python 复制代码
import numpy as np

def get_top_k_relevant(query, embeddings_store, top_k=3):
    """基于欧几里得距离返回最相关的top_k文档"""
    query_embedding = embed_text(query)
    distances = []
    for doc_id, doc_embedding in embeddings_store.items():
        dist = np.linalg.norm(np.array(query_embedding) - np.array(doc_embedding))
        distances.append((doc_id, dist))
    distances.sort(key=lambda x: x[1])
    return distances[:top_k]

最后使用GPT-4o基于检索到的文档生成答案:

python 复制代码
def answer_query_with_context(query, doc_store, embeddings_store, top_k=3):
    """使用GPT-4o基于上下文回答问题"""
    best_matches = get_top_k_relevant(query, embeddings_store, top_k)
    context = ""
    for doc_id, distance in best_matches:
        doc_content = doc_store.get(doc_id, "")
        context += f"--- 文档: {doc_id} (距离: {distance:.4f}) ---\n{doc_content}\n\n"
    
    completion = openai.chat.completions.create(
        model="gpt-4o",
        messages=[...],  # 完整提示工程配置见原文
        temperature=0.7
    )
    return completion.choices[0].message.content

进阶方向

这个直观的RAG实现还有很大优化空间:

  • 使用本地LLM并添加语音支持
  • 采用直接偏好优化(DPO)微调LLM
  • 针对医疗/法律等专业领域微调嵌入模型
  • 大规模应用时选用Pinecone或Milvus等企业级向量数据库
  • 当默认结果不满意时,微调LLM的应答方式
相关推荐
wb043072013 分钟前
阿明的二次创业——从阿明用 AI 开第二家店,看 AI 原生创业的四阶段方法论
大数据·人工智能·架构
Godspeed Zhao3 分钟前
Level 4自动驾驶系统设计0——功能与场景0
人工智能·机器学习·自动驾驶
Dola_Zou6 分钟前
边缘智能的“黑暗森林”:工业 AI 模型下沉的资产防护与变现密码
人工智能·安全·自动化·软件工程·软件加密
青岛前景互联信息技术有限公司7 分钟前
前景互联·新一代智能接处警系统:AI+大模型+Agent智能接处警一体化解决方案
大数据·人工智能·物联网
xin_yao_xin9 分钟前
Claude Code 安装与 DeepSeek-V4 模型配置(2026 最新)
人工智能·ai·大模型·deepseek·claude code
北京软秦科技有限公司9 分钟前
通用零部件来料材质证书智能把关,IACheck搭配AI报告审核通审Agent版比对订单与报告参数
人工智能·材质
Charlotte_jc13 分钟前
ai agent 真实项目开发工程实践
人工智能
CCC:CarCrazeCurator14 分钟前
大模型核心注意力机制技术深度报告:MHA、MQA、GQA 与 MLA 技术原理、性能对比与场景适配
人工智能·机器学习·自动驾驶·transformer
卢卡上学15 分钟前
CodeBuddy 与 WorkBuddy 完整联动方案,研发 + 办公双线提效!
人工智能·腾讯workbuddy·腾讯codebuddy
秋917 分钟前
Python工程师面试常问提问和回答(AI工程化方向 · 2026版)
人工智能·python·面试