模板功能
这个模板做到:
- 文档入库(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的小宝同学”