LangChain + RAG 的最小工程模板

0 阅读2分钟

模板功能

这个模板做到:

  • 文档入库(PDF/TXT/Markdown 都行)
  • 向量化存储(Chroma 本地)
  • 检索增强生成(RAG)
  • 一个入口文件即可问答
  • 工程结构清晰,适合继续扩展成“空间智能体”

推荐目录结构

rag_minimal/
│
├── data/                 # 原始知识库文件
│   └── demo.txt
│
├── vectordb/             # 向量数据库持久化目录(自动生成)
│
├── src/
│   ├── config.py         # 配置文件(模型、路径)
│   ├── ingest.py         # 文档入库
│   ├── rag_chain.py      # RAG问答链
│   └── main.py           # 主入口:运行问答
│
├── requirements.txt
└── README.md

一句话:数据 → 入库 → 检索 → 生成 → 输出


requirements.txt

langchain
langchain-community
langchain-openai
chromadb
tiktoken
python-dotenv

安装:

pip install -r requirements.txt

config.py

src/config.py
import os
from dotenv import load_dotenv

load_dotenv()

# 文档路径
DATA_DIR = "data"

# 向量库持久化路径
VECTOR_DB_DIR = "vectordb"

# OpenAI模型配置
EMBEDDING_MODEL = "text-embedding-3-small"
LLM_MODEL = "gpt-4o-mini"

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

这一步非常重要:以后换成本地模型,只改这里。


ingest.py

src/ingest.py
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

from config import DATA_DIR, VECTOR_DB_DIR, EMBEDDING_MODEL


def ingest():
    print("📥 加载文档...")

    loader = TextLoader(f"{DATA_DIR}/demo.txt", encoding="utf-8")
    docs = loader.load()

    print("✂️ 文本切块...")

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

    chunks = splitter.split_documents(docs)

    print("🧠 向量化并写入 Chroma...")

    embeddings = OpenAIEmbeddings(model=EMBEDDING_MODEL)

    vectordb = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory=VECTOR_DB_DIR
    )

    vectordb.persist()
    print("✅ 入库完成!")


if __name__ == "__main__":
    ingest()

入库一次即可:

python src/ingest.py

rag_chain.py

src/rag_chain.py
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings

from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

from config import VECTOR_DB_DIR, EMBEDDING_MODEL, LLM_MODEL


def build_rag_chain():
    # 向量库加载
    vectordb = Chroma(
        persist_directory=VECTOR_DB_DIR,
        embedding_function=OpenAIEmbeddings(model=EMBEDDING_MODEL)
    )

    retriever = vectordb.as_retriever(search_kwargs={"k": 3})

    # LLM
    llm = ChatOpenAI(model=LLM_MODEL)

    # RetrievalQA = 最经典最小RAG链
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        retriever=retriever,
        return_source_documents=True
    )

    return qa_chain

main.py

src/main.py
from rag_chain import build_rag_chain


def main():
    qa = build_rag_chain()

    print("\n🌙 RAG问答系统启动(输入exit退出)\n")

    while True:
        query = input("你问:")

        if query.strip().lower() == "exit":
            break

        result = qa(query)

        print("\n回答:", result["result"])

        print("\n📌 来源片段:")
        for doc in result["source_documents"]:
            print("-", doc.page_content[:80], "...\n")


if __name__ == "__main__":
    main()

运行:

python src/main.py

demo.txt

data/demo.txt
LangChain 是一个用于构建 LLM 应用的框架。
RAG 是 Retrieval-Augmented Generation,检索增强生成。
GIS 与 RAG 结合可以实现空间知识问答。

你现在得到的最小闭环

你已经拥有:

  • 一个知识库
  • 一个向量数据库
  • 一个检索器
  • 一个LLM生成器
  • 一个可持续扩展的工程结构

它像一颗种子,安静,但生命力很强。

更多精彩内容请关注微信公众号 “学GIS的小宝同学”

qrcode_for_gh_c97ecdcb886c_344.jpg