在本地搭建RAG系统并结合OpenWebUI

在本地搭建RAG系统并结合Open WebUI管理的步骤如下:

1. 系统架构概述

  • RAG流程:文档处理 → 向量化存储 → 检索增强生成。
  • 工具链:Chroma(向量数据库)、Sentence Transformers(嵌入模型)、Ollama(本地LLM)、LangChain/LlamaIndex(RAG框架)、FastAPI(自定义API)、Open WebUI(前端)。

2. 详细步骤

步骤1:安装依赖

1
2
3
4
5
6
# 创建Python虚拟环境
python -m venv rag_env
source rag_env/bin/activate

# 安装核心库
pip install langchain chromadb sentence-transformers fastapi uvicorn ollama open-webui

步骤2:准备本地知识库

  • 将文档(PDF、TXT等)放入 ./docs 目录。
  • 使用LangChain的文档加载器处理文件:
    1
    2
    3
    4
    from langchain.document_loaders import DirectoryLoader

    loader = DirectoryLoader("./docs", glob="**/*.txt")
    documents = loader.load()

步骤3:分块与嵌入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings

# 文本分块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# 加载嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

# 存储到Chroma
from langchain.vectorstores import Chroma
vector_db = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
vector_db.persist()

步骤4:部署本地LLM

  • 安装Ollama(官网),下载模型:
    1
    ollama pull llama2  # 或选择其他模型如 mistral、codellama

步骤5:构建RAG服务(FastAPI)

创建 rag_api.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from fastapi import FastAPI
from pydantic import BaseModel
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import Ollama

app = FastAPI()

# 加载向量数据库和模型
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
llm = Ollama(model="llama2")

qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vector_db.as_retriever(search_kwargs={"k": 3}),
chain_type="stuff"
)

class Query(BaseModel):
text: str

@app.post("/generate")
async def generate_answer(query: Query):
response = qa_chain.run(query.text)
return {"answer": response}

启动API:

1
uvicorn rag_api:app --host 0.0.0.0 --port 5000

步骤6:配置Open WebUI

  1. 安装Open WebUI(参考官方文档):

    1
    docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
  2. 登录Open WebUI(http://localhost:3000),添加自定义API:

    • 进入 Settings → Model
    • 输入自定义端点:http://host.docker.internal:5000/generate

3. 使用流程

  1. 在Open WebUI界面输入问题。
  2. 问题通过API发送到RAG服务,检索本地知识库并生成答案。
  3. 结果返回并显示在WebUI中。

4. 优化与调试

  • 检索优化:调整分块大小、相似度阈值或使用重新排序模型。
  • 性能提升:使用GPU加速嵌入和推理,或选择量化模型。
  • 提示工程:修改提示模板以提高回答质量,例如:
    1
    2
    3
    4
    5
    6
    7
    qa_chain.combine_documents_chain.llm_chain.prompt.template = """
    基于以下上下文回答问题:
    {context}

    问题:{question}
    答案:
    """

5. 常见问题

  • Ollama连接失败:确保Ollama服务运行且端口(默认11434)开放。
  • 向量数据库未持久化:检查Chroma的persist_directory路径权限。
  • API跨域问题:在FastAPI中添加CORS中间件:
    1
    2
    from fastapi.middleware.cors import CORSMiddleware
    app.add_middleware(CORSMiddleware, allow_origins=["*"])

通过以上步骤,你可以在本地搭建一个集成Open WebUI的RAG系统,实现基于私有知识库的智能问答。