使用 LangChain + Ollama 构建本地知识库问答系统 | 完整搭建指南

# 使用 LangChain + Ollama 构建本地知识库问答系统

## 背景介绍

企业内部有大量文档:技术手册、操作指南、会议记录、产品说明。这些东西靠关键词搜索很难找准——用户打个”怎么部署”,可能返回十条不相关的结果。更麻烦的是,把这些内部资料发给第三方 API 存在数据泄露风险,老板第一个不答应。

大语言模型出现后,局面变了。检索增强生成(RAG)技术让 AI 先从本地文档里翻资料,再根据内容回答问题。数据不出门,答案还精准。本文手把手教你搭建这么一套系统:Ollama 跑开源模型,LangChain 写应用逻辑,Chroma 存向量数据。个人电脑就能跑,不用云服务。

## 问题描述

实际落地时会遇到三个坎:

**隐私问题**——客户数据、薪资报表、技术专利,发给第三方不放心。本地部署最稳妥。

**知识陈旧**——通用大模型训练数据有截止日期,你公司去年才上的新产品、新政策,它一概不知。喂给它,才能答。

**成本问题**——调用商业 API 按次收费,用户量上来后费用感人。开源模型本地跑,一次投入,长期省心。

本文目标很明确:让你跑通一个可用的本地问答系统,从环境配置到代码实现再到效果验证。

## 详细步骤

### 1. 环境准备

依赖 Python 3.10+,先建目录和虚拟环境:

“`bash
mkdir local-rag-system && cd local-rag-system
python -m venv venv
source venv/bin/activate # Linux/Mac; Windows 用 venv\Scripts\activate
“`

装依赖:

“`bash
pip install langchain langchain-community langchain-chroma
pip install sentence-transformers chromadb
pip install beautifulsoup4 requests
pip install ollama
“`

### 2. 下载 LLM 模型

Ollama 直接拉模型。根据自己显卡显存选:

“`bash
# 7B:消费级显卡够用;14B 需要 16G+ 显存;3B 最轻量
ollama pull qwen2.5:7b
# 或者 ollama pull llama3.2:3b
“`

后台启动服务:

“`bash
ollama serve &
ollama list # 确认拉成功了
“`

### 3. 准备知识库文档

建个示例目录,放两篇测试文档:

“`bash
mkdir -p knowledge_base
“`

`knowledge_base/公司介绍.txt`:

“`
北京智源科技有限公司成立于2020年,专注于人工智能技术研发。
公司总部位于北京市海淀区中关村科技园区。
核心技术团队由来自清华大学、北京大学和中国科学院的博士组成。
主要产品包括智能对话平台、知识图谱系统和自然语言处理工具。
2023年获得国家高新技术企业认定。
2024年完成A轮融资,融资金额5000万元人民币。
“`

`knowledge_base/产品手册.txt`:

“`
智源智能助手是企业级对话AI产品,支持私有化部署。
产品特点:支持定制化知识库,响应时间小于200ms,
支持多轮对话和上下文记忆,准确率达到95%以上。
技术架构:基于Transformer模型,支持主流开源LLM。
部署要求:Linux系统,至少16GB内存,推荐使用GPU加速。
价格方案:分为标准版、专业版和企业版三个版本。
“`

### 4. 构建向量数据库

文档转向量存到 Chroma。创建 `build_vectorstore.py`:

“`python
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings

# 配置参数
KNOWLEDGE_DIR = “./knowledge_base”
PERSIST_DIR = “./chroma_db”
EMBEDDING_MODEL = “sentence-transformers/all-MiniLM-L6-v2”

def load_documents():
“””加载知识库文档”””
loader = DirectoryLoader(
KNOWLEDGE_DIR,
glob=”*.txt”,
loader_cls=TextLoader,
encoding=”utf-8″
)
documents = loader.load()
print(f”成功加载 {len(documents)} 个文档”)
return documents

def split_documents(documents):
“””将文档分割成小块”””
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=[“\n\n”, “\n”, “。”, “!”, “?”, “.”]
)
chunks = text_splitter.split_documents(documents)
print(f”分割完成,共 {len(chunks)} 个文本块”)
return chunks

def create_vectorstore(chunks):
“””创建向量数据库”””
embeddings = HuggingFaceEmbeddings(
model_name=EMBEDDING_MODEL,
model_kwargs={‘device’: ‘cpu’}
)

vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=PERSIST_DIR
)

print(f”向量数据库创建成功,存储位置:{PERSIST_DIR}”)
return vectorstore

if __name__ == “__main__”:
docs = load_documents()
chunks = split_documents(docs)
vectorstore = create_vectorstore(chunks)
print(“知识库构建完成!”)
“`

运行:

“`bash
python build_vectorstore.py
“`

### 5. 实现问答系统

核心代码 `rag_system.py`:

“`python
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_ollama import ChatOllama
from langchain.prompts import PromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema import StrOutputParser

# 配置参数
PERSIST_DIR = “./chroma_db”
EMBEDDING_MODEL = “sentence-transformers/all-MiniLM-L6-v2”
LLM_MODEL = “qwen2.5:7b”

class LocalRAGSystem:
“””本地知识库问答系统”””

def __init__(self):
self.embeddings = HuggingFaceEmbeddings(
model_name=EMBEDDING_MODEL,
model_kwargs={‘device’: ‘cpu’}
)

self.vectorstore = Chroma(
persist_directory=PERSIST_DIR,
embedding_function=self.embeddings
)

self.retriever = self.vectorstore.as_retriever(
search_type=”similarity”,
search_kwargs={“k”: 3}
)

self.llm = ChatOllama(
model=LLM_MODEL,
temperature=0.7
)

self.prompt_template = PromptTemplate(
template=”””你是一个专业的知识库问答助手。请根据以下参考资料回答用户的问题。
如果参考资料中没有相关信息,请如实说明,不要编造答案。

参考资料:
{context}

用户问题:{question}

请给出专业、准确的回答:”””,
input_variables=[“context”, “question”]
)

self.qa_chain = (
{“context”: self.retriever, “question”: RunnablePassthrough()}
| self.prompt_template
| self.llm
| StrOutputParser()
)

print(“问答系统初始化完成!”)

def ask(self, question: str) -> str:
“””回答用户问题”””
print(f”\n问题:{question}”)
print(“-” * 50)

docs = self.retriever.invoke(question)
print(f”检索到 {len(docs)} 个相关文档:”)
for i, doc in enumerate(docs, 1):
print(f” {i}. {doc.page_content[:100]}…”)

print(“-” * 50)
print(“回答:”)

answer = self.qa_chain.invoke(question)
return answer

def main():
qa_system = LocalRAGSystem()

print(“\n” + “=” * 60)
print(“本地知识库问答系统 – 测试”)
print(“=” * 60)

test_questions = [
“智源科技成立于什么时候?”,
“智源智能助手有哪些特点?”,
“公司的融资情况如何?”,
“部署智源智能助手需要什么要求?”
]

for question in test_questions:
answer = qa_system.ask(question)
print(answer)
print(“\n” + “=” * 60)

if __name__ == “__main__”:
main()
“`

### 6. 运行问答系统

“`bash
python rag_system.py
“`

## 运行结果

系统启动后会依次回答测试问题。以下是典型的输出结果:

“`
问题:智源科技成立于什么时候?
——————————————
检索到 2 个相关文档:
1. 北京智源科技有限公司成立于2020年,专注于人工智能技术研发。
2. 公司总部位于北京市海淀区中关村科技园区。
——————————————
回答:
根据检索到的资料,北京智源科技有限公司成立于2020年,专注于人工智能技术研发。公司总部位于北京市海淀区中关村科技园区。

问题:智源智能助手有哪些特点?
——————————————
检索到 3 个相关文档:
1. 智源智能助手是企业级对话AI产品,支持私有化部署。
2. 产品特点:支持定制化知识库,响应时间小于200ms,
3. 支持多轮对话和上下文记忆,准确率达到95%以上。
——————————————
回答:
智源智能助手是企业级对话AI产品,具有以下特点:
– 支持私有化部署,保障数据安全
– 支持定制化知识库
– 响应时间小于200ms
– 支持多轮对话和上下文记忆
– 准确率达到95%以上
“`

实测效果不错。检索模块找到了最相关的文档片段,LLM 基于这些内容组织出回答。

## 总结

本文覆盖了本地知识库问答系统的完整搭建流程:

1. **环境搭建** – Python 虚拟环境加依赖包
2. **模型部署** – Ollama 拉开源模型,消费级显卡也能跑 7B
3. **知识库构建** – 文档分块、向量化、存入 Chroma
4. **问答功能** – 检索 + 生成,端到端跑通

优势很明显:数据不出门,省掉 API 费用,想加什么知识库自己决定。

后续可以做的优化:
– 换更大参数的模型
– 支持 PDF、Word 等更多格式
– 实现知识库增量更新,不每次全量重建
– 调整检索 k 值和相似度阈值提升准确率

照着这篇文章跑一遍,基本就能搭出自己用的问答系统了。遇到问题再针对性解决。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇