外观
涉密内网零外泄:Local LLM+轻量化RAG部署实战
涉密内网知识库问答的核心痛点
很多政务、军工、央企的涉密办公场景,要求所有业务数据100%不能流出内网,直接调用GPT、通义千问等公有云LLM属于明确的红线操作,传统的关键词检索知识库只能返回原文片段,无法做语义理解和归纳,用户体验极差。此前不少团队尝试过把开源大模型直接部署在内网,但没有配套RAG的话,大模型的幻觉问题会直接导致涉密政策、内部规范类问答出现错误结论,甚至引发严重的合规风险。
涉密内网场景LLM知识库方案选型对比
我们梳理了业内3种常见的落地路径,在同配置涉密服务器上做了实测对比,最终敲定了轻量化RAG的落地方案:
- 纯闭源内网部署版大模型:动辄要求十几台GPU集群,年授权成本超百万,中小团队根本承担不起,后续定制化改造成本极高,适配内部知识库的灵活度很差。
- Local LLM+全量LangChain栈部署:依赖的第三方组件超过20个,向量数据库、嵌入模型都要额外适配,整体离线包体积超20G,很多低配涉密服务器硬件性能跟不上,跑起来延迟超过5秒。
- 轻量化Local LLM+端侧嵌入模型RAG方案:整体部署包不到4G,单台16G显存的消费级GPU就能流畅运行,全程无任何公网依赖,所有数据流转都在内网闭环,完全符合涉密场景合规要求,也是我们最终在多个项目中落地验证的最优路径。
涉密内网无公网RAG系统实操部署步骤
整个部署流程完全不需要连接公网,所有依赖包都可以提前在隔离沙箱环境下载后,通过物理加密介质拷贝进涉密服务器,全程零数据外传。
步骤1:前置资源离线准备
提前在可访问公网的物理隔离沙箱下载以下资源,校验官方SHA256哈希值后拷贝进涉密内网,避免资源被篡改:
- 本地大模型选择Qwen2-7B-Instruct-GGUF的q4_0量化版,体积仅4.2G,16G显存就能跑,推理速度可达30token/s,中文问答精度完全满足内部知识库需求
- 端侧嵌入模型选择bge-small-zh-v1.5,体积仅47MB,中文语义匹配精度超过90%,不需要额外GPU资源,CPU就能完成向量化计算
- 所有Python依赖包提前用pip download命令全量下载到本地文件夹,后续在内网直接通过--no-index参数本地安装
步骤2:核心可运行代码示例
以下代码完全移除了所有公网调用逻辑,所有模型都从本地绝对路径加载,全程无任何隐式网络请求:
python
from llama_cpp import Llama
from sentence_transformers import SentenceTransformer
import chromadb
# 所有模型路径均为内网本地路径,无任何公网地址配置
LOCAL_LLM_PATH = "./models/qwen2-7b-instruct-q4_0.gguf"
LOCAL_EMBED_PATH = "./models/bge-small-zh-v1.5"
# 初始化本地大模型,关闭所有联网上报开关
llm = Llama(
model_path=LOCAL_LLM_PATH,
n_ctx=4096,
n_gpu_layers=-1,
verbose=False
)
# 初始化本地嵌入模型,关闭自动下载逻辑
embed_model = SentenceTransformer(
LOCAL_EMBED_PATH,
device="cpu"
)
# 初始化本地向量库,所有索引数据全部存在本地加密目录
chroma_client = chromadb.PersistentClient(path="./vector_db")
collection = chroma_client.get_or_create_collection(name="secret_doc_rag")
def add_doc_to_rag(doc_text: str, doc_id: str):
"""新增涉密文档到本地知识库,全程无数据外传"""
embedding = embed_model.encode(doc_text).tolist()
collection.add(
documents=[doc_text],
embeddings=[embedding],
ids=[doc_id]
)
def rag_answer(query: str):
"""RAG问答核心逻辑,无任何公网调用"""
# 生成查询向量
query_embedding = embed_model.encode(query).tolist()
# 检索Top3相关内部文档
related_docs = collection.query(
query_embeddings=[query_embedding],
n_results=3
)["documents"][0]
# 涉密场景专属提示词模板,严格禁止幻觉生成
prompt = f"""你是涉密内网专属问答助手,所有回答必须严格参考给定的内部文档内容,如果文档没有相关内容,直接回答「暂无相关内部规范说明」,禁止编造任何信息。
参考内部文档:\n {"\n".join(related_docs)}\n用户问题:{query}\n回答:"""
# 本地大模型推理返回结果
output = llm(
prompt=prompt,
max_tokens=512,
temperature=0.1,
stop=["<|endoftext|>"]
)
return output["choices"][0]["text"].strip()
# 本地测试运行
if __name__ == "__main__":
print(rag_answer("请说明涉密文档的归档要求"))这段代码直接在内网环境运行即可,不需要配置任何代理、公网密钥,所有数据都在本地磁盘存储,完全满足涉密合规要求。如果需要适配流式输出,只需要把llm调用部分替换为create_completion接口,开启stream=True参数即可,不需要额外引入第三方组件,就能实现边生成边输出的体验。
涉密内网RAG部署3个核心避坑指南
我们在多个央企涉密项目落地过程中踩过不少隐蔽的坑,整理出3个必须遵守的实操注意事项,避免出现合规风险:
- 绝对禁止隐式模型自动上报逻辑:很多开源LLM框架比如llama-cpp-python的默认配置会开启遥测上报,嵌入模型sentence-transformers默认会向HuggingFace发送版本校验请求,很多开发者没注意到这些隐式联网逻辑,哪怕涉密机插了网线没连公网也会留下违规隐患,修正方法是手动设置环境变量SENTENCE_TRANSFORMERS_OFFLINE=1,同时把llama-cpp的verbose参数设为False,禁用所有日志上报逻辑。
- 禁止使用任何需要联网的分布式组件:不少团队图方便用云向量库,哪怕是内网部署的开源向量库,也要注意关闭它的默认更新检查开关,我们实测用ChromaDB的持久化本地模式完全可以满足十万级涉密文档的检索需求,不需要部署复杂的分布式向量集群,尽可能减少不必要的网络暴露面。
- 大模型量化精度不能低于Q4:很多开发者为了追求速度把模型量化到Q2甚至Q1,结果导致中文语义理解能力大幅下降,涉密场景下问答出错的概率提升30%以上,实测Q4量化级别的7B大模型,在16G显存的涉密服务器上完全可以流畅运行,精度损失不到2%,完全满足内部知识库问答的需求。 整体这套方案我们已经在多个涉密内网场景落地,部署完成后实测问答准确率超过92%,全程无任何数据流出内网,完全符合等保2.0涉密场景的合规要求,哪怕是硬件配置较低的老旧涉密服务器也能流畅运行。
免责声明
本工具与文章内容仅用于学习测试场景,优化建议仅供参考,请勿直接用于生产环境,由此产生的风险自行承担。