基于 LangChain 与 Gradio 搭建个人知识助手
本文介绍如何利用 LangChain、Gradio、ChromaDB 及 FlagEmbedding 构建本地个人知识助手。通过检索增强生成(RAG)技术,结合讯飞星火大模型 API,实现基于私有数据的智能问答。文章涵盖环境配置、知识库建立、向量模型下载、API 密钥设置及完整代码实现,旨在帮助用户快速搭建安全可控的本地 AI 应用。主要流程包括文本分块、向量化存储、检索链构建及 Gradio 界面部署,并提供后续优化方向建议。

本文介绍如何利用 LangChain、Gradio、ChromaDB 及 FlagEmbedding 构建本地个人知识助手。通过检索增强生成(RAG)技术,结合讯飞星火大模型 API,实现基于私有数据的智能问答。文章涵盖环境配置、知识库建立、向量模型下载、API 密钥设置及完整代码实现,旨在帮助用户快速搭建安全可控的本地 AI 应用。主要流程包括文本分块、向量化存储、检索链构建及 Gradio 界面部署,并提供后续优化方向建议。

检索增强生成(RAG, Retrieval-Augmented Generation)技术能够有效解决大模型在特定领域知识上的幻觉问题。通过构建本地知识库,利用向量数据库存储文档片段,并结合大语言模型进行上下文问答,用户可以搭建安全、可控的个人知识助手。
本文将详细介绍如何使用 Python 生态中的 LangChain 框架、Gradio 界面库、ChromaDB 向量数据库以及 FlagEmbedding 模型,结合讯飞星火 API,快速搭建一个支持私有数据查询的智能助手。
本项目基于 Python 3.8.5 及以上版本开发。LangChain 对版本有一定要求,过低版本可能存在兼容性问题。
使用 pip 安装所需的核心依赖包。如果网络不稳定,建议使用国内镜像源(如清华源)加速下载。
pip install flask chromadb gradio fastapi langchain "FlagEmbedding"
注意:
FlagEmbedding 包含 PyTorch 和 Transformer 等依赖,首次安装耗时较长。FlagEmbedding 以利用 GPU 加速。建议创建如下项目结构:
project_root/
├── data/ # 存放知识库文本文件 (.txt)
├── models/ # 存放 BGE 向量模型权重
├── SparkApi.py # 讯飞 API 调用封装
├── SparkGPT.py # 讯飞 LLM 包装类
├── prompt_utils.py # 提示词模板
└── app.py # Gradio 主程序入口
将需要咨询的文档整理为纯文本格式(UTF-8 编码)。例如,可以将 PDF 或 Word 内容转换为 .txt 文件。
本文使用 BGE (BAAI General Embedding) 中文向量模型,该模型在中文语义理解方面表现优异。
原始模型权重托管于 Hugging Face,需安装 Git LFS 工具后克隆。
git lfs install
git clone https://huggingface.co/BAAI/bge-large-zh
下载完成后,将 bge-large-zh 文件夹移动至项目根目录下的 models 文件夹中。
为了演示方便,本示例选用讯飞星火大模型 API。用户需前往讯飞开放平台注册账号并申请免费 Token。
在控制台创建应用后,获取以下三个关键参数:
在 SparkGPT.py 中实现讯飞星火的 WebSocket 连接逻辑。核心步骤包括签名计算、消息构造及流式响应处理。
# SparkGPT.py 核心逻辑示意
import SparkApi
from abc import ABC, abstractmethod
class SparkGPT(ABC):
def __init__(self, appid, api_secret, api_key):
self.appid = appid
self.api_secret = api_secret
self.api_key = api_key
@abstractmethod
def generate(self, question: str) -> str:
pass
提示:实际项目中请确保
SparkApi.py中包含完整的鉴权逻辑,此处仅展示接口定义。用户需在代码中填入真实的 APPID、APISecret 和 APIKey。
使用 RecursiveCharacterTextSplitter 对长文本进行分块,并通过 FlagModel 生成向量嵌入。
from langchain.text_splitter import RecursiveCharacterTextSplitter
from FlagEmbedding import FlagModel
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
# 加载向量模型
model_path = "./models/bge-large-zh"
embedding_model = FlagModel(model_path, use_fp16=True) # 开启半精度加速
# 加载文档
docs = []
for file in os.listdir("./data"):
if file.endswith(".txt"):
loader = TextLoader(f"./data/{file}")
docs.extend(loader.load())
# 切分文档
split_docs = text_splitter.split_documents(docs)
# 存入 ChromaDB
vectorstore = Chroma.from_documents(documents=split_docs, embedding=embedding_model)
结合 Prompt 模板与大模型,构建完整的问答链。
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
prompt_template = """基于以下已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说无法回答。
已知信息:{context}
问题:{question}
"""
PROMPT_TEMPLATE = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
# 初始化检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 初始化 QA 链
qa_chain = RetrievalQA.from_chain_type(
llm=spark_llm_instance, # 此处传入封装好的 SparkGPT 实例
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": PROMPT_TEMPLATE}
)
使用 Gradio 快速构建 Web UI,允许用户输入问题并查看结果。
import gradio as gr
def ask_question(question):
try:
result = qa_chain({"query": question})
return result["result"]
except Exception as e:
return f"发生错误:{str(e)}"
with gr.Blocks() as demo:
gr.Markdown("# 个人知识助手")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(label="请输入您的问题", placeholder="在此输入...")
btn = gr.Button("提交")
with gr.Column():
output_text = gr.Textbox(label="回答结果")
btn.click(fn=ask_question, inputs=input_text, outputs=output_text)
demo.launch()
在项目根目录下执行以下命令启动应用:
python app.py
终端将输出类似 Running on local URL: http://127.0.0.1:7860 的信息。
打开浏览器访问上述地址,即可看到交互界面。输入关于知识库的问题,系统将基于检索到的上下文生成回答。
当前实现为基础版本,后续可从以下方向进行优化:
通过上述步骤,我们成功搭建了一个基于 RAG 架构的个人知识助手。该方案无需依赖第三方云服务存储敏感数据,有效保障了信息安全性。开发者可根据实际需求调整组件配置,进一步拓展应用场景。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online