knowledge-gpt
基于 RAG 架构从网页、PDF、YouTube 等多源数据中提取知识并用 GPT 精准问答的 Py
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于 RAG 架构从网页、PDF、YouTube 等多源数据中提取知识并用 GPT 精准问答的 Py
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你手头有 50 篇 PDF 论文、一份产品手册、一个包含 200 节课的 YouTube 播放列表,以及几十个相关网站——你需要从这些海量异构数据中快速找到某个问题的答案。传统方式是什么?人工逐一搜索,或者把资料全部复制给 ChatGPT——但这既低效,又存在数据泄露风险。
Knowledge-GPT 正是为解决这一痛点而生。这个由 geeks-of-data 团队开发的 Python 工具库,通过 RAG(检索增强生成)架构,让 GPT 能够"阅读"几乎任意格式的信息源,并基于这些内容回答用户提问。它的核心理念是:把知识变成向量,把向量存入索引,把索引交给 GPT。
Knowledge-GPT 的代码结构高度模块化,采用了经典的提取器模式(Extractor Pattern),整体分为三层:
第一层:BaseExtractor(核心抽象类)
位于 knowledgegpt/extractors/base_extractor.py,是整个项目的骨架。它定义了统一的接口规范,所有具体 Extractor 都继承自它。BaseExtractor 负责两件核心工作:
compute_doc_embeddings_hf(HuggingFace)或 compute_doc_embeddings(OpenAI),将文本块转化为 768/1536 维稠密向量,存入 FAISS 索引。answer_query_with_context,将用户问题转化为向量,在 FAISS 中做最近邻搜索,召回最相关的文本块,拼成 prompt 交给 GPT 生成答案。BaseExtractor 还支持将向量索引持久化到本地(pickle + CSV),下次查询时直接 load_index=True 跳过计算环节。
第二层:多源 Extractor(继承 BaseExtractor)
| Extractor | 数据源 | 关键技术 |
|---|---|---|
WebScrapeExtractor | 网页 | BeautifulSoup + cloudscraper |
PDFExtractor | pdfminer.six / PyPDF2 | |
DocsExtractor | Word 文档 | python-docx |
PowerpointExtractor | PPTX | python-pptx |
YTSubsExtractor | YouTube 字幕 | yt_dlp + 直接字幕 API |
YoutubeAudioExtractor | YouTube 音频 | yt_dlp + Whisper (OpenAI) |
每个 Extractor 只需实现 prepare_df() 方法,将原始数据转换为统一的 DataFrame 格式(text + title 列),其余流程由 BaseExtractor 自动完成。
第三层:BaseAgent(扩展层)
BaseAgent 在 BaseExtractor 基础上增加了任务规划能力,能根据用户查询自动选择任务类型(图像生成 / 图像描述),并调用 HuggingFace 推理 API 执行。它还集成了 Wikipedia 数据获取器(wiki_fetcher)。
向量模型选择方面,项目支持两种嵌入方案:
索引策略上,FAISS CPU 版本用于 ANN(近似最近邻)检索,支持 basic 和高级索引类型。TODO 中还列出了切换到 Pinecone/Milvus/Qdrant 等向量数据库的规划,但尚未实现。
提示词构造是 RAG 系统的灵魂。construct_prompt 函数将检索到的相关文本块与用户问题拼接成结构化 prompt,支持自定义 prompt template。项目还实现了 strict_context 模式,要求 GPT 严格基于上下文回答,降低幻觉风险。
安装(pip 一行命令):
pip install knowledgegpt
python3 -m spacy download en_core_web_sm
从网页提取知识:
from knowledgegpt.extractors.web_scrape_extractor import WebScrapeExtractor
import openai
openai.api_key = "sk-..."
scrape_website = WebScrapeExtractor(
url="https://en.wikipedia.org/wiki/Bombard_(weapon)",
embedding_extractor="hf",
model_lang="en"
)
answer, prompt, messages = scrape_website.extract(
query="What is a bombard?",
max_tokens=300,
to_save=True
)
print(answer)
# 输出: 'A bombard is a type of large cannon used during the 14th to 15th centuries.'
REST API 模式:
uvicorn server:app --reload # 启动服务
Docker 模式:
docker build -t knowledgegptimage .
docker run -p 8888:8888 knowledgegptimage
注:Docker 默认启动 Jupyter Notebook,若要启动 REST API 需在容器内执行
uvicorn server:app --host 0.0.0.0 --port 8888。
活跃度警示: 该项目最后一次代码提交停留在 2023 年 4 月 25 日,距今已超过 2 年,属于归档状态。
主要局限:
SECRET_KEY 保存在 example_config.py,存在安全隐患。技术债:
Knowledge-GPT 代表了 RAG 技术的多模态扩展方向——将检索增强从纯文本拓展到 PDF、PPT、音频、视频等多个模态。它的价值在于降低了 RAG 应用的技术门槛:开发者无需从零构建爬虫、解析器、向量化和检索模块,一个库搞定所有环节。
虽然项目已不再活跃更新,但其设计思路(Extractor 模式 + FAISS + GPT)对后来者仍有参考价值。当前 RAG 生态已演进到 GraphRAG、HyDE、Self-RAG 等高级范式,但 Knowledge-GPT 的多源数据接入能力在特定场景下仍有不可替代性。
项目速览: