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

HoRain云--LangChain 个人知识库问答系统
HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍系统设计完整代码实例实例本篇构建一个能加载 Markdown 文件、PDF 文档并基于这些内容进行问答的个人知识库系统。系统设计文档加载支持 Markdown、TXT、PDF 多种格式向量检索Chroma 持久化存储支持增量更新引用来源回答中附带来源文档和片段位置流式输出逐 Token 显示回答完整代码实例# 文件路径knowledge_qa.py# pip install langchain langchain-deepseek langchain-chroma chromadb pypdffrom dotenv import load_dotenvload_dotenv()import osfrom pathlib import Pathfrom langchain.tools import toolfrom langchain.agents import create_agentfrom langchain.chat_models import init_chat_modelfrom langchain.messages import HumanMessagefrom langchain_openai import OpenAIEmbeddingsfrom langchain_chroma import Chromafrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.document_loaders import TextLoaderclass KnowledgeBase:个人知识库管理器def __init__(self, persist_dir: str ./my_knowledge_db):self.persist_dir persist_dirself.embeddings OpenAIEmbeddings(modeltext-embedding-3-small)self.text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50,separators[\n\n, \n, 。, , , . , ! , ? , ],)self.vector_store Noneself._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_directoryself.persist_dir,embedding_functionself.embeddings,)print(f已加载向量库{self.vector_store._collection.count()} 个文档块)else:self.vector_store Chroma(embedding_functionself.embeddings,persist_directoryself.persist_dir,)print(已创建新的向量库)def add_file(self, file_path: str) - int:添加文件到知识库返回添加的文档块数loader TextLoader(file_path, encodingutf-8)docs loader.load()# 添加文件来源元数据for doc in docs:doc.metadata[source] Path(file_path).namechunks 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, kk)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. 面向对象编程,sourcePython3 教程大纲)kb.add_text(要成为一名优秀的 Python 开发者建议按以下路线学习第一步掌握 Python 基础语法1-2 周第二步学习数据结构和算法基础2-3 周第三步选择一个方向深入学习Web 开发/数据分析/AI第四步做 2-3 个实战项目巩固知识。,sourcePython 学习路线)kb.add_text(菜鸟教程的在线编程环境支持 Python、JavaScript、Java、C 等多种语言。用户无需安装任何软件打开浏览器即可编写和运行代码。在线环境还支持代码高亮、自动补全和错误提示功能。,source在线编程环境说明)# 创建 RAG Agent tooldef search_knowledge(query: str) - str:在个人知识库中搜索相关信息。搜索时使用完整的问题或关键短语。Args:query: 搜索问题或关键短语docs kb.search(query, k3)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, temperature0)agent create_agent(modelmodel,tools[search_knowledge],system_prompt你是个人知识库助手。## 规则1. 所有问题必须先用 search_knowledge 工具检索知识库2. 回答时注明信息来源文档名称3. 如果知识库中没有相关内容如实告知4. 回答要结构化使用数字列表或分段,)# 测试 def ask(question: str):提问并流式显示回答print(f\n{*60})print(fQ: {question})print(f{*60})result agent.invoke({messages: [HumanMessage(contentquestion)]})# 显示检索到的内容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 道阻且长,行则将至,让我们一起加油吧