第66篇:用大模型 + 向量数据库构建你的个性化知识库系统(附实战代码)
🎯 摘要:本文将手把手教你如何利用大语言模型(LLM)和向量数据库构建一套个性化的知识管理系统。你可以轻松实现知识的自动归类、快速检索与智能总结,打造属于你自己的“数字大脑”。文章包含完整代码实战、部署指南、可视化界面设计,并提供多个行业案例参考。
一、知识库架构设计概览
我们采用如下五层结构来构建整个知识库系统:
数据源 → 数据采集与清洗 → 向量化 → 存入向量数据库
→ 用户提问 → 向量匹配检索 → LLM生成解释/摘要 → 知识卡片展示
整体流程图如下:
+-----------------+ +---------------+ +---------------------+
| 数据采集 | --> | 向量化处理 | --> | 向量数据库存储 |
+-----------------+ +---------------+ +---------------------+
|
v
+-------------------------+
| 用户提问 -> 检索相关知识 |
+-------------------------+
|
v
+-----------------------------+
| LLM生成摘要或详细解释 |
+-----------------------------+
|
v
+-----------------------------+
| 可视化展示(知识卡片) |
+-----------------------------+
二、数据采集与清洗【实战部分】
我们要从多种渠道获取原始知识,包括 RSS 订阅、微信公众号抓取和 Markdown 文件导入。
✅ 安装依赖包
pip install feedparser requests beautifulsoup4 langchain pinecone-client openai streamlit
1. RSS 抓取示例
import feedparser
def fetch_rss_feed(url):
feed = feedparser.parse(url)
articles = []
for entry in feed.entries:
title = entry.title
link = entry.link
summary = entry.summary if hasattr(entry, 'summary') else ''
articles.append({"title": title, "link": link, "content": summary})
return articles
使用示例:
rss_url = "https://realpython.com/feed.xml"
articles = fetch_rss_feed(rss_url)
print(articles[0])
输出:
{
"title": "Python Tricks: Magic Methods",
"link": "https://realpython.com/python-magic-methods/",
"content": "Magic methods are the special methods..."
}
2. 微信公众号内容提取(需配合爬虫工具)
以 WeChatSogou 为例:
pip install wechatsogou
import wechatsogou
ws_api = wechatsogou.WechatSogouAPI()
# 搜索某公众号历史文章
articles = ws_api.get_gzh_article_by_keyword("机器之心", "AI伦理")
for a in articles:
print(a['title'], a['url'])
3. Markdown 文件导入
import os
def read_md_files(directory):
documents = []
for fname in os.listdir(directory):
if fname.endswith(".md"):
with open(os.path.join(directory, fname), "r", encoding="utf-8") as f:
content = f.read()
documents.append({
"title": fname,
"source": fname,
"content": content
})
return documents
三、向量化与存储【实战部分】
我们将使用 LangChain 构建向量数据库,支持 Pinecone 或 Milvus 等后端。
1. 初始化 OpenAI Embedding 模型
from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(openai_api_key="YOUR_OPENAI_API_KEY")
2. 使用 Pinecone 创建向量数据库
import pinecone
pinecone.init(api_key="YOUR_PINECONE_API_KEY", environment="us-west1-gcp")
index_name = "knowledge-base"
if index_name not in pinecone.list_indexes():
pinecone.create_index(name=index_name, dimension=1536)
index = pinecone.Index(index_name)
3. 插入知识向量到 Pinecone
from uuid import uuid4
all_knowledge = [] # 假设你已经从多个来源收集了知识列表
for doc in all_knowledge:
text = doc["content"]
vector = embeddings.embed_query(text)
index.upsert([(str(uuid4()), vector, {"text": text, "title": doc["title"], "source": doc["source"]})])
四、知识检索与生成【实战部分】
1. 向量相似度搜索
query = "什么是Transformer?"
query_vector = embeddings.embed_query(query)
result = index.query(queries=[query_vector], top_k=3, include_metadata=True)
print(result)
输出示例:
{
"matches": [
{
"id": "abc123",
"score": 0.92,
"metadata": {
"text": "Transformer 是一种基于自注意力机制的深度学习模型...",
"title": "NLP核心技术之Transformer详解",
"source": "知乎"
}
},
...
]
}
2. 使用 LLM 生成解释或摘要
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(model_name='gpt-3.5-turbo', openai_api_key="YOUR_API_KEY")
prompt_template = """
请根据以下知识片段回答问题。如果有多条信息,请综合给出简明扼要的回答。
知识片段:
{context}
问题:
{question}
回答:
"""
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
context = "\n".join([match["metadata"]["text"] for match in result["matches"]])
final_prompt = prompt.format(context=context, question=query)
response = llm.predict(final_prompt)
print(response)
输出示例:
Transformer 是一种基于自注意力机制的深度学习模型,广泛应用于自然语言处理领域...
五、可视化与交互设计
1. 使用 Streamlit 构建前端界面
# frontend.py
import streamlit as st
import requests
st.set_page_config(page_title="我的知识库助手")
st.title("📚 我的知识库问答系统")
question = st.text_input("请输入你要查询的问题:")
if st.button("🔍 查询"):
payload = {"question": question}
res = requests.post("http://localhost:8000/query", json=payload)
answer = res.json().get("answer", "抱歉,没有找到相关信息。")
sources = res.json().get("sources", [])
st.markdown("### 💡 回答:")
st.write(answer)
st.markdown("### 📚 来源参考:")
for src in sources:
st.markdown(f"- [{src['title']}]({src['source']})")
运行前端:
streamlit run frontend.py
效果如下:
输入框:[请输入你要查询的问题]
按钮:[查询]
输出区域:显示答案 + 引用来源链接(点击可跳转)
六、实战案例研究
✅ 案例一:程序员专属知识库
1. 项目目标
打造一个属于程序员的知识管理系统,支持:
- RSS 技术博客抓取(如 RealPython、掘金)
- Markdown 笔记导入
- 向量化存储 + Pinecone 检索
- 基于 GPT 的问答与摘要生成
- Streamlit 可视化界面
2. 项目结构
coder-knowledge-base/
│
├── data/ # 存放抓取的文章和笔记
│ ├── rss_articles.json # RSS 文章缓存
│ └── notes/ # 用户上传的 Markdown 文件
│
├── src/
│ ├── config.py # 配置文件(API Key 等)
│ ├── fetchers/ # 数据采集模块
│ │ ├── rss_fetcher.py # RSS 抓取
│ │ └── md_reader.py # Markdown 导入
│ │
│ ├── vectorstore/ # 向量数据库操作
│ │ ├── pinecone_ops.py
│ │ └── embeddings.py
│ │
│ ├── llm/ # 大模型问答逻辑
│ │ └── qa_engine.py
│ │
│ └── app.py # FastAPI 后端接口
│
├── frontend/ # Streamlit 前端
│ └── main.py
│
├── requirements.txt
└── README.md
3. 核心代码示例
📁 src/fetchers/rss_fetcher.py
import feedparser
import json
from datetime import datetime
def fetch_rss_feed(url, limit=5):
feed = feedparser.parse(url)
articles = []
for entry in feed.entries[:limit]:
article = {
"title": entry.title,
"source": url,
"content": entry.summary,
"timestamp": datetime.now().isoformat()
}
articles.append(article)
return articles
📁 src/vectorstore/embeddings.py
from langchain.embeddings.openai import OpenAIEmbeddings
def get_embeddings():
return OpenAIEmbeddings(openai_api_key="YOUR_OPENAI_API_KEY")
📁 src/vectorstore/pinecone_ops.py
import pinecone
from uuid import uuid4
def init_pinecone(index_name="coder-kb"):
pinecone.init(api_key="YOUR_PINECONE_API_KEY", environment="us-west1-gcp")
if index_name not in pinecone.list_indexes():
pinecone.create_index(name=index_name, dimension=1536)
return pinecone.Index(index_name)
def insert_knowledge(index, knowledge_list, embeddings):
vectors = []
for doc in knowledge_list:
vector = embeddings.embed_query(doc["content"])
vectors.append((
str(uuid4()),
vector,
{"text": doc["content"], "title": doc["title"], "source": doc["source"]}
))
index.upsert(vectors=vectors)
📁 src/llm/qa_engine.py
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
def answer_question(query, context):
llm = ChatOpenAI(model_name='gpt-3.5-turbo', openai_api_key="YOUR_OPENAI_API_KEY")
prompt = PromptTemplate.from_template("""
请根据以下知识片段回答问题。如果有多条信息,请综合给出简明扼要的回答。
知识片段:
{context}
问题:
{question}
回答:
""")
final_prompt = prompt.format(context=context, question=query)
response = llm.predict(final_prompt)
return response
📁 src/app.py
(FastAPI 接口)
from fastapi import FastAPI
from pydantic import BaseModel
from src.vectorstore.pinecone_ops import init_pinecone, insert_knowledge
from src.vectorstore.embeddings import get_embeddings
from src.llm.qa_engine import answer_question
from src.fetchers.rss_fetcher import fetch_rss_feed
app = FastAPI()
class QueryRequest(BaseModel):
question: str
@app.post("/query")
def query_knowledge(req: QueryRequest):
index = init_pinecone()
embeddings = get_embeddings()
query_vector = embeddings.embed_query(req.question)
result = index.query(queries=[query_vector], top_k=3, include_metadata=True)
context = "\n".join([match['metadata']['text'] for match in result['matches']])
answer = answer_question(req.question, context)
sources = [match['metadata'] for match in result['matches']]
return {"answer": answer, "sources": sources}
📁 frontend/main.py
(Streamlit 前端)
import streamlit as st
import requests
st.set_page_config(page_title="程序员知识库助手")
st.title("🧠 程序员知识库问答系统")
question = st.text_input("请输入你要查询的问题:")
if st.button("🔍 查询"):
payload = {"question": question}
res = requests.post("http://localhost:8000/query", json=payload)
answer = res.json().get("answer", "抱歉,没有找到相关信息。")
sources = res.json().get("sources", [])
st.markdown("### 💡 回答:")
st.write(answer)
st.markdown("### 📚 来源参考:")
for src in sources:
st.markdown(f"- [{src['title']}]({src['source']})")
4. 部署说明
步骤 1:安装依赖
pip install -r requirements.txt
步骤 2:启动 FastAPI 后端
uvicorn src.app:app --reload
访问:http://localhost:8000/docs
查看 API 接口文档。
步骤 3:启动 Streamlit 前端
streamlit run frontend/main.py
✅ 案例二:医疗知识管理助手
1. 项目目标
为医生或研究人员打造一个医学知识管理系统,支持:
- 微信公众号医学文章抓取
- PDF 病历 OCR 提取
- 医学术语词典匹配
- LLM 自动分析症状与药物关系
- Streamlit 展示卡片式病历摘要
2. 项目结构
medical-knowledge-base/
│
├── data/
│ ├── wx_gzh_data.json
│ └── patient_records/
│ └── *.pdf
│
├── src/
│ ├── config.py
│ ├── fetchers/
│ │ ├── wechat_fetcher.py
│ │ └── pdf_ocr_extractor.py
│ │
│ ├── vectorstore/
│ │ ├── pinecone_ops.py
│ │ └── embeddings.py
│ │
│ ├── llm/
│ │ └── medical_qa.py
│ │
│ └── app.py
│
├── frontend/
│ └── dashboard.py
│
├── requirements.txt
└── README.md
3. 核心代码示例
📁 src/fetchers/wechat_fetcher.py
import wechatsogou
from datetime import datetime
def fetch_wechat_medical(keyword):
ws_api = wechatsogou.WechatSogouAPI()
results = ws_api.get_gzh_article_by_keyword("丁香医生", keyword, number=5)
articles = []
for item in results:
articles.append({
"title": item["title"],
"source": item["url"],
"content": item["abstract"],
"timestamp": datetime.now().isoformat()
})
return articles
📁 src/fetchers/pdf_ocr_extractor.py
from PIL import Image
import pytesseract
def extract_text_from_pdf(pdf_path):
image = Image.open(pdf_path)
text = pytesseract.image_to_string(image)
return text
📁 src/llm/medical_qa.py
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
def analyze_medical_query(query, context):
llm = ChatOpenAI(model_name='gpt-3.5-turbo', openai_api_key="YOUR_OPENAI_API_KEY")
prompt = PromptTemplate.from_template("""
你是一个医学助手,请基于以下资料回答问题:
知识片段:
{context}
问题:
{question}
回答(请用中文):
""")
final_prompt = prompt.format(context=context, question=query)
response = llm.predict(final_prompt)
return response
4. 部署说明
安装依赖
pip install wechatsogou pytesseract langchain openai pinecone-client streamlit
注意:需要安装 Tesseract OCR 并配置环境变量(官网)
启动后端服务
uvicorn src.app:app --reload
启动前端界面
streamlit run frontend/dashboard.py
🧩 总结
功能 | 程序员知识库 | 医疗知识库 |
---|---|---|
数据源 | RSS / Markdown | 微信公众号 / PDF |
向量化 | LangChain + Pinecone | 同上 |
问答引擎 | GPT 生成解释 | GPT 医学推理 |
前端展示 | Streamlit 卡片 | Streamlit 病历摘要 |
📌 这两个案例展示了如何使用大模型和向量数据库构建个性化知识库,分别面向程序员和技术爱好者、医生和医学研究者。你可以根据自己的需求选择适合的数据源、模型和交互方式。
七、总结与扩展建议
当前系统优势:
✅ 多源数据采集能力
✅ 支持向量化存储与语义检索
✅ 利用 LLM 实现智能问答
✅ 支持知识卡片与来源引用展示
可扩展方向:
-
知识图谱构建思路
- 使用 LLM 提取实体与关系;
- 构建图数据库(Neo4j)关联知识点;
- 支持推理路径(如:A引起B,B导致C);
-
自动化笔记整理与更新
- 结合时间戳排序;
- 设置定时任务自动拉取新内容;
- 使用 Tag 分类 + 推荐系统;
-
本地模型替代方案
- 替换为本地 embedding 模型(如 BERT、ChatGLM);
- 使用 FAISS 替代 Pinecone 实现离线检索;
-
权限控制与协作功能
- 不同用户组访问不同知识域;
- 支持多人协作添加知识条目;
-
移动端适配
- 构建 PWA 或小程序版本;
- 支持语音输入提问;
📌 附录:推荐工具与资源
功能模块 | 推荐工具/库 |
---|---|
数据采集 | feedparser, WeChatSogou, requests |
向量化 | LangChain + OpenAI / Sentence Transformers |
向量数据库 | Pinecone, Milvus, FAISS |
大模型问答 | OpenAI GPT, HuggingFace Transformers |
前端展示 | Streamlit, React |
数据展示 | Plotly, ECharts |
📌 结语:通过本文的学习,你应该能够掌握如何搭建一个完整的个人知识库系统,涵盖数据采集、向量化、存储、检索与生成等关键环节。这套系统可以成为你终身学习的“外脑”,帮助你高效整理、检索与理解海量知识。
如果你喜欢这篇文章,欢迎点赞、收藏、转发,也欢迎关注我的专栏《AI大模型应知应会100篇》持续更新中 👇
如有疑问或需要定制开发,请留言或私信我,我们将持续为你提供高质量的人工智能内容。