一、引言
自 graphrag-Chinese-llm 项目启动以来,其核心目标始终是利用大语言模型(LLM)从中文非结构化文本中自动化构建高质量的知识图谱。
在实践中我们发现,图谱构建的质量极大程度上取决于 实体与关系提取 这一核心环节的精度和稳定性。
传统的、依赖于简单指令式 Prompt 的方法,在面对复杂或专业领域的文本时,往往存在:
- 输出格式不稳定
- 关键信息遗漏
为了解决这些问题,我们引入了基于 langextract 库 与 Google Gemini 模型 的全新提取引擎。本文将深入剖析这一新架构的技术实现、设计思想及其带来的显著优势。
项目地址: https://github.com/via007/graphrag-Chinese-llm
二、传统 Prompt 方法的局限性
在旧工作流中,我们主要通过精心设计的 Prompt 指示 LLM 完成提取任务,但存在以下问题:
- 格式一致性差:LLM 生成具有随机性,即使有格式要求,也难保证输出结构统一。
- 复杂任务表达力不足:对于多实体、多关系、附加属性等复杂提取,Prompt 难以精确定义。
- 泛化与稳定性的矛盾:Prompt 过于泛化会降低精度,过于具体则在新场景中适应性差。
因此,我们需要一种 更稳定、更精确、更可扩展 的结构化数据提取范式。
三、技术深潜:基于 langextract
的全新提取引擎
新架构的核心是位于 graphrag/index/operations/extract_graph/langext.py
的 LangExtractor 类 ,它基于 Few-Shot Learning 构建了完整的提取流程,主要包含四大组件:
1. 任务描述 (Schema Definition)
python
self.prompt_description = textwrap.dedent("""
从以下历史文本中,提取所有定义的实体,包括:
"人物"、"组织"、"地点"、"时间"、"事件"、"群体"、"会议"、"重大政策"
对于每一个实体,请根据上下文提供一句简洁的描述。
同时,识别并描述实体之间的关系,并为每个关系评估其紧密程度(1-10分)。
""")
2. 示例驱动 (Few-Shot Examples)
python
self.examples = [
lx.data.ExampleData(
text="一九四六年八月六日,领导在与美国记者安娜·路易斯·斯特朗的谈话中指出...",
extractions=[
lx.data.Extraction(
extraction_class="人物",
extraction_text="领导",
attributes={
"entity_description": "领导,提出"坚持就是胜利"的论点。"
}
),
# ... 其他实体 ...
lx.data.Extraction(
extraction_class="relationship",
extraction_text="领导指出坚持就是胜利。",
attributes={
"entity1": "领导",
"entity2": "坚持",
"strength": "10",
"relationship_description": "领导是"坚持"理论的提出者和核心阐释者。"
}
),
# ... 其他关系 ...
]
)
]
通过 输入-输出对 (IO Pairs) 演示任务,让模型在 In-Context Learning 中学习抽取逻辑,提高精度与格式一致性。
3. 核心提取调用 (The Engine Call)
python
def _run_sync_extraction(self, text: str) -> List[lx.data.Extraction]:
result = lx.extract(
text_or_documents=text,
prompt_description=self.prompt_description,
examples=self.examples,
model_id="gemini-2.5-flash", # 指定模型
api_key=self.api_key,
use_schema_constraints=True, # 强制模式约束
format_type=lx.data.FormatType.JSON, # 结构化 JSON 输出
debug=False
)
return result.extractions
关键参数:
-
model_id="gemini-2.5-flash"
:指定使用 Gemini。 -
use_schema_constraints=True
:强制 Gemini 输出遵循 JSON 模式。 -
format_type=JSON
:确保结果为结构化数据。
4. 输出格式化 (Output Formatting)
python
def _format_extractions(
extractions: List[lx.data.Extraction],
tuple_delimiter: str = "<|>",
record_delimiter: str = "##",
# ...
) -> str:
output_parts = []
for ext in extractions:
if ext.extraction_class in entity_types:
record = f'("entity"{tuple_delimiter}...)'
output_parts.append(record)
elif ext.extraction_class == "relationship":
record = f'("relationship"{tuple_delimiter}...)'
output_parts.append(record)
final_output = record_delimiter.join(output_parts)
return final_output
该方法作为 适配器 ,将提取结果转化为 GraphRAG 可消费的格式,保证模块无缝集成。
四、新架构的价值与影响
-
精度与召回率显著提升:示例学习提升了复杂任务的识别能力。
-
稳定性大幅增强 :
use_schema_constraints
确保输出格式 100% 可控。 -
语义信息更丰富:不仅抽取实体和关系,还附带描述与强度评分。
-
可扩展性卓越:新增任务只需补充示例,无需重新设计复杂 Prompt。
五、结论
graphrag-Chinese-llm 项目通过集成 langextract 与 Gemini,实现了从"指令式 Prompt"到"示例驱动式提取"的范式转变。
这次升级带来了:
-
精度
-
稳定性
-
可扩展性
的全面提升,为后续更复杂的知识应用与推理奠定了坚实基础。
我们欢迎社区的朋友们试用新版本,并提出宝贵的意见。