从0到1,LangChain+RAG全链路实战AI知识库

项目目标

构建一个能够理解企业内部文档(PDF、Word、TXT等),支持自然语言提问,并能进行多轮上下文对话的智能助手。


核心依赖

bash 复制代码
# 安装核心库
# pip install langchain langchain-openai chromadb pypdf unstructured python-dotenv

第一步:文档加载与预处理

这是RAG的起点。我们需要把非结构化的文档转化为向量数据库能理解的"文本块"。

ini 复制代码
import os
from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载文档目录
def load_documents(directory: str):
    loader = DirectoryLoader(directory, glob="**/*.*")
    documents = loader.load()
    return documents

# 分割文本(避免超出模型上下文)
def split_documents(documents, chunk_size=1000, chunk_overlap=200):
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=chunk_overlap,
        length_function=len
    )
    return text_splitter.split_documents(documents)

# 示例调用
docs = load_documents("./data/knowledge_base/")
chunks = split_documents(docs)
print(f"共加载并分割出 {len(chunks)} 个文本块")

第二步:向量化与向量存储

将文本块转化为向量,并存入向量数据库(这里使用ChromaDB)。

ini 复制代码
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
import os
from dotenv import load_dotenv

load_dotenv()

# 初始化嵌入模型(使用OpenAI)
embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("OPENAI_API_KEY"))

# 创建向量数据库
def create_vector_db(chunks, persist_directory="chroma_db"):
    vectorstore = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory=persist_directory
    )
    vectorstore.persist()
    return vectorstore

# 创建或加载向量库
vector_db = create_vector_db(chunks)

第三步:基础检索问答

实现最简单的"提问-检索-生成"流程。

python 复制代码
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

# 初始化大模型
llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0,
    openai_api_key=os.getenv("OPENAI_API_KEY")
)

# 创建检索问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_db.as_retriever(search_kwargs={"k": 3}),  # 返回3个最相关片段
    return_source_documents=True
)

# 简单问答
def ask_question(question: str):
    result = qa_chain.invoke({"query": question})
    print(f"问题: {question}")
    print(f"回答: {result['result']}")
    print("\n参考资料:")
    for i, doc in enumerate(result["source_documents"]):
        print(f"  [{i+1}] {doc.metadata['source']} (页码: {doc.metadata.get('page', 'N/A')})")
    return result

# 测试
ask_question("我们公司的数据安全政策是什么?")

第四步:多轮对话优化(关键!)

基础问答缺乏上下文记忆。真实场景中,用户会追问:"那具体怎么操作?" 这需要对话记忆。

python 复制代码
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain

# 添加对话记忆
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 创建支持对话的检索链
conversational_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vector_db.as_retriever(),
    memory=memory
)

# 支持多轮对话的函数
def chat(query: str):
    result = conversational_chain.invoke({"question": query})
    print(f"用户: {query}")
    print(f"AI: {result['answer']}")
    return result['answer']

# 多轮对话示例
chat("介绍一下我们的产品线")
chat("其中哪个产品最适合中小企业?")  # AI能理解"其中"指代上文的产品线
chat("它的价格是多少?")  # AI继续关联上下文

第五步:优化检索质量(进阶)

默认的关键词检索可能不够精准。我们可以使用"自查询检索器"提升语义理解能力。

ini 复制代码
from langchain.retrievers import SelfQueryRetriever
from langchain.chains.query_constructor.schema import AttributeInfo

# 定义元数据信息(帮助AI理解如何过滤)
metadata_field_info = [
    AttributeInfo(
        name="source",
        description="文档来源文件名",
        type="string",
    ),
    AttributeInfo(
        name="page",
        description="页码",
        type="integer",
    ),
]

document_content_description = "企业内部文档内容"

# 创建自查询检索器
self_query_retriever = SelfQueryRetriever.from_llm(
    llm=llm,
    vectorstore=vector_db,
    document_contents=document_content_description,
    metadata_field_info=metadata_field_info,
    enable_limit=True  # 支持LIMIT语法
)

# 替换原有检索器
conversational_chain.retriever = self_query_retriever

# 现在可以处理更复杂的查询
chat("在员工手册第5页提到了什么福利政策?")

总结:为什么这套流程值得掌握?

  1. 真实可用:这不是玩具,而是能直接部署到企业内部的知识助手。
  2. 全链路覆盖:从数据加载、向量化、检索、生成到对话记忆,一气呵成。
  3. 可扩展性强:可轻松替换为私有化部署的Embedding模型(如bge)、向量库(如Milvus)、大模型(如Llama 3)。
  4. 成本可控:相比纯大模型微调,RAG成本极低,且知识更新方便。

作为一名程序员,我越来越相信:未来的"编程",不再是写一堆if-else,而是设计智能的"信息流转管道" 。LangChain + RAG 正是构建这类管道的利器。掌握它,你不仅是在学一个框架,更是在掌握一种面向AI时代的新型软件架构思维。

项目完整源码已上传至GitHubhttps://github.com/yourname/langchain-rag-knowledge-base

(包含Docker部署、FastAPI接口封装、前端交互界面)

相关推荐
大模型真好玩17 小时前
LangGraph实战项目:从零手搓DeepResearch(三)——LangGraph多智能体搭建与部署
人工智能·langchain·mcp
小新学习屋1 天前
大模型-智能体-【篇四: Agent GPT 、AgentTuning、LangChain-Agent】
gpt·langchain·大模型·智能体
马尚道2 天前
helloworld入门【从0到1,LangChain+RAG全链路实战AI知识库】
langchain
带刺的坐椅2 天前
LangChain4j 比 SolonAI 强在哪?弱在哪?
java·ai·langchain·solon·mcp
Kay_Liang2 天前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
沐雪架构师2 天前
乐学LangChain(1):总体架构和核心组件
langchain·学习方法
马尚来2 天前
helloworld入门【从0到1,LangChain+RAG全链路实战AI知识库】
langchain
马尚来2 天前
从0到1,LangChain+RAG全链路实战AI知识库
langchain
叼菠萝3 天前
AI 应用开发三剑客系列:LangChain 如何撑起 LLM 应用开发基石?
python·langchain