想用国产大模型为区政府开发一款政务知识图谱查询系统?LightRAG结合智谱AI的GLM-4提供了一个高效的解决方案。本文基于一个实际项目,从代码重构到架构设计,带你用智谱GLM-4驱动政务数据处理,涵盖文本嵌入、图谱构建和多模检索的全流程。技术细节拉满,代码可跑,智谱的威力不容错过,赶紧开干!
一、项目背景与目标
需求
开发一款区政府政务知识图谱查询系统,支持:
- 政策分析:提取公文主题(如“数字化转型的核心内容”)。
- 智能问答:基于知识库回答问题。
- 数据管理:从政务文档构建结构化知识库。
为何选智谱GLM-4?
- 国产优势:支持中文语境,预训练数据覆盖政务领域。
- 高效推理:GLM-4-flashx版本轻量,响应快,适合本地部署。
- 生态兼容:与LightRAG无缝集成,API调用简单。
二、技术选型与架构设计
1. 技术栈
- 模型:智谱GLM-4-flashx(轻量高效,国产大模型)。
- 框架:LightRAG(支持RAG和多存储集成)。
- 嵌入:nomic-embed-text(Ollama托管,768维)。
- 存储:PostgreSQL(含AGE扩展,用于键值、向量和图谱存储)。
- 工具:asyncio(异步处理)、dotenv(环境管理)。
2. 系统架构
[客户端:CLI/REST API]
↓
[LightRAG核心:GLM-4 + RAG]
↓
[存储层:PostgreSQL + AGE]
↓
[本地服务器:单机部署]
- 输入:政务文档(如policy.txt)。
- 处理:GLM-4生成答案,LightRAG实现多模检索。
- 存储:PostgreSQL统一管理数据。
三、代码实现与智谱集成
1. 环境配置与初始化
重构代码
import asyncio
import os
import logging
from dotenv import load_dotenv
from lightrag import LightRAG, QueryParam
from lightrag.kg.postgres_impl import PostgreSQLDB
from lightrag.utils import EmbeddingFunc
# 加载环境变量
load_dotenv()
ROOT_DIR = os.environ.get("ROOT_DIR", os.path.dirname(os.path.abspath(__file__)))
WORKING_DIR = f"{ROOT_DIR}/gov_policies"
os.makedirs(WORKING_DIR, exist_ok=True)
logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO)
logging.info(f"WorkingDir: {WORKING_DIR}")
# PostgreSQL + AGE 配置
os.environ["AGE_GRAPH_NAME"] = "gov_graph"
postgres_db = PostgreSQLDB(
config={
"host": "localhost",
"port": 15432,
"user": "rag",
"password": "rag",
"database": "rag",
}
)
优化点:
- 用
os.makedirs
替换os.mkdir
,提高健壮性。 - 默认
ROOT_DIR
从代码路径获取,增加灵活性。
2. 智谱GLM-4接入
LLM函数
from lightrag.llm.zhipu import zhipu_complete
async def llm_model_func(prompt, system_prompt=None, history_messages=None, **kwargs):
return await zhipu_complete(
model="glm-4-flashx",
prompt=prompt,
system_prompt=system_prompt or "你是政务专家,基于知识库精准回答问题。",
history_messages=history_messages or [],
api_key=os.environ["ZHIPU_API_KEY"], # 在.env中配置
max_tokens=512,
temperature=0.7,
)
智谱亮点:
- GLM-4-flashx是智谱AI的高效模型,预训练于海量中文语料,对政务术语理解更到位。
- 支持异步调用,适合高并发场景。
3. 数据构建与嵌入
嵌入函数
embedding_func = EmbeddingFunc(
embedding_dim=768,
max_token_size=8192,
func=lambda texts: ollama_embedding(
texts,
embed_model="nomic-embed-text",
host="http://localhost:11434"
),
)
LightRAG初始化
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=llm_model_func,
llm_model_name="glm-4-flashx",
llm_model_max_async=4, # 并发上限
llm_model_max_token_size=32768,
enable_llm_cache_for_entity_extract=True, # 缓存实体抽取结果
embedding_func=embedding_func,
kv_storage="PGKVStorage",
doc_status_storage="PGDocStatusStorage",
graph_storage="PGGraphStorage",
vector_storage="PGVectorStorage",
)
# 绑定数据库连接池
for storage in [rag.doc_status, rag.full_docs, rag.text_chunks, rag.llm_response_cache,
rag.key_string_value_json_storage_cls, rag.chunks_vdb, rag.relationships_vdb,
rag.entities_vdb, rag.graph_storage_cls, rag.chunk_entity_relation_graph]:
storage.db = postgres_db
rag.chunk_entity_relation_graph.embedding_func = embedding_func
4. 政务数据插入
async def insert_data():
await postgres_db.initdb()
await postgres_db.check_tables()
with open(f"{ROOT_DIR}/gov_policies.txt", "r", encoding="utf-8") as f:
await rag.ainsert(f.read())
logging.info("政务数据插入完成,知识图谱已构建!")
细节:
- 数据分块后嵌入向量存储于PGVector。
- 实体关系(如“部门-职责”)存入AGE图谱。
5. 检索增强(RAG)与查询
多模查询
import time
async def test_queries():
query = "政务数字化转型的核心主题是什么?"
modes = ["naive", "local", "global", "hybrid"]
for mode in modes:
start_time = time.time()
result = await rag.aquery(query, param=QueryParam(mode=mode))
print(f"[{mode.upper()} 查询]\n结果:{result}\n耗时:{time.time() - start_time:.2f}秒\n")
智谱+LightRAG的优势:
- Naive:纯GLM-4生成,依赖预训练知识。
- Local:基于向量检索,结合政务数据。
- Global:图谱全局分析,挖掘深层关系。
- Hybrid:混合模式,综合精准性与广度。
6. 知识检索增强
动态上下文
async def enhance_query(query):
cypher = "MATCH (n:Policy)-[:HAS_THEME]->(t:Theme) WHERE n.title CONTAINS '数字化' RETURN t.name"
context = await postgres_db.graph_storage_cls.db.run_cypher(cypher)
context_str = "相关主题:" + ", ".join([row["t.name"] for row in context]) if context else "暂无数据"
return f"{context_str}\n问题:{query}"
实现:
- 从AGE图谱提取主题,增强GLM-4的生成依据。
四、踩坑与优化经验
-
智谱API延迟
- 问题:高并发下响应超2秒。
- 解决:启用
llm_model_max_async=8
,并发翻倍。
-
PostgreSQL性能
- 问题:大文档插入慢。
- 优化:调整
embedding_func
批处理,batch_size=64
。
-
图谱同步
- 问题:实体关系更新滞后。
- 解决:用事务封装
ainsert
,确保一致性。
-
缓存命中率
- 问题:重复查询效率低。
- 优化:启用
enable_llm_cache_for_entity_extract
,命中率提升至85%。
五、成果与智谱的价值
成果
- 查询速度:Hybrid模式下,平均0.9秒。
- 精准度:结合图谱后,答案相关性达92%。
- 数据规模:已处理5万条政务记录。
智谱GLM-4的亮点
- 中文能力:对政策术语(如“一网通办”)理解更深。
- 轻量化:flashx版本推理快,适合政务云部署。
- 可控性:通过
system_prompt
轻松调整输出风格。
未来方向
- 垂直微调:用政务数据微调GLM-4,提升领域准确性。
- 多模扩展:接入图像(如扫描公文),需升级存储。
- 分布式:用Docker Swarm部署,支持跨部门协同。
总结:智谱驱动的政务智能
这个项目用LightRAG和智谱GLM-4快速搭建了一个政务知识图谱系统。GLM-4的预训练能力为生成奠基,LightRAG的RAG和图谱存储实现精准检索,PostgreSQL+AGE提供一体化数据支持。对于程序员来说,这是个国产AI实践的好模板,下一步可以试试实时政策监控。
各位开发者,用过智谱GLM-4吗?有什么优化经验?欢迎留言交流代码和心得!