之前主要在写 Kubernetes 相关内容,最近发现 AI 工程化(AI Engineering)越来越火,无论是日常提效还是简历加分都非常实用。 所以决定把博客方向转向 AI 实战,以后会重点输出 LangChain、Agent、RAG、本地大模型部署等内容。

今天第一篇就来硬的:用 LangChain + Ollama + Chroma 快速搭建一个支持本地知识库问答的 RAG 应用

一、为什么选择 LangChain?

  • 2026 年依然是构建 LLM 应用最主流的框架之一
  • 组件化设计,开发效率高
  • 生态成熟(支持几百种 LLM、向量库、工具)
  • 学习曲线相对友好

二、环境准备(2026 最新推荐方式)

Bash

# 1. 创建虚拟环境
conda create -n langchain-env python=3.11
conda activate langchain-env

# 2. 安装核心依赖
pip install langchain langchain-community langchain-ollama langchain-chroma 
pip install chromadb pypdf  # 处理 PDF

# 3. 安装本地大模型(推荐 DeepSeek-R1-Distill-Qwen-14B 或 Llama3.1-8B)
# 先安装 Ollama(https://ollama.com)
ollama pull qwen2.5:14b   # 或 llama3.1:8b

三、完整代码实战(5 步构建 RAG)

1. 加载文档 + 切分

Python

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = PyPDFLoader("your_document.pdf")   # 换成你的 PDF/Word/文本
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
splits = text_splitter.split_documents(docs)
print(f"切分后共 {len(splits)} 个片段")

2. 创建向量数据库

Python

from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings

embeddings = OllamaEmbeddings(model="qwen2.5:14b")   # 或 nomic-embed-text

vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

3. 创建 Retriever

Python

retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 6}   # 召回 6 个最相关片段
)

4. 构建 Prompt + Chain

Python

from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

llm = ChatOllama(model="qwen2.5:14b", temperature=0.3)

template = """基于以下上下文回答问题:
{context}

问题: {question}
回答要准确、简洁、专业。如果不知道就说不知道,不要编造。
"""

prompt = ChatPromptTemplate.from_template(template)

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

5. 测试问答

Python

print(rag_chain.invoke("你的文档里的核心内容是什么?"))

四、实际效果 & 踩坑记录

优点

  • 完全本地化运行,数据不泄露
  • 回答质量明显高于直接问大模型(因为注入了私有知识)

我踩过的坑

  1. Embedding 模型和 LLM 型号要匹配,否则效果差
  2. chunk_size 太大会丢失上下文,太小会断裂语义(500-800 比较合适)
  3. 第一次加载向量库比较慢,后续就很快
  4. Ollama 显存占用高,建议至少 16GB 内存 + 8GB 显存

五、今日感悟

转 AI 方向第一天,我就深刻感受到:大模型本身不是重点,如何把大模型和实际业务/知识结合才是核心竞争力。RAG 是目前最实用、最落地的一条路径。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐