15天学会AI应用开发(十一)从TXT文件构建RAG知识库

发布时间:2026/7/27 18:12:25
15天学会AI应用开发(十一)从TXT文件构建RAG知识库 15天学会AI应用开发十一从TXT文件构建RAG知识库在AI应用开发中构建一个高效的知识库是实现智能问答、文档检索等功能的基石。RAGRetrieval-Augmented Generation架构通过检索外部知识来增强大模型的生成能力而TXT文件是最常见、最简单的数据源之一。本文将带你从零开始使用Python构建一个基于TXT文件的RAG知识库并实现完整的检索问答流程。## 1. RAG知识库的核心原理RAG知识库的核心流程分为三步-文档分块将长文本切分为语义完整的段落或片段。-向量化存储使用嵌入模型将文本块转换为向量并存入向量数据库。-检索生成用户提问时将问题向量化后检索最相似的文本块再结合大模型生成回答。本教程使用轻量级工具Sentence-Transformers进行文本向量化ChromaDB作为向量数据库以及LangChain简化流程。## 2. 环境准备与数据加载首先安装必要的依赖库bashpip install langchain chromadb sentence-transformers我们准备一个示例TXT文件knowledge_base.txt内容如下Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它由Guido van Rossum于1989年底发明第一个公开发行版发行于1991年。Python语法简洁清晰特色之一是强制用空白符作为语句缩进。Python具有丰富和强大的库常被称为胶水语言。RAG是一种结合检索和生成的AI架构能提升大模型回答的准确性。向量数据库用于存储和检索高维向量如ChromaDB、Pinecone等。## 3. 文档分块与向量化### 3.1 使用LangChain的文本分割器python# document_loader.pyfrom langchain.document_loaders import TextLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitter# 加载TXT文件loader TextLoader(knowledge_base.txt, encodingutf-8)documents loader.load()# 配置文本分割器每个块500字符重叠50字符text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, separators[\n\n, \n, 。, , , , , ])# 执行分割chunks text_splitter.split_documents(documents)print(f原始文档数: {len(documents)})print(f分割后文本块数: {len(chunks)})# 输出前两个块的内容预览for i, chunk in enumerate(chunks[:2]): print(f\n块{i1}: {chunk.page_content[:100]}...)### 3.2 向量化存储到ChromaDBpython# vector_store.pyfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.vectorstores import Chromaimport os# 使用轻量级中文嵌入模型约500MBembeddings HuggingFaceEmbeddings( model_nameshibing624/text2vec-base-chinese, model_kwargs{device: cpu}, encode_kwargs{normalize_embeddings: True})# 创建Chroma向量数据库持久化到本地persist_directory ./chroma_dbif os.path.exists(persist_directory): # 如果数据库已存在直接加载 vectordb Chroma( persist_directorypersist_directory, embedding_functionembeddings ) print(加载已有向量数据库)else: # 否则从文档块创建新数据库 vectordb Chroma.from_documents( documentschunks, # 上一步分割好的文档块 embeddingembeddings, persist_directorypersist_directory ) vectordb.persist() # 持久化保存 print(创建并持久化向量数据库)# 测试检索查询“什么是Python”query 什么是Pythonresults vectordb.similarity_search(query, k2)print(f\n查询: {query})print(检索结果:)for i, doc in enumerate(results): print(f{i1}. {doc.page_content})## 4. 构建完整的RAG问答系统### 4.1 集成大模型生成回答为了完整演示我们使用OpenAI API需替换为自己的API Key或使用本地模型。这里以OpenAI为例python# rag_qa_system.pyfrom langchain.llms import OpenAIfrom langchain.chains import RetrievalQAfrom langchain.prompts import PromptTemplateimport os# 配置OpenAI请替换为你的API Keyos.environ[OPENAI_API_KEY] your-api-key-here# 从持久化目录加载向量数据库vectordb Chroma( persist_directory./chroma_db, embedding_functionembeddings)# 创建检索器返回最相似的3个文档块retriever vectordb.as_retriever(search_kwargs{k: 3})# 自定义提示模板增强回答质量prompt_template 根据以下上下文信息用中文回答用户的问题。如果上下文中没有相关信息请说“我无法从知识库中找到答案”。不要编造信息。上下文{context}问题{question}回答PROMPT PromptTemplate( templateprompt_template, input_variables[context, question])# 创建QA链qa_chain RetrievalQA.from_chain_type( llmOpenAI(temperature0, model_namegpt-3.5-turbo), chain_typestuff, # 将所有检索结果合并为上下文 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回引用文档)# 测试问答questions [ Python有哪些特点, 什么是RAG架构, 向量数据库有什么作用, Python的发明者是谁]for q in questions: result qa_chain({query: q}) print(f\n问题: {q}) print(f回答: {result[result]}) print(参考来源:) for doc in result[source_documents]: print(f - {doc.page_content[:80]}...)### 4.2 运行效果示例当运行上述代码时输出类似问题: Python有哪些特点回答: Python具有语法简洁清晰、强制用空白符缩进、拥有丰富强大的库等特点常被称为胶水语言。参考来源: - Python语法简洁清晰特色之一是强制用空白符作为语句缩进... - Python具有丰富和强大的库常被称为胶水语言...问题: 什么是RAG架构回答: RAG是一种结合检索和生成的AI架构能提升大模型回答的准确性。参考来源: - RAG是一种结合检索和生成的AI架构能提升大模型回答的准确性...## 5. 优化与进阶### 5.1 处理大文件的分块策略对于超大TXT文件如整本书建议- 使用TokenTextSplitter按token数分块避免截断完整句子- 设置合理的重叠比例10%-20%以保持上下文连贯性- 根据内容结构章节、段落自定义分隔符pythonfrom langchain.text_splitter import TokenTextSplitter# 按token分块更适合英文模型token_splitter TokenTextSplitter( chunk_size200, # 每个块200个token chunk_overlap30 # 重叠30个token)### 5.2 扩展支持多种文件格式LangChain提供了丰富的文档加载器可以轻松扩展python# 支持PDF、Word、CSV等from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, CSVLoaderloader PyPDFLoader(document.pdf) # 替换为对应加载器documents loader.load()## 6. 总结本文从实战出发完整演示了从TXT文件构建RAG知识库的全流程1.文档加载与分块使用TextLoader和RecursiveCharacterTextSplitter将原始文本切分为语义完整的块。2.向量化存储通过HuggingFaceEmbeddings将文本转为向量并存入ChromaDB实现持久化。3.检索问答结合RetrievalQA链和自定义提示模板实现基于知识库的智能问答。这个系统可以轻松扩展到PDF、Word等多种格式并支持替换不同的嵌入模型和大模型。掌握这种模式后你可以快速为任何业务场景构建专属知识库例如企业FAQ、产品文档、学术论文检索等。RAG架构的核心价值在于它让大模型不再依赖训练数据中的知识而是实时从你的专属数据中检索信息从而大幅提升回答的准确性和时效性。