AI 工具开发实战(2):开发一个本地 RAG 知识库——丢一个文件夹进去,直接问答
AI 工具开发实战2开发一个本地 RAG 知识库——丢一个文件夹进去直接问答上一篇做了一个命令行翻译工具这篇做一个更实用的本地 RAG 知识库。把 PDF、Markdown、TXT 文件丢到一个文件夹里运行一条命令就能向这些文件提问AI 会基于文件内容回答。全程本地运行数据不出本机。项目结构localrag/ ├── localrag.py # CLI 主程序 ├── indexer.py # 文档索引 ├── retriever.py # 检索引擎 ├── requirements.txt └── docs/ # 放文档的文件夹安装依赖# requirements.txt click8.1.7 openai1.50.0 python-dotenv1.0.0 sentence-transformers3.1.0 PyMuPDF1.24.0 numpy1.26.0核心实现文档索引器indexer.py# indexer.pyimportosimportjsonimporthashlibfrompathlibimportPathimportfitz# PyMuPDFclassDocumentIndexer:文档索引读取文件夹、切分文本、向量化。def__init__(self,chunk_size512,chunk_overlap128):self.chunk_sizechunk_size self.chunk_overlapchunk_overlapdefload_folder(self,folder_path:str)-list:加载文件夹中的所有文档。docs[]forfinsorted(Path(folder_path).iterdir()):iff.suffix.lower().pdf:textself._parse_pdf(str(f))eliff.suffix.lower()in(.txt,.md):textf.read_text(encodingutf-8,errorsignore)else:continueiftext.strip():docs.append({source:f.name,content:text})returndocsdef_parse_pdf(self,path):docfitz.open(path)text\n.join(p.get_text()forpindoc)doc.close()returntextdefchunk_documents(self,docs:list)-list:将文档切分为重叠的 chunk。chunks[]fordocindocs:textdoc[content]# 按段落切paragraphstext.split(\n\n)bufferforparainparagraphs:parapara.strip()ifnotpara:continueiflen(buffer)len(para)self.chunk_size:buffer(buffer\n\npara).strip()ifbufferelseparaelse:ifbuffer:chunks.append({text:buffer,source:doc[source],id:hashlib.md5(buffer.encode()).hexdigest()[:8],})bufferparaifbuffer:chunks.append({text:buffer,source:doc[source],id:hashlib.md5(buffer.encode()).hexdigest()[:8],})returnchunks检索引擎retriever.py# retriever.pyimportjsonimportosimportnumpyasnpfromsentence_transformersimportSentenceTransformerclassLocalRetriever:本地检索引擎Embedding 向量检索。def__init__(self,model_nameBAAI/bge-small-zh-v1.5):self.modelSentenceTransformer(model_name)self.chunks[]self.vectorsNoneself.index_pathNonedefindex(self,chunks:list,cache_dir:str):建立向量索引。self.chunkschunks texts[c[text]forcinchunks]self.vectorsself.model.encode(texts,normalize_embeddingsTrue)self.index_pathos.path.join(cache_dir,index.json)self._save()defsearch(self,query:str,top_k:int3)-list:检索最相关的 chunk。q_vecself.model.encode([query],normalize_embeddingsTrue)[0]scoresnp.dot(self.vectors,q_vec)# 余弦相似度top_indicesnp.argsort(scores)[-top_k:][::-1]results[]foridxintop_indices:ifscores[idx]0.3:# 相似度太低的不返回continueresults.append({text:self.chunks[idx][text],source:self.chunks[idx][source],score:float(scores[idx]),})returnresultsdef_save(self):data{chunks:self.chunks,vectors:self.vectors.tolist()ifself.vectorsisnotNoneelse[],}withopen(self.index_path,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse)defload(self,cache_dir:str):pathos.path.join(cache_dir,index.json)ifnotos.path.exists(path):returnFalsewithopen(path,encodingutf-8)asf:datajson.load(f)self.chunksdata[chunks]self.vectorsnp.array(data[vectors])returnTrueCLI 主程序localrag.py#!/usr/bin/env python3# localrag.pyimportosimportclickfrompathlibimportPathfromopenaiimportOpenAIfromdotenvimportload_dotenvfromindexerimportDocumentIndexerfromretrieverimportLocalRetriever load_dotenv()CACHE_DIRos.path.expanduser(~/.localrag)os.makedirs(CACHE_DIR,exist_okTrue)clientOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com/v1,)SYSTEM_PROMPT你是一个基于本地文档的 AI 助手。 请严格基于以下检索到的资料回答问题。 如果资料不足以回答请说资料中没有相关信息。 检索资料 {context}click.group()defcli():localrag - 本地 RAG 知识库cli.command()click.argument(folder,typeclick.Path(existsTrue))defindex(folder):索引一个文件夹中的所有文档。indexerDocumentIndexer(chunk_size512,chunk_overlap128)retrieverLocalRetriever()docsindexer.load_folder(folder)chunksindexer.chunk_documents(docs)retriever.index(chunks,CACHE_DIR)click.echo(f✅ 索引完成{len(docs)}个文档 →{len(chunks)}个片段)cli.command()click.argument(question)click.option(--top,-k,default3,help检索片段数)click.option(--show-sources,-s,is_flagTrue,help显示引用来源)defask(question,top,show_sources):向知识库提问。retrieverLocalRetriever()ifnotretriever.load(CACHE_DIR):click.echo(❌ 没有索引请先运行 localrag index folder)return# 检索resultsretriever.search(question,top_ktop)ifnotresults:click.echo(❌ 没有找到相关内容)return# 构建 Promptcontext\n\n.join(f[{r[source]}]{r[text][:500]}forrinresults)# 调用 LLMresponseclient.chat.completions.create(modeldeepseek-chat,messages[{role:system,content:SYSTEM_PROMPT.format(contextcontext)},{role:user,content:question},],temperature0.3,streamTrue,)# 流式输出forchunkinresponse:ifchunk.choices[0].delta.content:click.echo(chunk.choices[0].delta.content,nlFalse)click.echo()# 显示来源ifshow_sources:click.echo(f\n 引用来源)fori,rinenumerate(results):click.echo(f [{i1}]{r[source]}(相关度:{r[score]:.2f}))if__name____main__:cli()使用方式# 1. 索引文档python localrag.py index ./docs# ✅ 索引完成5 个文档 → 42 个片段# 2. 提问python localrag.py ask这个项目的架构是什么# 这个项目采用微服务架构包含 API 服务、数据库、缓存三层...# 3. 带来源引用python localrag.py ask部署流程是怎样的--show-sources# ...回答内容...# 引用来源# [1] deploy.md (相关度: 0.87)# [2] architecture.md (相关度: 0.72)性能特点全本地运行数据不出本机支持 PDF、MD、TXT 三种格式首次索引后缓存下次提问不用重新索引512 维 BGE 向量500 个 chunk 检索 50ms下一版可以加的功能增量索引新文件不需要重建全部索引Web UI 界面支持更多文件格式docx、csv切换不同 Embedding 模型总结一个本地 RAG 知识库核心就三步读文件 → 切分 chunk向量化 → 建立索引提问 → 检索 → LLM 回答把这三个功能封装成 CLI就是一个实用的生产力工具。本文是《AI 开发者工具链实战》系列的第 2 篇。上一篇命令行 AI 翻译工具下一篇AI 代码审查 CLI本文由 Zyentor智元界原创发布本文发布于 Zyentor智元界 —— AI 开发者社区原文链接https://www.zyentor.com/news/4130

相关新闻

基于CNN卷积神经网络手写汉字识别系统 (GUI界面)【源码38期】

基于CNN卷积神经网络手写汉字识别系统 (GUI界面)【源码38期】

一、项目简介本系统基于MATLAB深度学习工具箱,设计并实现了一个基于卷积神经网络(CNN)的手写汉字识别系统。系统包含三大核心模块:网络结构定义模块(get_self_net.m)封装了CNN网络构建函数,采用…

2026/7/4 4:16:08 阅读更多 →
YLB3118@ACP#国产8口SATA3.0存储芯片|物理AI长时序海量数据存储国产替代旗舰(对标ASM1166)

YLB3118@ACP#国产8口SATA3.0存储芯片|物理AI长时序海量数据存储国产替代旗舰(对标ASM1166)

一、前言:物理AI时代,存储已经成为算力落地的真正瓶颈2026年物理AI全面商用落地,智源悟道4.0物理世界模型、英伟达Vera Rubin仿真算力平台、特斯拉Optimus人形机器人,彻底改写了AI数据的生产逻辑。传统生成式AI以文本、短帧图像、…

2026/7/4 4:06:03 阅读更多 →
三菱伺服系统实现8轴追剪同步控制技术解析

三菱伺服系统实现8轴追剪同步控制技术解析

1. 项目背景与核心需求在工业自动化领域,多轴同步控制一直是高端装备制造的难点所在。这次我们要讨论的追剪案例,正是基于三菱伺服系统和编码器驱动实现的8轴协同作业系统。这种系统常见于包装、印刷、金属加工等行业,需要将连续运动的材料按…

2026/7/4 4:02:02 阅读更多 →

最新新闻

dotnet-framework-docker高级技巧:优化镜像大小与提升运行时性能的10个方法

dotnet-framework-docker高级技巧:优化镜像大小与提升运行时性能的10个方法

dotnet-framework-docker高级技巧:优化镜像大小与提升运行时性能的10个方法 【免费下载链接】dotnet-framework-docker The repo for the official docker images for .NET Framework on Windows Server Core. 项目地址: https://gitcode.com/gh_mirrors/do/dotne…

2026/7/4 5:24:31 阅读更多 →
5分钟快速上手lighterhtml:构建高性能Web应用的最佳实践

5分钟快速上手lighterhtml:构建高性能Web应用的最佳实践

5分钟快速上手lighterhtml:构建高性能Web应用的最佳实践 【免费下载链接】lighterhtml The hyperHTML strength & experience without its complexity 🎉 项目地址: https://gitcode.com/gh_mirrors/li/lighterhtml lighterhtml是一款兼具hyp…

2026/7/4 5:22:29 阅读更多 →
StudioPlugins Json助手:JsonHelper插件格式化与验证JSON数据

StudioPlugins Json助手:JsonHelper插件格式化与验证JSON数据

StudioPlugins Json助手:JsonHelper插件格式化与验证JSON数据 【免费下载链接】StudioPlugins Android Studio 精品插件合集,不在于多只在于精 项目地址: https://gitcode.com/gh_mirrors/st/StudioPlugins JsonHelper是Android Studio精品插件合…

2026/7/4 5:22:29 阅读更多 →
RestFB版本升级指南:从旧版本迁移到最新API的最佳实践

RestFB版本升级指南:从旧版本迁移到最新API的最佳实践

RestFB版本升级指南:从旧版本迁移到最新API的最佳实践 【免费下载链接】restfb RestFB is a simple and flexible Facebook Graph API client written in Java. 项目地址: https://gitcode.com/gh_mirrors/re/restfb RestFB是Java开发者连接Facebook Graph A…

2026/7/4 5:18:28 阅读更多 →
人大金仓数据库Linux安装超详细指南

人大金仓数据库Linux安装超详细指南

🔥关注墨瑾轩,带你探索编程的奥秘!🚀 🔥超萌技术攻略,轻松晋级编程高手🚀 🔥技术宝库已备好,就等你来挖掘🚀 🔥订阅墨瑾轩,智趣学习不…

2026/7/4 5:18:28 阅读更多 →
PMSM伺服控制三环架构设计与实现详解

PMSM伺服控制三环架构设计与实现详解

1. PMSM伺服控制系统仿真全解析永磁同步电机(PMSM)作为工业自动化领域的核心执行元件,其高性能伺服控制一直是工程师们面临的挑战。今天我将分享一个完整的三环控制架构实现方案,从理论框架到代码实现,再到参数整定技巧…

2026/7/4 5:18:28 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻