你是否想过让 AI 阅读你的文档、网页或数据库,然后回答你提出的问题?这正是 RAG(检索增强生成) 技术要解决的事情。今天这篇文章,我会手把手教你用 LangChain 搭建一套完整的 RAG 流水线,并且接入 HolySheep AI 中转站,让你用国内直连的速度和超低的价格运行自己的知识库问答系统。

文章内容非常基础,即使你从来没写过一行代码,也能跟着做出来。建议准备一台电脑,边看边操作。

一、什么是 RAG?为什么我们需要它?

先来简单理解一下 RAG 是什么。想象一下,你问 AI 一个关于你自己公司产品的问题,但是 AI 根本没学过这些内容,它只能"瞎猜"。为了让 AI 知道正确答案,你需要把相关资料"喂"给它。

RAG 的工作原理是这样的:

这样一来,AI 就能准确回答"我们公司产品有哪些功能"这类私有化问题了。

二、前期准备:注册 HolySheep AI 账号

在开始写代码之前,我们需要一个可以调用的大模型 API。这里推荐使用 立即注册 HolySheep AI,原因很简单:

注册步骤(用文字模拟截图):

图1:打开浏览器访问 holysheep.ai,点击右上角"注册"按钮
图2:输入手机号和验证码,完成账号创建
图3:进入控制台,找到"API Keys"菜单,点击"创建新密钥"
图4:复制生成的 API Key,妥善保存(注意:密钥只显示一次)

💡 提示:把复制的 API Key 放到一个 txt 文件里备用,后面代码里要填入。格式像这样:YOUR_HOLYSHEEP_API_KEY

三、环境搭建:安装 Python 和必要依赖

接下来我们要在电脑上准备好编程环境。

3.1 安装 Python

打开 Python 官网 python.org,点击"Downloads",下载最新版本的 Python。安装时记得勾选"Add Python to PATH"选项,这样后面操作更方便。

安装完成后,按 Win+R 输入 cmd 打开命令行窗口,输入:

python --version

如果显示类似 Python 3.11.x 的版本号,说明安装成功。

3.2 创建项目文件夹

在桌面或任意位置新建一个文件夹,命名为 rag_project。在文件夹里新建一个文件,命名为 requirements.txt,在里面写入需要安装的依赖:

langchain==0.3.0
langchain-community==0.3.0
langchain-huggingface==0.1.0
langchain-chroma==0.1.0
chromadb==0.5.0
openai==1.30.0
 unstructured==0.14.0
 tiktoken==0.7.0

保存文件后,在命令行进入这个文件夹,安装所有依赖:

cd Desktop/rag_project
pip install -r requirements.txt

等待几分钟,依赖安装完成。如果遇到报错,可能是 Python 版本问题,尝试升级 pip:

pip install --upgrade pip

四、代码实战:构建完整的 RAG 流水线

4.1 整体架构一览

我们的 RAG 系统包含以下几个模块:

4.2 编写配置文件

在项目文件夹里新建 config.py,填入你的 HolySheep API 配置:

import os

HolySheep AI API 配置

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # 替换成你的真实密钥 BASE_URL = "https://api.holysheep.ai/v1"

模型配置

EMBEDDING_MODEL = "text-embedding-3-small" # 用于生成向量 LLM_MODEL = "gpt-4o-mini" # 用于生成回答

文件配置

DOCUMENTS_PATH = "./documents" PERSIST_DIRECTORY = "./chroma_db"

注意这里使用的是 HolySheep AI 提供的 base_urlhttps://api.holysheep.ai/v1,而不是其他平台。

4.3 初始化 HolySheep 大模型

新建 llm_setup.py,用于连接 HolySheep AI 的大模型服务:

from langchain_openai import OpenAI
from config import HOLYSHEEP_API_KEY, BASE_URL, LLM_MODEL

def get_llm():
    """
    初始化 HolySheep AI 大模型
    这里使用 OpenAI 兼容接口,指向 HolySheep 中转站
    """
    llm = OpenAI(
        api_key=HOLYSHEEP_API_KEY,
        base_url=BASE_URL,
        model=LLM_MODEL,
        temperature=0.7,  # 控制随机性,0-2之间,越高越有创意
        max_tokens=1000   # 单次回答最多生成多少字
    )
    return llm

测试连接

if __name__ == "__main__": test_llm = get_llm() response = test_llm.invoke("你好,请用一句话介绍你自己") print("模型回答:", response)

运行这个文件,如果看到模型正常回答,说明连接成功。

4.4 构建向量数据库

新建 vectorstore.py,负责把文档转成向量存入 Chroma 数据库:

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from config import DOCUMENTS_PATH, PERSIST_DIRECTORY, EMBEDDING_MODEL

def load_documents():
    """
    加载 documents 文件夹下的所有文档
    """
    from langchain_community.document_loaders import DirectoryLoader
    
    # 支持加载 txt 文件
    loader = DirectoryLoader(
        DOCUMENTS_PATH, 
        glob="**/*.txt",
        loader_cls=TextLoader
    )
    documents = loader.load()
    print(f"成功加载 {len(documents)} 个文档")
    return documents

def split_documents(documents):
    """
    把长文档切成小段落
    chunk_size: 每个段落多少个字符
    chunk_overlap: 段落之间重叠多少字符(防止重要信息被切断)
    """
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,      # 每段500字符
        chunk_overlap=50,    # 重叠50字符
        length_function=len
    )
    chunks = text_splitter.split_documents(documents)
    print(f"文档切分成 {len(chunks)} 个小块")
    return chunks

def create_vectorstore(chunks):
    """
    创建向量数据库
    使用 HuggingFace 的中文 embedding 模型
    """
    embeddings = HuggingFaceEmbeddings(
        model_name="sentence-transformers/all-MiniLM-L6-v2"
    )
    
    # 创建数据库(如果已存在会自动加载)
    vectorstore = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory=PERSIST_DIRECTORY
    )
    print("向量数据库创建完成!")
    return vectorstore

def setup_vectorstore():
    """
    一键初始化向量数据库
    """
    documents = load_documents()
    chunks = split_documents(documents)
    vectorstore = create_vectorstore(chunks)
    return vectorstore

if __name__ == "__main__":
    setup_vectorstore()

4.5 搭建 RAG 问答链

新建 rag_chain.py,这是核心文件,把检索和生成串联起来:

from langchain.chains import RetrievalQA
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from llm_setup import get_llm
from config import PERSIST_DIRECTORY

def setup_rag_chain():
    """
    搭建完整的 RAG 问答链
    """
    # 1. 加载向量数据库
    embeddings = HuggingFaceEmbeddings(
        model_name="sentence-transformers/all-MiniLM-L6-v2"
    )
    vectorstore = Chroma(
        persist_directory=PERSIST_DIRECTORY,
        embedding_function=embeddings
    )
    
    # 2. 获取大模型
    llm = get_llm()
    
    # 3. 创建检索器(从向量库中找最相关的 3 个片段)
    retriever = vectorstore.as_retriever(
        search_kwargs={"k": 3}
    )
    
    # 4. 构建问答链
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",  # 把检索到的内容"塞"进 prompt
        retriever=retriever,
        return_source_documents=True  # 返回引用的源文档
    )
    
    return qa_chain

def ask_question(question):
    """
    问答函数
    """
    qa_chain = setup_rag_chain()
    result = qa_chain.invoke({"query": question})
    
    print("\n" + "="*50)
    print("问题:", result["query"])
    print("="*50)
    print("回答:", result["result"])
    print("="*50)
    print("参考来源:")
    for i, doc in enumerate(result["source_documents"], 1):
        print(f"  {i}. {doc.page_content[:100]}...")
    
    return result

if __name__ == "__main__":
    # 测试问答
    question = input("请输入你的问题:")
    ask_question(question)

4.6 准备测试文档

在项目文件夹里新建 documents 子文件夹,在里面创建一个 公司介绍.txt,写入以下内容:

HolySheep AI 是一家专注于 AI API 中转服务的公司。
我们的使命是让国内开发者能够以最低的成本、最高的效率使用国际顶级大模型。
HolySheep AI 支持微信、支付宝充值,汇率仅为 ¥1=$1,比官方节省 85% 以上费用。
平台提供国内直连服务,延迟低于 50ms,无需翻墙即可稳定调用。
支持的模型包括 GPT-4o、Claude 3.5、Gemini Pro、DeepSeek 等主流大模型。
新用户注册即送免费额度,可以先体验再付费。
技术支持邮箱是 [email protected]

现在运行向量数据库初始化:

python vectorstore.py

看到"向量数据库创建完成"的提示后,运行问答测试:

python rag_chain.py
请输入你的问题:HolySheep AI 充值方便吗?

系统应该能准确回答出支持微信和支付宝充值的信息。

五、优化 RAG 效果的高级技巧

5.1 更换更准确的 Embedding 模型

上面我们用的是英文模型,对于中文文档效果可能不够好。换成中文模型试试:

# 把 HuggingFaceEmbeddings 的 model_name 改成:
model_name="moka-ai/m3e-base"

或者用 OpenAI 的 embedding(通过 HolySheep 调取)

from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings( api_key=HOLYSHEEP_API_KEY, base_url=BASE_URL, model="text-embedding-3-small" )

5.2 切换不同的大模型

config.py 里修改 LLM_MODEL 参数,可以尝试:

# 追求性价比
LLM_MODEL = "gpt-4o-mini"

追求更好效果

LLM_MODEL = "gpt-4o"

尝试 Claude(如果账户里有额度)

LLM_MODEL = "claude-3-sonnet-20240229"

5.3 改变检索策略

默认是返回最相关的 3 个片段,可以根据需要调整:

# 返回 5 个相关片段
retriever = vectorstore.as_retriever(
    search_kwargs={"k": 5}
)

或者使用 MMR(最大边际相关性)策略,让检索结果更多样

retriever = vectorstore.as_retriever( search_type="mmr", search_kwargs={"k": 5, "fetch_k": 20} )

六、常见报错排查

在实际操作过程中,你可能会遇到以下问题,对照着解决即可:

问题一:ImportError: cannot import name 'xxx' from 'langchain'

原因:LangChain 版本更新后,很多模块被移到了独立的包里。
解决:安装对应的 langchain 子包,例如:

pip install langchain-openai
pip install langchain-community
pip install langchain-chroma

问题二:AuthenticationError: Incorrect API key provided

原因:填入的 API Key 错误或格式不对。
解决

问题三:RateLimitError: You exceeded your current quota

原因:账户额度用完了,或者新用户赠送额度还没到账。
解决