news 2026/7/15 4:39:43

HoRain云--LangChain 个人知识库问答系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--LangChain 个人知识库问答系统

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

系统设计

完整代码

实例

实例


本篇构建一个能加载 Markdown 文件、PDF 文档,并基于这些内容进行问答的个人知识库系统。


系统设计


完整代码

实例

# 文件路径:knowledge_qa.py
# pip install langchain langchain-deepseek langchain-chroma chromadb pypdf
from dotenv import load_dotenv
load_dotenv()

import os
from pathlib import Path
from langchain.tools import tool
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import TextLoader


class KnowledgeBase:
"""个人知识库管理器"""

def __init__(self, persist_dir: str = "./my_knowledge_db"):
self.persist_dir = persist_dir
self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", ". ", "! ", "? ", " "],
)
self.vector_store = None
self._load_or_create()

def _load_or_create(self):
"""加载已有向量库或创建新的"""
if os.path.exists(self.persist_dir) and os.listdir(self.persist_dir):
self.vector_store = Chroma(
persist_directory=self.persist_dir,
embedding_function=self.embeddings,
)
print(f"已加载向量库:{self.vector_store._collection.count()} 个文档块")
else:
self.vector_store = Chroma(
embedding_function=self.embeddings,
persist_directory=self.persist_dir,
)
print("已创建新的向量库")

def add_file(self, file_path: str) -> int:
"""添加文件到知识库,返回添加的文档块数"""
loader = TextLoader(file_path, encoding="utf-8")
docs = loader.load()

# 添加文件来源元数据
for doc in docs:
doc.metadata["source"] = Path(file_path).name

chunks = self.text_splitter.split_documents(docs)
self.vector_store.add_documents(chunks)
print(f"已添加 {Path(file_path).name}:{len(chunks)} 个文档块")
return len(chunks)

def add_text(self, text: str, source: str = "手动添加") -> int:
"""直接添加文本到知识库"""
chunks = self.text_splitter.create_documents(
[text], metadatas=[{"source": source}]
)
self.vector_store.add_documents(chunks)
return len(chunks)

def search(self, query: str, k: int = 3) -> list:
"""搜索知识库"""
return self.vector_store.similarity_search(query, k=k)

def get_retriever(self):
"""获取检索器"""
return self.vector_store.as_retriever(search_kwargs={"k": 3})

继续 Agent 部分:

实例

# ========== 创建知识库并添加示例数据 ==========

kb = KnowledgeBase("./my_knowledge_db")

# 添加一些示例知识
kb.add_text(
"菜鸟教程 RUNOOB 的 Python3 基础教程包含以下章节:"
"1. Python 简介与环境搭建 2. 基本数据类型 3. 运算符与表达式 "
"4. 条件判断 if-else 5. 循环 for/while 6. 函数定义与调用 "
"7. 模块与包 8. 文件操作 9. 异常处理 10. 面向对象编程",
source="Python3 教程大纲"
)

kb.add_text(
"要成为一名优秀的 Python 开发者,建议按以下路线学习:"
"第一步,掌握 Python 基础语法(1-2 周);"
"第二步,学习数据结构和算法基础(2-3 周);"
"第三步,选择一个方向深入学习(Web 开发/数据分析/AI);"
"第四步,做 2-3 个实战项目巩固知识。",
source="Python 学习路线"
)

kb.add_text(
"菜鸟教程的在线编程环境支持 Python、JavaScript、Java、C++ 等多种语言。"
"用户无需安装任何软件,打开浏览器即可编写和运行代码。"
"在线环境还支持代码高亮、自动补全和错误提示功能。",
source="在线编程环境说明"
)


# ========== 创建 RAG Agent ==========

@tool
def search_knowledge(query: str) -> str:
"""在个人知识库中搜索相关信息。搜索时使用完整的问题或关键短语。

Args:
query: 搜索问题或关键短语
"""
docs = kb.search(query, k=3)
if not docs:
return "知识库中未找到相关信息。"

results = []
for i, doc in enumerate(docs, 1):
source = doc.metadata.get("source", "未知来源")
content = doc.page_content[:200]
results.append(f"[{i}] 来源:{source}\n{content}")

return "\n\n---\n\n".join(results)


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
model=model,
tools=[search_knowledge],
system_prompt="""你是个人知识库助手。

## 规则
1. 所有问题必须先用 search_knowledge 工具检索知识库
2. 回答时注明信息来源(文档名称)
3. 如果知识库中没有相关内容,如实告知
4. 回答要结构化,使用数字列表或分段""",
)


# ========== 测试 ==========

def ask(question: str):
"""提问并流式显示回答"""
print(f"\n{'='*60}")
print(f"Q: {question}")
print(f"{'='*60}")

result = agent.invoke({
"messages": [HumanMessage(content=question)]
})

# 显示检索到的内容
for msg in result["messages"]:
if msg.type == "tool":
print(f"\n[检索到的内容]")
print(msg.content[:300])

print(f"\n[回答]")
print(result["messages"][-1].content)


ask("Python3 基础教程包含哪些章节?")
ask("如何规划 Python 学习路线?")
ask("菜鸟教程的在线编程环境支持哪些功能?")

运行结果:

============================================================ Q: Python3 基础教程包含哪些章节? ============================================================ [检索到的内容] [1] 来源:Python3 教程大纲 菜鸟教程 RUNOOB 的 Python3 基础教程包含以下章节:... [回答] Python3 基础教程包含以下章节(来源:Python3 教程大纲): 1. Python 简介与环境搭建 2. 基本数据类型 3. 运算符与表达式 ... ============================================================ Q: 如何规划 Python 学习路线? ============================================================ [回答] 根据知识库中的 Python 学习路线建议(来源:Python 学习路线): 第一步:掌握基础语法(1-2 周) 第二步:学习数据结构和算法(2-3 周) 第三步:选择方向深入学习(Web/数据分析/AI) 第四步:做 2-3 个实战项目巩固

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 4:38:45

Unity Prefab变体:5分钟构建差异化敌人体系与性能优化实战

1. 项目概述:为什么我们需要Prefab变体?在Unity项目里,尤其是涉及到大量重复但又有细微差异的游戏对象时,比如一个关卡里几十种外观、属性各异的敌人,或者UI系统中一堆功能相似但图标、文字不同的按钮,你肯…

作者头像 李华
网站建设 2026/7/15 4:37:48

掌握Vue3 第六章(Ref全家桶实战与避坑指南)

1. Ref基础:从入门到精通Vue3的ref函数可以说是响应式编程的基石。我第一次接触ref时,也被它简洁而强大的特性所吸引。ref的核心作用就是将一个普通的JavaScript值转换为响应式对象,这个对象有一个.value属性指向原始值。import { ref } from…

作者头像 李华
网站建设 2026/7/15 4:34:12

小米智能音箱Pro体验:平衡音质与智能交互的家庭枢纽

去年我帮朋友选蓝牙音箱,他提了个挺典型的需求:既要能在家听音乐时“有点感觉”,又要能语音控制智能家居,预算还不能太高。市面上很多音箱要么音质还行但智能功能简陋,要么智能交互流畅但听歌像听收音机。最后我们选了…

作者头像 李华
网站建设 2026/7/15 4:32:13

记录:hbuildx 无线真机调试,公司网络无法连接问题

1.手机连接电脑热点,开发者选项中打开无线调试,在页面选择配对码连接,弹出端口和code码 2.电脑端端打开对应目录,例:plugins\launcher-tools\tools\adbs,打开cmd,执行:adb kill-serv…

作者头像 李华
网站建设 2026/7/15 4:31:53

Kilo Code接入GLM-4.6本地补全实战指南

1. 项目概述:为什么“让Kilo Code支持GLM-4.6补全”不是一句口号,而是开发者真实痛点的精准切口Kilo Code——这个在中文开发者圈里悄然崛起的轻量级VS Code插件,最近半年被大量前端、Python初学者和教育场景用户反复提及。它不走Copilot那种…

作者头像 李华