当前位置: 首页 > news >正文

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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

http://www.cnnetsun.cn/news/3388463.html

相关文章:

  • C++ std::bind 参数绑定机制详解:从原理到实战应用
  • Unity Prefab变体:5分钟构建差异化敌人体系与性能优化实战
  • 掌握Vue3 第六章(Ref全家桶实战与避坑指南)
  • 小米智能音箱Pro体验:平衡音质与智能交互的家庭枢纽
  • 记录:hbuildx 无线真机调试,公司网络无法连接问题
  • Kilo Code接入GLM-4.6本地补全实战指南
  • DRA75x引脚配置实战:从GMAC、GPIO到eMMC的硬件设计与软件避坑指南
  • Weknora AI知识库问答系统检索指标测试方法
  • IP与IK防护:厂家必须知道的可靠性真相
  • C++高精度算法实现:从原理到工程实践,手把手构建大整数运算库
  • STM32 UART串口中断接收与状态机解析实战(一种高效稳定的解析范式)
  • TI MSP430F676x1A三相电能计量SoC:架构、低功耗设计与开发实战
  • 告别setup.py:使用pyproject.toml打造现代Python包
  • 基于STM8与DS18B20的LCD1602四线驱动温度监测系统实现
  • DLP3010芯片组应用实战:从光学设计到热管理的系统级避坑指南
  • 生产管理5M1E:人、机、料、法、环、测到底该怎么理解?
  • Unity动画事件实战:帧级精准触发游戏音效与特效
  • 实战指南|心理学实验样本量计算:从理论到实践
  • Unity Shader Graph纹理数组:性能优化与实战应用指南
  • 在YOLOv11中引入Transformer自注意力:是锦上添花还是负优化?
  • 攻克英语期刊写作:从Results到Discussion的实战解析与避坑指南
  • 从性能瓶颈到无缝融合:使用Boost.Python构建C++与Python的混合计算引擎
  • 人机识别对抗——鼠标轨迹模拟:贝塞尔曲线、噪声注入、速度变化与验证通过
  • 实战演练:利用MATLAB构建(7,4)汉明码的完整通信链路仿真
  • PyBind11 2.12 零拷贝数据交换:C++与Python高性能混合编程实践
  • 【强化学习】MCTS 中的 UCB 变体:从理论到实战的探索与利用平衡术
  • 基于STM32单片机的USB有线键盘无线键盘数字键盘设计/DIY-T154
  • 从几何变换到数据降维:特征值与特征向量的核心应用解析
  • 智能车浅谈——从PID到模型预测:方向控制算法演进
  • FPD-Link III解串器DS90UB662-Q1:多路视频同步与CSI-2协议实战解析