人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习【免费下载链接】agent-coreopenJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力项目地址https://gitcode.com/openJiuwen/agent-core点击查看免费下载导读TripleExtractor是 openJiuwen agent-core 检索retrieval模块中基于大语言模型LLM实现的开源信息抽取OpenIE三元组抽取器负责把文本分块TextChunk转换成 RDF 风格的subject, predicate, object三元组为 GraphRAG 图索引与图谱检索提供数据底座。本文以 TripleExtractor API 文档 为主体结合 triple_extractor.py 源码、单元测试 与 GraphKnowledgeBase 调用链完整讲解其初始化参数、抽取流程、可选校验机制、提示词模板、结果解析与错误处理并给出可直接落地的接入示例。1. 功能定位与设计背景TripleExtractor属于索引流水线indexing pipeline中 Processor 体系的一环。整个抽取器体系继承结构如下Processor所有处理器Parser、Chunker、Extractor的抽象基类定义process()方法见 processor/base.pyExtractor抽取器抽象基类在process()中直接转发给extract()见 extractor/base.pyTripleExtractor本文主角实现 OpenIE 三元组抽取及可选校验OntologyTripleExtractor同目录下的本体约束变体支持按ontology_classes约束实体类别见 ontology_triple_extractor.py。从源码结构看TripleExtractor是通用型抽取器不依赖外部图数据库仅通过 LLM 从文本中抽取实体与关系因此可嵌入GraphKnowledgeBasegraph_knowledge_base.py等图增强知识库作为块索引 三元组索引双索引中的三元组生产者。2. 类签名与初始化参数根据 API 文档与 triple_extractor.py#L27-L50构造签名如下TripleExtractor( llm_client: Any, # LLM 客户端实例必填 model_name: str, # 模型名称必填 temperature: float 0.0, # 采样温度默认 0.0 max_concurrent: int 50, # 最大并发数默认 50 validate: bool False, # 是否启用 LLM 校验默认 False **kwargs: Any # 预留扩展参数 )各参数含义与底层影响参数类型默认值说明与底层影响llm_clientAny无必填LLM 客户端实例。源码中仅要求具备async invoke(messages..., temperature...)能力测试中以AsyncMock代替见 test_triple_extractor.py#L22-L26model_namestr无必填模型名称构造时保存到self.model_name用于标识本次抽取使用的模型temperaturefloat0.0采样温度。默认 0.0 保证抽取结果稳定、可复现每次 LLM 调用都会透传给llm_client.invoke()max_concurrentint50最大并发数。构造时创建asyncio.Semaphore(max_concurrent)约束同时进行的 LLM 请求数防止打爆模型服务validateboolFalse是否在抽取后再做一轮 LLM 校验。True时每个分块额外一次校验调用过滤掉不被原文直接支持的三元组**kwargsAny—预留参数用于向后兼容与扩展源码中的初始化行为triple_extractor.py#L46-L50self.llm_client llm_client self.model_name model_name self.temperature temperature self.limiter asyncio.Semaphore(max_concurrent) self.validate validate3. 核心方法extractextract是唯一的公开异步入口签名与行为见 triple_extractor.py#L52-L80async def extract( self, chunks: List[TextChunk], **kwargs: Any, ) - List[Triple]输入List[TextChunk]即文本分块列表例如[TextChunk(...), TextChunk(...)]输出List[Triple]合并所有成功分块抽取出的三元组例如[Triple(...), Triple(...)]行为先执行_extract_internal()并行抽取若构造时validateTrue再执行_validate_internal()逐块校验并过滤异常任一分块失败时按分块顺序抛出第一个错误BaseError原样上抛其他异常被包装为BaseError。TextChunk与Triple的数据模型分别定义在 document.py 与 triple.pyTextChunk包含id_分块 ID、text文本内容、doc_id父文档 ID、metadata元数据字典与可选embeddingTriplePydantic 模型字段为subject、predicate、object三个字符串外加metadata字典抽取时写入doc_id与chunk_id用于追溯三元组的来源。3.1 两阶段执行逻辑extract()的完整执行链路源码见 triple_extractor.py#L169-L272抽取阶段_extract_internal为每个分块创建 asyncio 任务_extract_chunk任务内先获取信号量再调用_build_prompt()构造提示词并交给_invoke_and_parse()调用 LLM、解析结果校验阶段_validate_internal仅当validateTrue且存在三元组时触发。先把候选三元组按metadata[chunk_id]分组defaultdict(list)再对每个有候选三元组的分块发起校验 LLM 调用校验提示词由_build_validation_prompt()构造结果汇聚_gather_results用asyncio.gather(..., return_exceptionsTrue)等待全部任务将成功结果扁平化合并记录第一个异常及其对应分块 ID最后统一抛出BaseError原样上抛普通异常包装为RETRIEVAL_KB_TRIPLE_EXTRACTION_PROCESS_ERROR。4. LLM 调用与结果解析4.1 调用方式LLM 交互发生在_invoke_and_parse()triple_extractor.py#L83-L117messages [{role: user, content: prompt}] completion await self.llm_client.invoke( messagesmessages, temperatureself.temperature, ) triples, parse_success self._parse_triples( completion.content, chunk.doc_id, chunk.id_ )即构造单条 user 消息 → 异步调用invoke→ 用_parse_triples解析模型返回文本。解析失败时抛出RETRIEVAL_KB_TRIPLE_EXTRACTION_PROCESS_ERROR错误消息形如{chunk.id_}: LLM response could not be parsed as valid triple JSON。4.2 解析规则_parse_triples解析器位于 triple_extractor.py#L443-L516对模型输出非常宽容先strip()去除首尾空白若以 开头则剥离首尾围栏行兼容 markdown 围栏 JSON使用json_repair.repair_json(content, return_objectsTrue)修复模型常见的破损 JSON兼容两种顶层结构带triples键的字典或直接是三元组数组的列表逐条校验跳过非列表/元组项、长度不足 3 的项、以及前三个元素包含嵌套结构或None的项三元组只取前三个元素忽略多余字段每个合法三元组构造Triple(subject..., predicate..., object..., metadata{doc_id: doc_id, chunk_id: chunk_id})三个字段均strip()返回(triples, parse_success)空三元组列表被视为解析成功([], True)而硬解析失败返回([], False)若存在非法项则以 warning 日志记录被忽略的数量。以下测试用例test_triple_extractor.py#L147-L199精确印证了解析行为[[a, b, c]]→ 成功得到 1 条三元组(a, b, c)[[a, b, c, ignored, 99]]→ 成功多余字段被忽略object仍为c{triples: [[x, y, z]]}→ 字典包裹形式解析成功{named_entities: [Alice, Bob], triples: [[Alice, knows, Bob]]}→ 只取triples命名实体列表不参与三元组构造{named_entities: [Alice, Bob]}→ 缺少triples键解析失败{triples: [[a, b, c], [x], {bad: 1}, [y, [nested], z]]}→ 非法项被忽略仅保留合法 1 条{triples: [[x], {bad: 1}]}→ 全部非法解析失败。5. 提示词模板抽取与校验两套 Prompt提示词构造是纯代码内嵌模板不依赖外部配置文件源码见 triple_extractor.py#L274-L441。5.1 抽取提示词_build_prompt输入为passage分块正文与可选title取自chunk.metadata.get(title, )标题为空时回退为Untitled。模板要点任务定义要求模型根据给定标题与段落构建 RDF 风格图抽取命名实体与关系输出恰好一个合法 JSON 对象输出格式顶层必须且只能包含两个键named_entities字符串数组与triples数组其中每条三元组必须是恰好三个字符串组成的 JSON 数组质量要求尽量解析代词为具体名字优先使用至少包含一个最好两个来自原文的命名实体的三元组实体与谓词措辞保持与源语言一致不输出重复三元组无三元组时返回{named_entities: [...], triples: []}两个 Few-shot 示例分别以 NBA 球星 Magic Johnson 与游戏 Elden Ring 为演示展示实体命名与关系谓词如drafted by、director的规范化写法。模板占位符最终通过prompt_template.format(passagepassage, titletitle or Untitled)填充。5.2 校验提示词_build_validation_prompt当validateTrue时使用。输入为原文段落与候选三元组候选三元组序列化方式triples_text json.dumps( [[t.subject, t.predicate, t.object] for t in triples], ensure_asciiFalse, indent2, )校验指令要求模型扮演 OpenIE 三元组校验器仅输出被原文直接支持的三元组允许为了正确性或清晰度修改谓词丢弃依赖外部知识、日期/数字/地点不匹配、或无法由文本必然成立的三元组输出格式为只含triples键的单个 JSON 对象无合法三元组时返回{triples: []}。5.3 校验的调用代价测试用例 test_extract_multiple_chunks_with_validation 验证2 个分块在validateTrue时llm_client.invoke被调用4 次每块抽取 1 次 校验 1 次即校验模式会把 LLM 调用量翻倍。因此在吞吐敏感场景下validate默认关闭是合理选择追求图质量时再显式开启。6. 错误处理与并发控制6.1 并发控制构造时创建asyncio.Semaphore(max_concurrent)抽取与校验的每个分块任务都在async with self.limiter:内执行保证任意时刻在途 LLM 请求数不超过max_concurrent所有分块任务通过asyncio.create_task并发调度再由asyncio.gather(return_exceptionsTrue)汇聚单个分块失败不会拖垮整批任务。6.2 错误语义统一错误码定义在 codes.py#L585-L588RETRIEVAL_KB_TRIPLE_EXTRACTION_PROCESS_ERROR ( 155507, retrieval kb_triple_extraction process error, reason: {error_msg}, )三种典型失败路径场景触发点处理方式LLM 返回不可解析 JSON_invoke_and_parse中_parse_triples返回parse_successFalse直接抛出BaseError错误信息含分块 ID 与could not be parsed字样LLM 调用抛普通异常如 HTTP 429_extract_chunk/_validate_chunk的except Exception分支记录 error 日志后包装为BaseErrorcause保留原始异常分批结果中存在异常_gather_results按分块顺序抛出第一个错误BaseError原样上抛普通异常包装并附带first_error_chunk_id测试用例 test_extract_with_exception 印证当invoke抛出Exception(429 too many requests)时extract会抛出 code 为155507的BaseError且消息包含原始异常文本test_extract_invalid_json 印证非法 JSON 同样映射到该错误码。7. 在知识库流水线中的接入位置7.1 与 GraphKnowledgeBase 的协作GraphKnowledgeBase的构造函数接受extractor: Optional[Extractor]参数graph_knowledge_base.py#L36-L63。在其add_documents()中graph_knowledge_base.py#L127-L153当self.config.use_graph为真且提供了extractor时先对分块调用await self.extractor.extract(chunks)若产出三元组则创建名为kb_{kb_id}_triples的三元组索引并把每条三元组转换为文本格式f{subject} {predicate} {object}的TextChunk写入索引同时在metadata中保留原始三元组 JSON。相关开关定义于 common/config.pyKnowledgeBaseConfig.use_graph默认False决定是否启用图索引以及RetrievalConfig.use_graph/graph_expansion控制检索阶段是否走图检索与图谱扩展。7.2 最小接入示例结合源码接口一个可运行的接入骨架如下LLM 客户端以具备async invoke的对象为例import asyncio from openjiuwen.core.retrieval.common.document import TextChunk from openjiuwen.core.retrieval.indexing.processor.extractor.triple_extractor import TripleExtractor async def main(): # 1. 构造抽取器temperature 用 0 保证稳定并发控制在 10 extractor TripleExtractor( llm_clientllm_client, # 需要支持 async invoke(messages..., temperature...) model_nameyour-model-name, temperature0.0, max_concurrent10, validateTrue, # 开启二次校验过滤不被原文支持的三元组 ) # 2. 准备分块 chunks [ TextChunk(id_1, textAlice knows Bob and works at Company., doc_iddoc_1), TextChunk(id_2, textCharlie is a manager at Startup., doc_iddoc_1), ] # 3. 并行抽取 校验返回 List[Triple] triples await extractor.extract(chunks) for t in triples: print(t.subject, t.predicate, t.object, t.metadata) # metadata 含 doc_id 与 chunk_id asyncio.run(main())7.3 生产使用建议稳定性优先抽取场景默认temperature0.0避免同一文本反复抽取产生不一致的实体与谓词按吞吐调节并发max_concurrent应根据模型服务限流阈值设置默认 50 适合并发能力较强的服务限流时如 429错误会被包装为BaseError抛出建议在上游配合重试策略图质量 vs 成本权衡validateTrue会翻倍 LLM 调用但能过滤幻觉式三元组依赖外部知识、日期/数字/地点不符等适合对图谱准确性要求高的场景容错解析模型输出即使包裹在 markdown 围栏或存在轻微 JSON 破损_parse_triples也会借助json_repair尽力修复并忽略非法条目实测中只需保证顶层结构合法即可成功。8. 总结TripleExtractor以一次抽取 可选一次校验的两阶段 LLM 流水线把非结构化的文本分块转化为带doc_id/chunk_id溯源信息的三元组列表是 openJiuwen agent-core 图增强知识库GraphRAG索引的关键生产者。它通过信号量限流、并发任务汇聚、宽容 JSON 解析与统一错误码兼顾了吞吐、容错与结果的可用性validate开关则为需要在图质量与调用成本之间做出权衡的场景提供了明确抓手。读者可依据 triple_extractor.py、单元测试 与 GraphKnowledgeBase 深入验证以上全部行为。赞分享人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习【免费下载链接】agent-coreopenJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力项目地址https://gitcode.com/openJiuwen/agent-core点击查看免费下载相关推荐openJiuwen agent-core Extractor 抽象基类解析LLM 驱动的 RDF 三元组抽取与知识图谱索引openJiuwen agent core Extractor 抽象基类解析LLM 驱动的 RDF 三元组抽取与知识图谱索引 本篇文章聚焦 openJiuwe人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 本体约束三元组抽取器OntologyTripleExtractor深入解析openJiuwen agent core 本体约束三元组抽取器OntologyTripleExtractor深入解析 导读 本文围绕 openJiuwen人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openjiuwen.core 检索索引三元组抽取器Extractor深度解析OpenIE 提取与本体约束校验实践openjiuwen.core 检索索引三元组抽取器Extractor深度解析OpenIE 提取与本体约束校验实践 openjiuwen.core.ret人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习上一篇libModSecurity 在 Windows 上的完整构建指南基于 Visual Studio 2022、Conan 与 Docker下一篇Rusted PackFile Manager如何一站式打造专业《全面战争》模组创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考