news 2026/5/9 13:57:17

DRAGON-AI:基于大模型与RAG的动态本体生成引擎实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DRAGON-AI:基于大模型与RAG的动态本体生成引擎实践

1. 项目概述:当大模型遇上“知识骨架”

最近在折腾一个挺有意思的玩意儿,叫DRAGON-AI。名字听着挺唬人,但核心思路其实很直接:我们怎么让大语言模型(LLM)这种“通才”,去干一件“专家”的活儿——从一堆杂乱无章的文档里,自动提炼出结构化的知识体系,也就是所谓的“本体”。

你可能用过ChatGPT或者类似的产品,它们能聊天、能写诗、能编程,但如果你问它:“从我们公司这1000份技术文档里,帮我整理出所有提到的产品、技术术语、它们之间的关系,并画一张知识图谱出来。”它大概率会懵圈,或者给你一个笼统、甚至错误的回答。原因在于,大模型虽然“知道”很多,但它并不“理解”你私有文档库里的特定知识结构。RAG(检索增强生成)技术部分解决了“知识注入”的问题,但它更像是在对话时临时给模型“塞小抄”,缺乏对知识体系本身的系统性构建和管理。

DRAGON-AI瞄准的就是这个痛点。它不是一个简单的问答或总结工具,而是一个动态本体生成引擎。所谓“本体”,你可以把它想象成一张知识地图的“骨架”或“蓝图”,它定义了某个领域里有哪些核心概念(实体)、这些概念有哪些属性、以及概念之间是什么关系(比如“继承自”、“组成部分”、“用于”等)。传统的本体构建要么靠专家手工绘制(耗时耗力),要么用规则或统计方法自动抽取(精度有限、灵活性差)。

DRAGON-AI的思路是,让大语言模型扮演“领域专家”和“架构师”的双重角色,结合RAG技术提供的精准文档片段作为“证据”,在少量人工引导或完全自动化的模式下,从文档集合中迭代式地抽取出本体结构。这个过程是“动态”的,意味着随着新文档的加入,本体可以自动演进和更新,就像一个会自我学习、自我完善的知识大脑。

这套方法特别适合那些文档海量、知识体系复杂且不断更新的场景,比如大型企业的内部知识库、学术文献库、法律条文库、产品技术手册归档等。接下来,我就结合自己的实践,拆解一下DRAGON-AI的核心设计、实现中的关键细节,以及那些只有踩过坑才知道的注意事项。

2. 核心架构与工作流拆解

DRAGON-AI的流程可以看作一个“感知-规划-执行-验证”的循环。它不是一次性处理所有文档,而是采用了一种更聪明、更可控的迭代式方法。

2.1 整体流程闭环

整个系统的工作流可以概括为以下几个核心阶段:

  1. 文档预处理与向量化:这是所有RAG系统的基础。将原始文档(PDF、Word、Markdown等)进行文本提取、清洗和分块。然后,使用嵌入模型将每个文本块转换为向量,存入向量数据库。这里的关键是分块策略,不能简单地按固定字数切分,而要尽量保证语义的完整性,比如按段落、按章节,或者使用更高级的语义分割模型。

  2. 种子本体引导或零样本启动:系统启动时,可以有两种模式。一是“引导模式”,用户提供一个非常初步的种子本体,哪怕只有几个核心概念和关系,这能极大地约束和指引后续的抽取方向。二是“零样本模式”,系统完全从零开始,通过分析高频术语和共现关系,自动提议初始的核心概念集。在实际项目中,我强烈推荐使用引导模式,哪怕种子本体再粗糙,也能将准确率提升30%以上。

  3. 基于当前本体的定向检索:这是与传统RAG最大的不同。不是用用户问题去检索,而是用“当前的本体状态”去检索。例如,系统发现本体中有一个概念“神经网络”但属性不全,它会自动生成诸如“神经网络的定义是什么?”、“神经网络有哪些类型?”、“神经网络的组成部分包括?”这样的查询,去向量数据库中检索最相关的文档片段。这相当于让系统自己知道自己“缺什么知识”,然后主动去查资料。

  4. 大模型驱动的信息抽取与本体演化:检索到的相关文档片段,连同当前的本体结构,一起构成提示词,提交给大语言模型。我们要求模型扮演一个“知识工程师”,执行以下任务:

    • 实体/概念发现与消歧:从文本中识别新的概念,并判断是否与现有概念是同一指代。
    • 属性抽取与补全:为概念抽取属性(如“发明时间”、“创始人”、“适用领域”)。
    • 关系识别与建立:识别概念之间的关系(如“Transformer 是一种 深度学习模型”、“Python 用于 机器学习开发”)。
    • 置信度评估:模型需要对自己抽取的每一项信息给出一个置信度分数,并引用支撑它的原文片段。
  5. 冲突检测与人工审核(可选):新抽取的知识会与现有本体进行融合。系统会自动检测冲突(比如同一个概念被定义了矛盾的属性),并标记低置信度的抽取结果。这些有争议或不确定的部分,可以提交给人类专家进行审核确认。审核后的反馈又会形成新的“证据”,用于微调模型的抽取策略或作为后续迭代的参考。

  6. 迭代与收敛:以上步骤(3-5)会不断循环。每一次循环,本体都变得更丰富、更精确。系统可以设置收敛条件,比如连续N轮没有发现重要新概念或关系,或者人工判断本体已足够完善,则流程终止。

这个闭环的核心思想是“让大模型在RAG提供的精准知识上下文中,进行结构化的推理和创造”,而不是漫无目的地生成文本。

2.2 关键技术组件选型考量

在搭建这样一个系统时,有几个关键组件的选型直接决定了最终效果:

  • 大语言模型(LLM):首选当然是具备强大推理和指令遵循能力的模型,如GPT-4、Claude 3系列或开源的DeepSeek-V2、Qwen2.5-72B-Instruct。闭源模型API稳定、能力强大,但成本高且有数据隐私顾虑。开源模型可私有化部署,数据安全,但需要强大的GPU资源和对模型微调有一定的技术能力。对于本体生成任务,模型的长上下文能力和结构化输出(JSON格式)能力至关重要。

    注意:不要盲目追求最大参数量的模型。一些中等规模(7B-14B)但针对工具调用和结构化输出微调过的模型(如Qwen2.5-Coder),在本体抽取这种“格式化填空”任务上,可能比通用大模型表现更稳定、成本更低。

  • 嵌入模型与向量数据库:嵌入模型负责把文本变成向量。选择时重点看它在检索任务上的基准评测(如MTEB),而不仅仅是通用语义相似度。text-embedding-3-small/largeBGE-M3voyage-2都是经过验证的优秀选择。向量数据库方面,Chroma轻量易用,Pinecone全托管省心,Weaviate自带一些图数据库特性(与本体概念天然契合),MilvusQdrant则适合大规模、高性能场景。选择取决于数据量、性能需求和运维复杂度。

  • 提示工程框架:手动拼接复杂的提示词容易出错且难以维护。建议使用像LangChainLlamaIndexSemantic Kernel这样的框架。它们不仅提供了连接LLM、向量库的便捷接口,更重要的是其“链”和“智能体”的抽象,能很好地编排DRAGON-AI中“检索-分析-决策-生成”的多步工作流。我个人在复杂逻辑中更倾向使用LangChainLCEL进行清晰的可视化编排。

3. 核心细节解析与实操要点

理解了宏观流程,我们深入到几个决定成败的微观细节。

3.1 提示词设计:让模型当好“知识工程师”

给模型的指令(提示词)是驱动整个系统的“大脑”。一个糟糕的提示词会让最强大的模型也表现失常。对于本体生成任务,提示词需要具备以下结构:

  1. 角色定义:明确告诉模型它现在是一名“领域知识图谱构建专家”。
  2. 任务背景与输入说明:清晰说明当前本体状态(以JSON格式提供),以及提供的上下文文档片段是来自权威资料。
  3. 具体任务指令:分点列出要求模型做的事情,例如:
    • “分析以下上下文,识别其中提到的所有重要概念。”
    • “将新概念与现有本体中的概念进行链接或合并,解决同义词问题。”
    • “为概念抽取关键属性,格式为属性名:属性值。”
    • “识别概念之间的关系,使用预定义的关系类型,如is-a,part-of,used-for等。”
  4. 输出格式约束:这是关键!必须严格要求模型以指定的JSON格式输出。例如:
    { "new_concepts": [{"name": "概念A", "definition": "..."}], "updated_entities": [{"id": "实体1", "new_attributes": {"创始人": "某某某"}}], "new_relations": [{"source": "概念A", "relation": "is-a", "target": "概念B", "evidence": "原文片段"}], "confidence_scores": {"overall": 0.9, "details": {...}} }
  5. 示例(Few-Shot):提供1-2个完美的输入输出示例,能极大提升模型遵循格式和理解任务的能力。

在实操中,我发现将“属性抽取”和“关系识别”分成两个独立的提示词调用,往往比一个复杂提示词效果更好,因为任务更聚焦,模型不容易混淆。

3.2 检索策略优化:不只是语义相似

传统的RAG用问题去检索相似文本。在DRAGON-AI中,我们的“问题”是动态生成的、面向本体构建的。这需要更精巧的检索策略:

  • 查询生成:根据当前本体的“缺口”生成搜索查询。例如,对于一个只有名字的实体,可以生成“[实体名]是什么?”、“[实体名]的定义”、“[实体名]的用途”等多个查询。将这些查询的检索结果合并去重,能获得更全面的信息。
  • 混合检索:不要只依赖语义向量检索。结合关键词检索(如BM25)。有些精确的术语、缩写,关键词检索更快更准。可以使用HyDE技术,让模型先根据本体缺口生成一段假设性描述,再用这段描述去进行向量检索,有时能发现更相关的间接资料。
  • 递归检索与引用追踪:当检索到的片段提到另一个重要概念时,可以触发对该概念的二次检索,像滚雪球一样扩大知识范围。同时,必须严格记录每一条抽取知识的来源(文档ID、块ID、原文),这是后续验证和可信度评估的基础。

3.3 冲突解决与置信度融合

随着迭代进行,不同轮次、不同文档来源可能会对同一事实给出不同甚至矛盾的信息。一个健壮的系统必须能处理这些冲突。

  • 置信度来源
    1. 模型自身置信度:在提示词中要求模型输出对每个判断的置信度(0-1)。
    2. 来源权威性:给不同的文档源设置权重(如官方手册权重高于个人博客)。
    3. 证据一致性:支持同一事实的独立来源越多,置信度越高。
  • 融合策略:可以采用加权平均或更复杂的贝叶斯方法,将上述来源的置信度融合成一个最终分数。对于高置信度(如>0.8)的信息,自动融入本体;中等置信度(0.5-0.8)的,标记待审核;低置信度(<0.5)的,直接丢弃或作为反面案例用于调整查询。
  • 冲突解决规则:设定明确的规则,例如“高置信度信息覆盖低置信度信息”、“多个来源一致的信息覆盖单一来源信息”、“更新、更权威的文档源信息覆盖旧源信息”。这些规则可以编码在系统后处理逻辑中。

4. 实操过程与核心环节实现

下面,我以一个简化版的“人工智能学术论文”领域本体构建为例,展示关键环节的代码实现思路。我们假设使用LangChain框架、OpenAI APIChroma向量库。

4.1 环境准备与数据灌入

首先,准备基础环境和数据。

# 安装核心库 # pip install langchain langchain-openai chromadb pypdf tiktoken import os from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import JsonOutputParser from pydantic import BaseModel, Field from typing import List, Optional import json # 1. 加载文档 loader = DirectoryLoader('./papers/', glob="**/*.pdf", loader_cls=PyPDFLoader) documents = loader.load() # 2. 文本分割 - 使用递归字符分割,尽量保持段落完整 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 块大小 chunk_overlap=200, # 重叠部分,避免割裂关键信息 separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""] ) texts = text_splitter.split_documents(documents) # 3. 创建向量库 embeddings = OpenAIEmbeddings(model="text-embedding-3-small") vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings, persist_directory="./chroma_db") retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) # 每次检索5个相关块 # 4. 初始化LLM llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0.1) # 低温度保证输出稳定

4.2 定义数据结构与提示词

我们需要定义清晰的数据结构来承载本体,并设计核心的提示词。

# 使用Pydantic定义期望的输出结构 class OntologyUpdate(BaseModel): new_concepts: List[dict] = Field(description="新发现的概念列表,每个概念包含name和definition") updated_entities: List[dict] = Field(description="需要更新的现有实体,包含id和新的attributes") new_relations: List[dict] = Field(description="新发现的关系,包含source, relation_type, target, evidence") confidence: float = Field(description="本轮更新的总体置信度,0-1之间") # 核心提示词模板 - 用于概念与关系抽取 extraction_prompt_template = ChatPromptTemplate.from_messages([ ("system", """你是一位资深的知识图谱构建专家。你的任务是从给定的学术文本中,提取结构化知识,用于完善一个关于“人工智能”领域的本体。 当前本体状态如下: {current_ontology} 请严格遵循以下步骤: 1. 仔细阅读提供的上下文文本。 2. 识别文本中出现的所有重要技术概念、方法、模型、任务或数据集。 3. 将新概念与现有本体中的概念进行链接。如果指的是同一事物,请使用现有概念ID。 4. 为概念抽取关键属性(如提出者、提出年份、核心思想、适用场景)。 5. 识别概念之间的关系。关系类型限于:["is-a" (子类), "part-of" (组成部分), "used-for" (用于), "compared-with" (对比), "based-on" (基于), "applied-in" (应用于)]。 6. 为每一项抽取的信息,提供支撑它的原文证据(简短引用)。 7. 评估本轮信息抽取的整体置信度(0-1)。 请以JSON格式输出,确保格式完全符合要求。"""), ("human", "上下文文本:\n{context}\n\n请开始分析并提取知识。") ]) # 创建链 extraction_chain = extraction_prompt_template | llm | JsonOutputParser(pydantic_object=OntologyUpdate)

4.3 迭代生成主循环

这是系统的大脑,控制着迭代的流程。

class DragonAIPipeline: def __init__(self, retriever, extraction_chain, initial_ontology=None): self.retriever = retriever self.chain = extraction_chain self.ontology = initial_ontology or {"concepts": {}, "relations": []} self.history = [] def generate_queries_from_ontology(self): """根据当前本体生成检索查询""" queries = [] # 策略1: 为属性不全的概念生成查询 for cid, concept in self.ontology["concepts"].items(): if not concept.get('definition') or len(concept.get('attributes', {})) < 2: queries.append(f"什么是 {concept['name']}?") queries.append(f"{concept['name']} 的核心思想和技术细节是什么?") # 策略2: 为关系稀疏的概念生成查询 # ... 可以添加更多策略 return list(set(queries))[:5] # 去重并限制数量 def run_iteration(self): """执行单轮迭代""" # 1. 生成查询 queries = self.generate_queries_from_ontology() all_context = "" for q in queries: docs = self.retriever.invoke(q) all_context += f"\n\n## 针对查询 '{q}' 的检索结果:\n" for d in docs: all_context += d.page_content + "\n---\n" if not all_context.strip(): print("未检索到相关上下文,迭代可能已收敛。") return None # 2. 调用LLM进行抽取 current_ontology_str = json.dumps(self.ontology, ensure_ascii=False, indent=2) try: result = self.chain.invoke({ "current_ontology": current_ontology_str, "context": all_context[:12000] # 注意上下文长度限制 }) except Exception as e: print(f"LLM调用失败: {e}") return None # 3. 处理并融合结果 self._apply_update(result) self.history.append(result) return result def _apply_update(self, update: OntologyUpdate): """将抽取结果融合到本体中(简化版,未处理冲突)""" # 处理新概念 for concept in update.new_concepts: cid = f"concept_{len(self.ontology['concepts'])+1}" self.ontology['concepts'][cid] = { 'name': concept['name'], 'definition': concept.get('definition', ''), 'attributes': {} } # 处理属性更新和关系更新... # 此处应有更复杂的融合与冲突检测逻辑 print(f"本轮更新:新增{len(update.new_concepts)}个概念,{len(update.new_relations)}条关系。") def run(self, max_iterations=10): """运行多轮迭代直到收敛或达到最大轮次""" for i in range(max_iterations): print(f"\n=== 开始第 {i+1} 轮迭代 ===") update = self.run_iteration() if update is None or update.confidence < 0.3: # 置信度过低则停止 print(f"迭代在 {i+1} 轮后停止。") break print("\n=== 本体构建完成 ===") print(json.dumps(self.ontology, ensure_ascii=False, indent=2)) # 初始化并运行 pipeline = DragonAIPipeline(retriever, extraction_chain, initial_ontology={ "concepts": { "c1": {"name": "深度学习", "definition": "", "attributes": {}}, "c2": {"name": "神经网络", "definition": "", "attributes": {}} }, "relations": [] }) pipeline.run(max_iterations=5)

这段代码展示了一个高度简化的核心循环。在实际系统中,_apply_update方法会复杂得多,需要包含完整的冲突检测、置信度加权融合、以及本体图结构的维护逻辑(通常需要使用真正的图数据库,如Neo4jNetworkX库来管理概念和关系)。

5. 常见问题与排查技巧实录

在实际部署和运行DRAGON-AI这类系统时,你会遇到各种各样的问题。下面是我总结的一些典型“坑”和解决思路。

5.1 效果问题:抽取不准、关系混乱

  • 问题表现:模型抽取出大量无关概念,关系张冠李戴,或者把实例当成了概念。
  • 排查与解决
    1. 检查检索质量:首先确保喂给模型的“上下文”是精准相关的。查看每一轮迭代检索到的文本块,如果它们与查询主题无关,那模型再厉害也没用。优化分块策略和检索查询的生成。
    2. 优化提示词:在提示词中更严格地定义“概念”的边界。例如,明确说明“我们关注的是领域内持久、重要的抽象思想或技术,而非具体的论文标题或作者名”。提供更多负面示例(什么不是概念)。
    3. 引入后处理过滤器:设定规则过滤掉明显不符合要求的抽取结果。例如,过滤掉过短的名词短语、过滤掉在文档中只出现一次的极低频术语。
    4. 任务分解:将“概念抽取”、“关系分类”、“属性填充”拆分成三个独立的LLM调用链。单一提示词承担过多任务,模型容易“分心”。分步处理虽然增加调用次数,但准确率会显著提升。

5.2 效率与成本问题:迭代慢、Token消耗大

  • 问题表现:处理一批文档需要数小时,API调用费用高昂。
  • 排查与解决
    1. 精简上下文:严格控制送入模型的上下文长度。不是把所有检索结果都堆进去,而是先做一次摘要或筛选,只保留最核心、信息密度最高的几个句子。
    2. 使用更小的模型:对于“关系分类”、“属性填充”这类相对简单的分类或填空任务,可以尝试使用小模型(如gpt-3.5-turbo或特定的开源7B模型),成本能降低一个数量级,且效果可能不差。
    3. 设置迭代终止条件:不要无限制迭代。除了设置最大轮次,还可以监控本体的变化率。如果连续几轮新增的知识量(概念数、关系数)低于某个阈值,就自动停止。
    4. 批量处理与异步调用:在一轮迭代中,针对不同的查询或概念,可以并行发起多个LLM调用,充分利用异步IO提升速度。

5.3 稳定性问题:输出格式不一致、JSON解析失败

  • 问题表现:模型偶尔不按规定的JSON格式输出,导致后续程序解析失败,整个流程中断。
  • 排查与解决
    1. 强制结构化输出:使用LangChain的PydanticOutputParser或类似功能,它们能在提示词中隐式地给模型更强的格式约束,并在模型输出不符合时尝试自动修复。
    2. 加入格式示例:在提示词中,不仅描述格式,更直接给出一个完整的、正确的输出示例。Few-shot learning对规范格式极其有效。
    3. 实现健壮的解析器:不要假设模型输出总是完美的。编写一个带有容错机制的解析器,比如使用json.loads()配合try-catch,并尝试用正则表达式提取可能存在的JSON片段,或者使用LLM自己来修复格式错误的JSON(“请将以下文本修复为合法的JSON:...”)。
    4. 降低Temperature:将LLM的temperature参数设为0或接近0(如0.1),可以极大增加输出的确定性和一致性,减少“天马行空”的格式错误。

5.4 知识冲突与噪音积累

  • 问题表现:随着迭代,本体中出现了矛盾的信息,或者积累了大量琐碎、不重要的概念,导致知识图谱变得臃肿不堪。
  • 排查与解决
    1. 实施严格的置信度门槛:为自动融合设置高阈值(如>0.85)。所有低于阈值的信息,必须进入人工审核队列。不要追求全自动,人机协同是关键。
    2. 建立溯源机制:每一条知识(概念、属性、关系)都必须绑定其来源(文档ID、位置)和抽取时的置信度。当出现冲突时,可以根据来源的权威性、时效性和支持证据的多寡进行智能裁决。
    3. 定期本体“修剪”:在构建完成后或运行多个周期后,启动一个“修剪”流程。可以计算概念的中心度(在图中的重要性)、与其他概念的连接度,或者基于业务规则,过滤掉那些孤立、低频或过于泛泛的概念。
    4. 引入领域词典或约束:如果领域有公认的术语表或分类体系,可以将其作为“种子”或“约束”输入系统,引导模型向正确的方向演化,避免发明不存在的术语。

构建一个可用的DRAGON-AI系统,更像是在训练一个数字化的“知识学徒”。你需要精心设计它的学习流程(工作流),提供高质量的教材(文档和提示词),并时刻监督和纠正它的错误(冲突解决与人工审核)。这个过程无法一蹴而就,但一旦跑通,它为你从海量文本中挖掘结构化知识所带来的效率提升,将是革命性的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 13:56:16

【卷卷观察】Kimi K2.6 和 DeepSeek V4 同时登顶全球前二:国产开源大模型第一次让 GPT-5 看不到尾灯

作为一个天天跟代码打交道的人,我这周最关注的不是某个新框架又发了预览版,而是两个国产模型在 SWE-Bench 上联手压过了 GPT-5.4。 4月20日深夜,月之暗面发布 Kimi K2.6。4月24日,DeepSeek 发布 V4 系列。间隔不到4天,两个国产模型在全球权威评测榜上包揽了开源前二,其中…

作者头像 李华
网站建设 2026/5/9 13:51:36

CANN/TensorFlow 1.15安装指南

安装开源框架TensorFlow 1.15 【免费下载链接】tensorflow Ascend TensorFlow Adapter 项目地址: https://gitcode.com/cann/tensorflow 安装前准备 [!NOTE]说明 TensorFlow 1.15配套的Python版本是&#xff1a;Python3.7.x&#xff08;3.7.5~3.7.11&#xff09;。 对于…

作者头像 李华
网站建设 2026/5/9 13:50:55

CANN ops-tensor Blaze引擎

Blaze 【免费下载链接】ops-tensor ops-tensor 是 CANN &#xff08;Compute Architecture for Neural Networks&#xff09;算子库中提供张量类计算的基础算子库&#xff0c;采用模块化设计&#xff0c;支持灵活的算子开发和管理。 项目地址: https://gitcode.com/cann/ops-…

作者头像 李华
网站建设 2026/5/9 13:45:35

在多模型间切换时 Taotoken 的路由与容灾能力体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在多模型间切换时 Taotoken 的路由与容灾能力体验 对于依赖大模型 API 进行开发的团队而言&#xff0c;服务的稳定性是保障业务连续…

作者头像 李华
网站建设 2026/5/9 13:45:35

CANN/cannbot-skills:A2三桥核在线Softmax尾部处理

Online Softmax Tail Handling on A2 Triple-Bridge Kernels 【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体&#xff0c;本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills Read thi…

作者头像 李华