[LLM Wiki理论与实践-07]用来生成OpenWiki知识库和完成对话的Agent

OpenWiki 实战:Markdown 知识库如何让 AI Agent 检索效率翻倍 在 AI Agent 开发中,RAG(检索增强生成)是提升回答准确率的关键技术,而知识库的组织方式直接影响检索质量。传统方案常将文档存入数据库或向量库,但忽略了结构化和元数据的重要性。OpenWiki 以 Markdown 为存储、CLI 为交互,通过 frontmatter 元数据(如 audience、freshness)和按标题切分策略,为 Agent 提供高质量上下文。这种方案能显著提升召回准确率、降低 token 消耗,适用于 LangChain 等编排框架下的知识增强场景。本文深入解析 Open 阅读详情

LLM Wiki理论与实践-06:详细解析OpenWiki如何摄取外部数据源介绍的Connector仅仅是将内容导入到对应的源文件中,并更新自身的状态,并不涉及Wiki页面的生成。为构建的知识库生成Wiki,以及针对Wiki完成与用户(针对Personal模式)和Coding Agent的交互需要借助LLM的力量,其背后自然是一个Agent。作为LangChain生态的一部分,OpenWiki背后的这个Agent是通过DeepAgents创建的。

1. 创建一个基于Wiki的Chat Agent

不论是Wiki内容的生成,还是最终使用Wiki来完成与用户和Coding Agent的对话,其实都不算复杂。为了让大家对背后的这个Agent有一个大概的认识,接下来我会用最少的代码创建一个LangChain Agent,这个Agent会利用LLM Wiki理论与实践-04:使用OpenWiki的Personal模式构建知识库生成的Wiki知识库来回答用户的提问。

OpenWiki(这里只考虑Personal模式)的知识库就是存储在~/.openwiki/wiki/%UserProfile%.openwiki/wiki(可以通过环境变量OPENWIKI_CONFIG_DIR进行设置)的几个通过交叉链接相互引用的Markdown文件。如果我们使用最简单的create_agent函数来创建一个Agent,只需要注册FilesystemMiddleware中间件映射到知识库目录,并提供相应的工具函数来读取Wiki的内容即可。如下面的演示程序所示,我们针对上述的目录创建了一个LocalShellBackend作为FilesystemMiddleware中间件的存储后端。在调用create_agent函数针对指定的LLM(针对gpt-5.4-mini的ChatOpenAI)和这个中间件创建Agent时,我们还提供了系统提示词来指导LLM如何基于Wiki知识库来检索上下文。

from deepagents.backends import  LocalShellBackend
from langchain.agents import create_agent
from langchain_core.runnables import RunnableConfig
from deepagents.middleware.filesystem import FilesystemMiddleware
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
from dotenv import load_dotenv
import os, asyncio

load_dotenv()

system_prompt = f"""
You are a data retrieval and analysis expert. You need to retrieve relevant context based on the user's questions, and provide the final answer through induction, analysis, and summarization.

**How to retrieve context**

- Retrieve a Wiki knowledge base built via a virtual file system. Each Wiki page is generated from raw data ingested by registered Connectors.
- Read the content of Wiki page files by calling the file system tool functions`ls`,`read_file`,`glob`, and`grep`.
- It is recommended to use`/quickstart.md`as the entry point to start retrieval in the Wiki knowledge base.
"""

open_wiki_home = os.getenv("OPENWIKI_CONFIG_DIR") or os.path.expanduser("~/.openwiki")
open_wiki_kb = os.path.join(open_wiki_home,"wiki")
backend = LocalShellBackend(root_dir=open_wiki_kb,virtual_mode=True)

agent = create_agent(
    model= ChatOpenAI(model="gpt-5.4-mini"),
    middleware=[FilesystemMiddleware(backend=backend)],
    system_prompt=system_prompt,
    checkpointer= MemorySaver())

config:RunnableConfig = {
    "configurable":{
        "thread_id":"thread_123"
    }
}

while(True):
    user_input = input("\n$: ")
    if user_input.lower() in ["quit", "exit"]:
        break

    stream =  agent.stream_events(
        input= {"messages": [{"role": "user", "content": user_input}]},
        config=config,
        version="v3")

    for event in stream:
        if event.get("method") == "messages":
            data = event.get("params", {}).get("data", [])
            for item in data:
                block = item.get("delta") or {}
                if block.get("type") == "text-delta":
                    print(block.get("text", ""), end="", flush=True)

Agent创建出来后,我们开启了对话循环。在每次对待中,我们将用户输入转换成消息调用Agent的stream_events方法,并实时输出响应的内容。针对LLM Wiki理论与实践-04:使用OpenWiki的Personal模式构建知识库介绍的摄入内容,我们询问了如下两个问题:

$: 整理一份美国中期选举最新进展简报
下面是一份**美国中期选举最新进展简报**(基于当前知识库里最新可用的网页检索结果):

## 美国中期选举最新进展简报

### 一、总体情况
目前检索到的信息显示,相关内容仍以**基础背景与2026年选举日程**为主,**尚未出现明确的最新突发进展或竞选态势变化**。

### 二、已确认信息
- **美国中期选举通常在总统任期第二年的11月举行**
- 选举通常涉及:
  - **众议院全部435个席位**
  - **参议院33或34个席位**
  - 大量州和地方职位
- 当前检索结果指向的**2026年中期选举日期为 2026年11月3日**
- 2026年中期选举将决定**第120届美国国会**
- 2026年参议院选举涉及**35个席位**
- 众议院方面,**435个选区都会进行投票**

### 三、当前可解读的“进展”
从现有资料看,所谓“最新进展”主要体现在:
1. **选举时间表已经明确**
2. **参众两院席位分布已进入完整轮次的中期选举周期**
3. **目前公开检索结果仍偏概览性**,没有显示出新的重大政策变化、关键候选人退选、党派格局大变或初选结果等消息

### 四、简要判断
如果你想要的是“**最新战况**”而不是“**中期选举基础介绍**”,目前知识库里的 web 搜索结果还不够。现有信息只能支持这样一个结论:

> **美国中期选举已进入2026周期,但当前可见信息仍主要是日程和规则层面的背景说明,暂无可确认的实时重大进展。**

### 五、建议
如果你需要,我可以继续帮你整理成以下任一种版本:
- **媒体简报风格**:适合汇报、会议纪要
- **一页纸速览版**:适合快速阅读
- **按党派/席位/州别拆解版**:更像政治分析
- **“最新动态”版**:我可以进一步帮你补充检索,找真正的竞选进展、民调、初选和关键摇摆州变化

如果你愿意,我下一步可以直接给你做一版**“美国中期选举最新动态一页纸”**。

$: 最近Hacker News有哪些关于AI Agent的新闻?
最近 Hacker News 上和 **AI Agent** 相关的新闻,主要集中在下面几类:

## 1) Agent 记忆与可观测性
- **Agent memory needs its OpenTelemetry moment**  
  72 points / 66 comments  
  重点在于:给 AI Agent 的记忆系统做标准化、可观测化,类似 OpenTelemetry 在传统软件里的作用。  
  这是当前最强的“agent 基础设施”信号之一。

## 2) Agent 编排与运行时
- **Launch HN: Rivet (YC W23) – Scale and Orchestrate Agents on S3**  
  71 points / 38 comments  
  这是一个自托管的 Agent 编排系统,核心卖点包括:
  - actor 风格的长生命周期 worker
  - S3-backed storage
  - WebSockets
  - hibernation  
  说明社区对“如何稳定运行和调度 Agent”仍然很关注。

## 3) Agent 工具接入:MCP
- **MCP Explained**  
  233 points / 111 comments  
  虽然不是纯 Agent 产品,但与 Agent 工具链、外部系统集成、标准化接口密切相关。  
  这类内容通常代表 Agent 生态正在向“可连接、可复用”的方向发展。

## 4) Agent 安全与隐私
- **Claude Code sends your email address to websites**  
  370 points / 122 comments  
  这是当前最热门的一条,主题是 AI coding agent / 工具在与网站交互时泄露用户邮箱地址。  
  这说明 Agent 安全、隐私、权限边界已经成为非常现实的问题。

## 5) Agent 审计与调试
- **Show HN: Stroq – a local audit of what your coding agent did and why**  
  66 points / 14 comments  
  这是一个面向 coding agent 的本地审计工具,关注“Agent 做了什么、为什么这么做”。  
  与上面的可观测性主题呼应。

## 6) 相关但偏外围的模型/研究信号
- **GPT-6 Astra covertly underperforms on safety research**  
  284 points / 150 comments  
  主要是安全研究和模型行为讨论,和 Agent 的直接关系没那么强,但会影响 Agent 未来部署方式。
- **Tencent Launches Hy4**、**Inkling 2 Small**  
  更偏模型发布,不属于 Agent 新闻本体。

## 一句话总结
最近 HN 上的 AI Agent 话题,核心不是“又出了什么炫酷 Demo”,而是更偏向:
- **记忆与可观测性**
- **编排与运行时**
- **工具接入标准**
- **安全与隐私**
- **审计与可解释性**

如果你愿意,我可以继续帮你整理成:
1. **按热度排序的 HN AI Agent 新闻清单**
2. **适合发群里的中文简报**
3. **“AI Agent 赛道趋势”分析版**

由于我们的Agent只注册了唯一FilesystemMiddleware中间件,所以它只能在Wiki知识库范围内提供答案。比如我们让它从Notion提取最新写入的会议记录的内容时,它就无能为力了。如下所示,由于Wiki中只有会议记录的摘要信息,并没有完整内容,它只能告诉你有这么一份会议记录,但是无法提供具体的内容。

$: 从notion中提取最新写入的会议记录
从这次 Notion 提取结果看,**最新写入的会议记录没有被成功抽取到具体内容**。

当前能确认的只有:

- **Meeting Notes** 数据库存在
- 字段包括:
  -`Meeting name`
  -`Date`
  -`Attendees`
- 排序是按`Date`倒序

但这次检索的结论是:

- **没有从数据库本身提取到可用的会议纪要内容**
- 没有找到可提炼的**会议决策、项目进展或行动项**
- 所以目前**无法直接给出“最新会议记录”的正文摘要**

另外,这轮 Notion 中真正被提取到的最新有价值页面是:

- **Study LLM wiki**
  - 类型:待办/任务
  - 状态:Not started
  - 截止日期:2026-11-15

如果你要,我可以继续帮你做两件事之一:
1. **继续深挖 Notion 里最新的会议页面**,尽量找到具体会议内容  
2. **把当前已提取到的 Notion 最新内容整理成一页摘要**

但是LLM Wiki理论与实践-04:使用OpenWiki的Personal模式构建知识库针对OpenWiki的演示却能够提供这项功能,这些因为OpenWiki使用的Agent除了注册FilesystemMiddleware中间件外,还会注册额外的工具,其中就包含提取Notion具体页面的工具。接下来我们就来看看OpenWiki会创建怎样的Agent。

2. 创建Agent的工厂函数

OpenWiki内部会调用如下这个createOpenWikiAgent作为工厂函数创建对应的Agent。返回的Agent类型为DeepAgent,代表DeepAgents通过createDeepAgent函数(Python SDK对应的函数名称为create_deep_agent)。关于DeepAgents,在我们的系列文章12.DeepAgents:LC的Harness中具有系统介绍,不过我们介绍的是Python版本,OpenWiki使用的是TypeScript版本。

export async function createOpenWikiAgent(
  options: OpenWikiAgentOptions,
): Promise<DeepAgent> {
  if (!path.isAbsolute(options.cwd)) {
    throw new Error("OpenWiki agent cwd must be an absolute path.");
  }

  if (options.outputMode === "repository" && options.command !== "chat") {
    throw new Error(
      "Repository init/update use the OpenWiki page-job runner; call runOpenWikiAgent instead of createOpenWikiAgent.",
    );
  }

  await syncBundledSkills();
  const openWikiIgnore =
    options.outputMode === "repository"
      ? await OpenWikiIgnore.load(options.cwd)
      : new OpenWikiIgnore([]);
  const context = await createRunContext(
    options.cwd,
    options.outputMode,
    options.language,
  );
  const checkpointer = await createCheckpointer(
    resolveCheckpointTarget(options.command),
  );

  return createOpenWikiAgentGraph({
    ...options,
    checkpointer,
    context,
    openWikiIgnore,
    runTimestamp: new Date().toISOString(),
  });
}

2.1 OpenWikiAgentOptions

createOpenWikiAgent函数的options是一个具有如下定义的OpenWikiAgentOptions对象。作为OpenWiki Agent的配置选项,OpenWikiAgentOptions通过解析openwiki命令行参数生成。

export type OpenWikiAgentOptions = {
  command: OpenWikiCommand;
  cwd: string;
  language?: string | null;
  model: BaseChatModel;
  onEvent?: (event: OpenWikiRunEvent) => void;
  outputMode: OpenWikiOutputMode;
};

export type OpenWikiCommand = "chat" | "init" | "update";
export type OpenWikiOutputMode = "local-wiki" | "repository";
  • command:本次运行要执行的OpenWiki命令,决定 Agent 的行为分支;
  • cwd:运行时的当前工作目录,作为文件操作的根路径;
  • language:输出文档的目标语言;
  • model:Agent使用的聊天模型实例(BaseChatModel);
  • onEvent:运行过程中的事件回调,用于接收OpenWikiRunEvent流式输出;
  • outputMode:输出模式,控制结果的呈现方式(OpenWikiOutputMode);

outputMode参数对应的OpenWikiOutputMode类型体现了OpenWiki的code(repository)和Personal(local-wiki)两种执行模式。command参数对应的OpenWikiCommand体现对话(chat)、初始化(init)和增量Wiki更新(update)三种命令。OpenWikiCommand和OpenWikiOutputMode之间一共有6种组合,但是createOpenWikiAgent函数的验证逻辑排除了repository+init和repository+update的组合,所以创建的Agent会应用在如下两种场景下:

  • Personal模式:用来更新Wiki和完成与用户的对话;
  • Code模式:用来完成与用户(独立运行openwiki命令)或者Coding Agent(作为其连接的MCP)的对话。

2.2 OpenWikiAgentGraphOptions

DeepAgent对象的最终创建体现在针对createOpenWikiAgentGraph函数的调用上,传入的参数另一个类型为OpenWikiAgentGraphOptions的对象,它在OpenWikiAgentOptions的基础上为创建的DeepAgent提供了如下的配置选项:

  • checkpointer:用于持久化的SqliteSaver对象;
  • context:作为调用Agent传入的静态上下文;
  • openWikiIgnore:.openwikiignore 文件的规则加载与匹配器,遵循gitignore式的“按文件顺序、最后匹配者胜出、! 可重新包含”语义;
  • runTimestamp:调用时间戳。
type OpenWikiAgentGraphOptions = OpenWikiAgentOptions & {
  checkpointer: SqliteSaver;
  context: RunContext;
  openWikiIgnore: OpenWikiIgnore;
  runTimestamp: string;
};

export type UpdateRunStatus = "complete" | "interrupted";
export type UpdateMetadata = {
  updatedAt: string;
  command: OpenWikiCommand;
  gitHead?: string;
  model: string;
  status?: UpdateRunStatus;
  language?: string;
};

export type RunContext = {
  lastUpdate: UpdateMetadata | null;
  language?: string;
  wikiGoal?: string;
};

export class OpenWikiIgnore {
  readonly patterns: string[]
  constructor(patterns: string[]) 
  get isActive(): boolean
  ignores(filePath: string, isDirectory = false): boolean
}

2.3 createOpenWikiAgentGraph

DeepAgent的最终创建体现在如下这个createOpenWikiAgentGraph函数上,从针对createDeepAgent函数的调用上可以看出,最终创建的DeepAgent具有的能力和特性体现在如下几个方面:

  • 注册了了通过createOpenWikiConnectorTools函数创建的工具函数;
  • 采用OpenWikiAgentGraphOptions提供的SqliteSaver作为Checkpointer,意味着基于Thread的状态会持久化在SQLite数据库中;
  • 创建的OpenWikiLocalShellBackend对象被createAgentBackend函数进一步加工,最终生成的CompositeBackend将作为Agent的后端;
  • 将目录/skills/下的Markdown文件注册为Agent Skill;
  • 注册了由createSystemPrompt函数创建的系统提示词;
  • 注册了如下的中间件:
    • 针对Personal模式:通过createWikiTranslationMiddleware函数创建的FilesystemMiddleware中间件;
    • 针对非chat命令:
      • 如果需要翻译:通过createWikiTranslationMiddleware函数创建的用来翻译的中间件;
      • 通过createOpenWikiIndexMiddleware函数创建的用来辅助索引的中间件。
function createOpenWikiAgentGraph(
  options: OpenWikiAgentGraphOptions,
): DeepAgent {
  const wikiBackend = new OpenWikiLocalShellBackend({
    docsOnly: options.command !== "chat",
    openWikiIgnore: options.openWikiIgnore,
    maxOutputBytes: 100_000,
    outputMode: options.outputMode,
    rootDir: options.cwd,
    timeout: 120,
    virtualMode: true,
  });
  const backend = createAgentBackend(wikiBackend);
  const translation = resolveTranslationPlan(
    options.command,
    requireResolvedLanguage(options.language),
    options.context.lastUpdate?.language,
  );
  
  const indexLabels = resolveIndexLabels(options.context.language);
  const conceptType = resolveConceptTypeLabel(options.context.language);

  return createDeepAgent({
    model: options.model,
    tools: createOpenWikiConnectorTools(options.outputMode),
    checkpointer: options.checkpointer,
    backend,
    middleware: [
      ...(options.outputMode === "local-wiki"
        ? [
            createFilesystemMiddleware({
              backend,
              permissions: AGENT_FILESYSTEM_PERMISSIONS,
              tools: [
                "ls",
                "read_file",
                "glob",
                "grep",
                "write_file",
                "edit_file",
              ],
            }),
          ]
        : []),
      ...(options.command === "chat"
        ? []
        : [
            ...(translation
              ? [
                  createWikiTranslationMiddleware(
                    wikiBackend,
                    options.outputMode,
                    options.model,
                    translation,
                    (message) => {
                      options.onEvent?.({ type: "text", text: message });
                      process.stderr.write(`${message}\n`);
                    },
                    (message) => {
                      options.onEvent?.({
                        type: "text",
                        text:`${message}\n\n`,
                      });
                    },
                  ),
                ]
              : []),
            createOpenWikiIndexMiddleware(
              wikiBackend,
              options.outputMode,
              indexLabels,
              conceptType,
              options.runTimestamp,
            ),
          ]),
    ],
    skills: ["/skills/"],
    subagents: [],
    permissions: AGENT_FILESYSTEM_PERMISSIONS,
    systemPrompt: createSystemPrompt(
      options.command,
      options.outputMode,
      options.context.language,
      options.openWikiIgnore,
    ),
  });
}

3. 工具函数的注册

DeepAgent注册的工具函数列表由如下这个createOpenWikiConnectorTools函数创建。顾名思义,这个函数的工具函数与注册的Connector有关,LLM Wiki理论与实践-06:详细解析OpenWiki如何摄取外部数据源中曾经说过,由于Connector大都需要使用用户凭证,基本上只会应用在Personal模式下,所以在Code模式下不会有任何工具函数被创建。

export function createOpenWikiConnectorTools(
  outputMode: OpenWikiOutputMode = "local-wiki",
): StructuredToolInterface[] {
  if (outputMode === "repository") {
    return [];
  }

  return [
    new DynamicStructuredTool({
      name: "openwiki_list_connectors",
      description:
        "List built-in OpenWiki connectors, their backends, required env var names, config paths, and raw data paths. Secret values are never returned.",
      schema: {
        type: "object",
        properties: {},
        additionalProperties: false,
      } as const,
      func: async () => stringifyToolResult(await listConnectors()),
    }),
    new DynamicStructuredTool({
      name: "openwiki_list_mcp_tools",
      description:`List live MCP tools for a configured MCP connector and write discovery under ${openWikiConnectorsDisplayPath}/<id>/raw. Input: {"connectorId":"notion"}. Use exact returned tool names.`,
      schema: {
        type: "object",
        properties: {
          connectorId: {
            type: "string",
            enum: ["custom-mcp", "notion"],
          },
        },
        required: ["connectorId"],
        additionalProperties: false,
      } as const,
      func: async (input) =>
        stringifyToolResult(
          await listMcpToolsForConnector(getConnectorId(input, "connectorId")),
        ),
    }),
    new DynamicStructuredTool({
      name: "openwiki_call_mcp_tool",
      description:`Call one exact discovered read-only MCP tool and write the result under ${openWikiConnectorsDisplayPath}/<id>/raw. Input: {"connectorId":"notion","toolName":"exact_tool_name","args":{"query":"Applied AI"}}.`,
      schema: {
        type: "object",
        properties: {
          args: {
            type: "object",
            additionalProperties: true,
          },
          connectorId: {
            type: "string",
            enum: ["custom-mcp", "notion"],
          },
          toolName: {
            type: "string",
          },
        },
        required: ["connectorId", "toolName"],
        additionalProperties: false,
      } as const,
      func: async (input) =>
        stringifyToolResult(
          await callMcpToolForConnector(
            getConnectorId(input, "connectorId"),
            getStringInput(input, "toolName"),
            getRecordInput(input, "args") ?? {},
          ),
        ),
    }),
    new DynamicStructuredTool({
      name: "openwiki_ingest_connector",
      description:`Run deterministic ingestion for one built-in connector and write raw data/manifests under ${openWikiConnectorsDisplayPath}/<id>/raw. Input: {"connectorId":"x","streams":["bookmarks"],"limit":1}.`,
      schema: {
        type: "object",
        properties: {
          connectorId: {
            type: "string",
            enum: [
              "custom-mcp",
              "git-repo",
              "google",
              "hackernews",
              "notion",
              "slack",
              "web-search",
              "x",
            ],
          },
          limit: { type: "number" },
          streams: {
            type: "array",
            items: { type: "string" },
          },
          windowHours: { type: "number" },
        },
        required: ["connectorId"],
        additionalProperties: false,
      } as const,
      func: async (input) =>
        stringifyToolResult(
          await ingestConnector(
            getConnectorId(input, "connectorId"),
            getIngestOptions(input),
          ),
        ),
    }),
    new DynamicStructuredTool({
      name: "openwiki_ingest_all_connectors",
      description:
        "Run deterministic ingestion for all configured built-in connectors. Connectors that are not configured or enabled are skipped.",
      schema: {
        type: "object",
        properties: {},
        additionalProperties: false,
      } as const,
      func: async () => stringifyToolResult(await ingestAllConnectors()),
    }),
    new DynamicStructuredTool({
      name: "openwiki_list_raw_items",
      description:`List raw files for a connector under ${openWikiConnectorsDisplayPath}/<id>/raw. Input: {"connectorId":"x"}.`,
      schema: {
        type: "object",
        properties: {
          connectorId: {
            type: "string",
            enum: [
              "custom-mcp",
              "git-repo",
              "google",
              "hackernews",
              "langsmith",
              "notion",
              "slack",
              "web-search",
              "x",
            ],
          },
        },
        required: ["connectorId"],
        additionalProperties: false,
      } as const,
      func: async (input) =>
        stringifyToolResult(
          await listRawItems(getConnectorId(input, "connectorId")),
        ),
    }),
    new DynamicStructuredTool({
      name: "openwiki_read_raw_item",
      description:`Read a raw connector file by connector ID and relative path. Only files inside ${openWikiConnectorsDisplayPath}/<id>/raw are allowed. Input: {"connectorId":"x","path":"2026-.../bookmarks.json","maxBytes":50000}.`,
      schema: {
        type: "object",
        properties: {
          connectorId: {
            type: "string",
            enum: [
              "custom-mcp",
              "git-repo",
              "google",
              "hackernews",
              "langsmith",
              "notion",
              "slack",
              "web-search",
              "x",
            ],
          },
          maxBytes: {
            type: "number",
          },
          path: {
            type: "string",
          },
        },
        required: ["connectorId", "path"],
        additionalProperties: false,
      } as const,
      func: async (input) =>
        stringifyToolResult(
          await readRawItem(
            getConnectorId(input, "connectorId"),
            getStringInput(input, "path"),
            getNumberInput(input, "maxBytes") ?? 100_000,
          ),
        ),
    }),
  ];
}
  • openwiki_list_connectors:列出内置Connector及其backend、所需环境变量名、配置路径与原始数据路径(不返回密钥值);
  • openwiki_list_mcp_tools:列出所有MCP Connector(custom-mcp + notion)提供的MCP工具,并把发现结果写入connectors/{connector_id}/raw目录;
  • openwiki_call_mcp_tool:按精确工具名调用MCP工具,参数经args传入,结果写入connectors/{connector_id}/raw目录;
  • openwiki_ingest_connector:对单个内置Connector执行确定性摄取,支持streams、limit、windowHours,原始数据/清单写入connectors/{connector_id}/raw;
  • openwiki_ingest_all_connectors:对所有已配置的内置Connector执行确定性摄取,未配置或未启用的Connector被跳过;
  • openwiki_list_raw_items:列出指定Connector所在connectors/{connector_id}/raw目录下的原始文件;
  • openwiki_read_raw_item:按Connector ID与相对路径读取原始文件,仅允许访问connectors/{connector_id}/raw内部文件,支持maxBytes限制(默认 100000)。

OpenWiki之所以能够提取定义在Notion中的会议,但是我们开篇演示的实例没有这个能力,正是因为上述工具注册的缺失。

4. 读写Wiki的后端存储

和开篇演示实例一样,DeepAgent利用FilesystemMiddleware中间件提供的工具来完成针对Wiki的读写,涉及的后端类型为OpenWikiLocalShellBackend。如代码所示,它派生于LocalShellBackend,意味着它可以利用本地的Shell执行bash命令。

export class OpenWikiLocalShellBackend extends LocalShellBackend {
  constructor(options: OpenWikiBackendOptions) 
}

OpenWikiLocalShellBackend 在 LocalShellBackend 之上叠加了四类访问控制:

  • .openwikiignore路径排除;
  • Grounded Claims状态所有权保护;
  • docs-only写入约束(仅限openwiki/且可选页面白名单);
  • shell执行限制(Personal模式禁用、Code模式仅允许部分维护命令)。

createOpenWikiAgentGraph函数在根据当前配置将OpenWikiLocalShellBackend创建出来后,会将其传入如下这个createAgentBackend函数,它会合并针对如下两个路径的后端生成一个CompositeBackend对象:

  • /skills/: 映射到物理路径{openwiki-home}/skills上的FilesystemBackend,用来提供Agent Skill;
  • /conversation_history/: 映射到物理路径{openwiki-home}/conversation_history上的FilesystemBackend,用来存储对话历史。
export function createAgentBackend(
  wikiBackend: OpenWikiLocalShellBackend,
  {
    historyDir = openWikiConversationHistoryDir,
    skillsDir = openWikiSkillsDir,
  }: AgentBackendMountOptions = {},
): CompositeBackend {
  return new OpenWikiCompositeBackend(wikiBackend, {
    [CONVERSATION_HISTORY_MOUNT]: new FilesystemBackend({
      rootDir: historyDir,
      virtualMode: true,
    }),
    "/skills/": new FilesystemBackend({
      rootDir: skillsDir,
      virtualMode: true,
    }),
  });
}
export const CONVERSATION_HISTORY_MOUNT = "/conversation_history/"

DeepAgent后端正是此CompositeBackend对象,注册的FilesystemMiddleware中间件也是基于该对象创建的。{openwiki-home}/skills目录下默认会定义如下两个Skill。mermaid-diagrams用于在生成的Wiki页面中嵌入 Mermaid 图表,用可视化方式呈现运行时流程、状态机、数据模型等用文字难以清晰表达的内容。write-connector是OpenWiki内置连接器的开发规范文档,规定了从选型到交付的完整流程。。

📁 skills
├── 📁 mermaid-diagrams
|    └── 📄 skill.md
└── 📁 write-connector
     └── 📄 skill.md

5. 辅助翻译的中间件

如果执行openwiki --update或者openwiki personal --update命令生成Wiki时通过 --language(或 -l)参数指定了具体的语言,用来创建DeepAgent的createOpenWikiAgentGraph函数会调用createWikiTranslationMiddleware函数创建一个用来实施翻译的中间件。承载原始和目标语言TranslationPlan通过resolveTranslationPlan函数解析生成,并作为createWikiTranslationMiddleware函数的核心参数,其translateAll字段决定采用全量翻译还是增量翻译。

export function resolveTranslationPlan(
  command: OpenWikiCommand,
  requestedLanguage: string | undefined,
  currentWikiLanguage: string | undefined,
): TranslationPlan | undefined

export function createWikiTranslationMiddleware(
  backend: BackendProtocolV2,
  outputMode: OpenWikiOutputMode,
  model: BaseChatModel,
  plan: TranslationPlan,
  onWarning: (message: string) => void = (message) => {
    process.stderr.write(`${message}\n`);
  },
  onStatus: (message: string) => void = (message) => {
    process.stderr.write(`${message}\n`);
  },
) {
  return createMiddleware({
    name: "OpenWikiTranslationMiddleware",
    beforeAgent: async () => {
      await translateWiki(
        backend,
        outputMode,
        model,
        plan,
        onWarning,
        onStatus,
      );
    },
  });
}

export interface TranslationPlan {
  target: string;
  source: string;
  translateAll: boolean;
}

创建的翻译中间件会在调用LLM之前调用translateWiki将Wiki现有的内容翻译成指定的语言。与此同时,语言相关的指令也会出现在调用LLM的提示词中,确保生成的Wiki采用指定的语言。

6. 索引中间件

createOpenWikiAgentGraph函数针对openwiki --update或者openwiki personal --update命令会调用createOpenWikiIndexMiddleware函数创建一个中间件。该中间件对于OpenWiki来说非常重要,它是确保生成的Wiki具有可靠质量的保障。

export interface IndexLabels {
  files: string;
  directories: string;
}

export const ENGLISH_INDEX_LABELS: IndexLabels = {
  files: "Files",
  directories: "Directories",
};

export function createOpenWikiIndexMiddleware(
  backend: BackendProtocolV2,
  outputMode: OpenWikiOutputMode,
  labels: IndexLabels = ENGLISH_INDEX_LABELS,
  conceptType: string = ENGLISH_CONCEPT_TYPE,
  now: string = new Date().toISOString(),
  claimSources?: () => ClaimEvidenceResources,
) {
  let preparedWiki: PreparedWikiState | undefined;

  return createMiddleware({
    name: "OpenWikiIndexMiddleware",
    beforeAgent: async () => {
      preparedWiki = undefined;
      preparedWiki = await prepareWikiForAuthoring({
        backend,
        outputMode,
        conceptType,
        runOperation: (operation, task) =>
          inStage("build", task, {
            errorClass: "okf_error",
            errorDetail: operation,
          }),
      });
    },
    wrapToolCall: async (request, handler) => {
      const result = await handler(request);
      return addFrontmatterWarning(
        result,
        backend,
        outputMode,
        request.toolCall.name,
        conceptType,
      );
    },
    afterAgent: async () => {
      if (!preparedWiki) {
        throw new Error("Wiki finalization requires prepared run state.");
      }
      await finalizeWikiArtifacts({
        backend,
        outputMode,
        labels,
        conceptType,
        prepared: preparedWiki,
        at: now,
        claimSources: claimSources?.(),
        runOperation: (operation, task) =>
          inStage("finalize", task, {
            errorClass: "okf_error",
            errorDetail: operation,
          }),
      });
    },
  });
}

中间件定义了如下三个钩子:

  • beforeAgent:是Agent开始写作前的准备工作,做两件事:
    • 按照OKF规范对现有的Wiki页进行修改(如果只有在验证内容不符合规范才会实施文件更新);
    • 为每个页面生成一个概念快照(ConceptSnapshot),记录下从Yaml元数据的generated字段(比如generated: { by: "openwiki/0.5.1", at: "2026-11-08T13:08:12.029Z" });
  • wrapToolCall:通过封装工具调用拦截针对Wiki页的写入,并重新加载其内容按照OKF规范进行验证,并在不符合规范的情况下对内容进行修正;
  • afterAgent:在Agent结束执行后对Wiki页面的内容进行总体验证和修正:
    • 验证Wiki页中生成的Mermaid图表,如果没有通过验证会将mermaid围栏(mermaid fence)降级成纯文本形式;
    • 扫描每个子目录,并在其中生成index.md索引页;
    • 遍历所有Markdown文件,检查相对链接和GitHub风格标题锚点是否有效,把断链就地打上标记(而非让运行失败),并返回统计报告;
    • 将执行本轮update命令的Actor(openwiki/${OPENWIKI_VERSION})和时间戳以generated字段的形式写入更新的Wiki页。
Device Mapper 代码分析 Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM 阅读详情

相关推荐

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

你是否在STM32CubeIDE中遇到过这样的崩溃场景?——精心编写的中文注释在重新生成代码后变成“锟斤拷”乱码,不仅影响代码可读性,反复修改更是浪费大量时间!作为STM32开发者,我曾被这个问题困扰许久,试过修改软件设置、工程编码却始终治标不治本。直到发现这个基于Java环境变量的终极解决方案,才彻底解决了中文乱码难题。

smart_boy__的博客 2957

OpenWiki:Markdown知识库与AI Agent协同的工程实践

在检索增强生成(RAG)与AI Agent应用开发中,知识库的结构化程度直接影响检索质量与模型输出。Markdown作为纯文本格式,天然具备清晰的标题层级与语义结构,便于文本分割器按标题切分并保留上下文元数据,从而提升向量检索的准确率。结合命令行接口(CLI),文档可纳入CI/CD自动化流程,实现与代码同步更新。这一技术组合在LangChain知识库问答、LangGraph智能体决策等场景中展现出显著工程价值,有效解决了文档与AI协作中的格式清洗与结构丢失问题。OpenWiki正是围绕Markdown知识底

weixin_32678995的博客 260

vuecli3 实现 移动端和pc端 界面切换(两套代码)

适合场景 多页面多系统应用 所有系统都在同一目录下。配置多入口多出口。每个系统之间可以链接。每个系统内依然采用Vue单页应用开发。 产品需求:一套代码 兼容pc端和移动端 , 移动端和pc端的样式布局差别很大,需要使用多界面,并判断使用手机的时候跳转移动端代码,使用pc端跳转pc端代码。 项目目录 分为两部分代码,pc 和mobile 第一步:创建一个登陆页面的文件 在项目public文件夹下创建一个login.html,其实就是将index.html复制一份,将title改一下: <!DOCTYP

你怎么也喜欢嘴巴嘟嘟 5919

OpenWiki + LangChain:构建AI Agent可消费的知识库实战

Markdown作为纯文本知识载体,凭借可版本控制、可程序化解析的特性,正成为AI Agent知识库的事实标准。其原理在于LLM对Markdown原生支持,通过LangChain的文档加载器与标题切分器,可将知识库高效转化为向量索引,实现检索增强生成。技术价值在于降低RAG链路构建成本,提升检索命中率与上下文完整性。典型应用场景包括项目文档问答、规范检查与决策追溯。OpenWiki以文件系统加Markdown的朴素设计,配合CLI工具链,让AI Agent真正读懂项目知识,成为智能体的长期记忆。

weixin_33309048的博客 195

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法

opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!

m0_51437227的博客 937

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

OpenWiki:用Markdown和CLI构建AI Agent知识库

在AI Agent与LLM工具快速发展的背景下,知识生产速度远超整理速度,如何高效管理碎片化知识成为关键。Markdown作为纯文本格式,凭借其通用性和对AI友好的结构,成为知识库的理想底座。结合CLI的快速录入与检索能力,知识沉淀从手动整理转向半自动流转,显著降低上下文切换成本。这种方案尤其适用于需要为LangChain、LangGraph等框架提供结构化context的AI Agent应用,以及长期在终端工作的开发者。OpenWiki正是基于这一理念,将Markdown、CLI与AI Agent生态对接

weixin_29085865的博客 226

跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02

SAP用户状态详细配置逻辑及解析

Lucas1211的博客 3万+

OpenWiki 实战:Markdown 知识库与 AI Agent 的本地化融合

在本地知识库与 AI Agent 结合的趋势下,如何高效管理 Markdown 文档并实现语义检索成为技术团队关注的重点。OpenWiki 通过 CLI 驱动,将本地 Markdown 文件与 LangChain 等框架无缝集成,利用向量化索引和语义理解,把传统关键词搜索升级为智能问答。其技术价值在于数据本地化、格式开放和自动化工作流,适用于技术文档维护、AI Agent 开发及团队知识管理。本文深入拆解 OpenWiki 的核心设计,并提供从环境搭建到进阶集成的完整实操指南。

weixin_29053577的博客 254

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

hive get_json_object解析json结果为null咋办?

最近一位开发的同学在使用get_json_object函数对json数据解析的时候,出现了结果为null的问题,问题原因是sql语法导致的,那么今天就来详细介绍一下解析json函数的用法!最后还是提醒小伙伴们,在开发过程中,一定要注意sql语法格式的书写,避免一些意想不到的结果!

笑看风云路的博客 2308

OpenWiki:基于Markdown与CLI的本地知识库,为AI Agent注入知识

在AI Agent开发中,如何高效注入本地知识成为关键挑战。Markdown作为通用格式,结合CLI工具的无状态与可脚本化特性,为知识管理提供了新思路。OpenWiki以Markdown为唯一数据源,通过CLI驱动,自动构建索引与向量存储,实现本地知识库的快速检索与问答。它不绑定特定框架,却能无缝对接LangChain等Agent生态,适用于个人知识管理、AI Agent开发及技术文档维护。

weixin_28678151的博客 321

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OpenWiki 实践指南:用 Markdown、CLI 与 AI Agent 构建知识库

Markdown 是一种轻量级标记语言,以纯文本为基础,支持结构化排版,便于版本控制和机器解析。其原理在于通过简单符号定义标题、列表、表格等元素,兼具可读性与可编辑性。在 AI 时代,Markdown 成为 AI Agent 生成内容的首选格式,因其稳定性和兼容性,能有效提升知识管理的效率。结合 CLI 工具,可实现自动化操作,如批量处理与搜索。AI Agent 则基于 LLM 和 LangChain 等框架,赋予自动化内容生成与维护能力。这些技术共同应用于构建智能知识库,解决内容结构化与协作问题。Open

weixin_28828243的博客 230

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OpenWiki

但它生成的 Wiki 不是给人读的“说明文档”,而是给 AI Agent 读的“上下文记忆”。这些文档的读者是开发者,写作风格是散文式的。这会打开一个本地的交互式节点图,左侧是 Wiki 页面树,右侧是 Markdown 阅读器,可以直观地看到各页面之间的关联关系。——把代码库的结构、架构、依赖关系“编译”成一套 Agent 可以快速查阅的 Wiki,让 Agent 不用每次都从头翻代码。在代码模式下,更新还会调和过时的 Claims——如果源文件的证据变了,对应的 Wiki 页面会自动更新。

qq_20770761的博客 134

OpenWiki 实战:用 CLI 和 Markdown 构建 AI Agent 知识库

在 AI Agent 开发中,LangChain 与 LangGraph 的快速迭代让知识管理成为痛点。CLI 工具如 codex cli、claude cli 产生的会话与命令记录散落各处,Markdown 表格转换、换行等格式问题又增加维护成本。OpenWiki 以“条目”为核心,将终端操作、代码片段和 AI 对话沉淀为可检索的知识网络,支持标签、全文与时间过滤。它降低了记录摩擦,让知识捕获成为工作流自然产物,适用于 AI 开发者、Tech Lead 及终端重度用户,实现团队经验的持续积累与复用。

weixin_29050271的博客 43

OpenWiki + LangChain:让 AI Agent 真正读懂并维护知识库

Markdown 作为 LLM 最熟悉的文档格式,天然适合作为 AI Agent 的知识存储层。通过 CLI 工具链将文档读写、检索、更新能力暴露给 LangChain 等 Agent 框架,AI 可以像人一样维护结构化 Wiki,解决传统 RAG 检索不稳定、格式易错乱等痛点。这种方案在知识库自动更新、文档健康度检查、CI/CD 文档同步等场景中价值显著。OpenWiki 正是围绕这一思路设计的开源知识协作协议,结合 LangChain 的工具编排能力,让 Agent 自主完成文档的读取、修改与保存,大幅

weixin_30607125的博客 300

OpenWiki:面向AI Agent的Markdown知识库方案与LangChain集成实践

在AI Agent开发中,知识库的构建与检索是核心挑战。传统方案依赖向量数据库和复杂的文档处理链路,而OpenWiki提出了一种以Markdown为存储格式、开放目录为骨架的轻量级知识组织范式。其原理是利用Markdown的结构化语义和文件系统的天然层级,让AI Agent通过CLI或文件读取接口直接访问知识,省去向量化与检索中间环节。这种方案技术价值在于低耦合、易维护、迁移成本低,尤其适合与LangChain、LangGraph等框架互补使用。典型应用场景包括智能客服、工业智能体、项目文档问答等。本文深入

weixin_30558697的博客 230

OpenWiki:基于Markdown与CLI的AI Agent知识库构建指南

Markdown作为纯文本格式,凭借其可移植性和可编程性,成为构建结构化知识库的理想选择。通过CLI工具链,开发者能在终端内高效管理文档,减少上下文切换。结合LangChain等框架,Markdown文档可被轻松加载、切分和向量化,为AI Agent提供高质量知识源。OpenWiki正是这一理念的实践,它利用Markdown和CLI,将文档转化为可被Agent检索的知识库,适用于技术团队和AI Agent开发者。

weixin_29056865的博客 202

OpenWiki实战:用Markdown+CLI+AI Agent打造智能知识库

在AI时代,知识管理正从手工文档转向自动化流水线。Markdown作为纯文本中间层,凭借零解析成本和Git原生diff支持,成为AI Agent读写文档的理想格式。CLI工具链将文档操作脚本化,实现索引生成、新鲜度检查等自动化流程。结合LangChain与向量数据库,可构建本地知识库问答系统,让AI Agent高效检索和整理文档。这种文档即代码的协作方式,尤其适合5-50人技术团队,能显著降低查找成本,提升文档质量。OpenWiki正是这一理念的落地实践,通过Markdown+CLI+AI Agent组合,

weixin_32597009的博客 245

OpenWiki:基于Markdown与CLI的AI Agent本地知识库搭建指南

在AI Agent应用开发中,如何让大语言模型高效读取本地知识是常见需求。传统方案需手动处理文档加载、分块与索引,流程繁琐。OpenWiki通过约定优于配置的设计,将Markdown文件、CLI工具链与LangChain生态整合,实现知识资产标准化与检索接口统一化。其核心原理是以Markdown为可信源,索引为派生数据,支持混合检索与增量更新。技术价值在于降低RAG应用门槛,让Agent像调用工具一样调用知识库。典型场景包括本地知识库问答、对话记忆沉淀与团队文档协作。本文深入解析OpenWiki的设计思路与

weixin_29062963的博客 93

OpenWiki 知识库搭建:Markdown 与 CLI 驱动的 AI Agent 开发手册

在 AI Agent 开发中,LangChain 和 LangGraph 等技术栈会产生大量 Prompt 模板、工具定义和调试记录,如何高效沉淀这些知识成为关键。OpenWiki 采用纯文本 Markdown 存储和 CLI 优先操作,将零散笔记组织成可检索、可协作的轻量级知识库。其核心原理是通过目录结构、Frontmatter 元数据和双向链接实现知识的结构化管理,并天然契合 AI Agent 工作流。技术价值在于提升知识复用效率,支持版本控制和自动化脚本。应用场景包括个人第二大脑、团队内部文档以及基于

weixin_26891599的博客 209

OpenWiki:用Markdown和CLI构建AI Agent的本地知识库

在AI Agent开发中,如何为模型提供结构化、可检索的上下文是关键挑战。传统Wiki系统往往过重,而基于Markdown和CLI的轻量级知识库方案,通过本地文件存储和倒排索引,实现了毫秒级检索。这种方案不仅零额外依赖、完全本地,还能与LangChain等框架无缝集成,让Agent通过简单Tool调用即可获取知识。它适用于个人笔记管理、团队文档协作以及AI Agent的RAG场景,有效解决了知识散落、检索困难的问题。OpenWiki正是这一思路的典型实践,将Markdown与CLI结合,为AI Agent提

weixin_29057695的博客 189

OpenWiki + LangChain + AI Agent:搭建本地知识库问答实战

Markdown 作为纯文本内容载体,天然适合 Git 版本管理与程序解析,是知识沉淀的理想底座。CLI 则凭借可组合、可脚本化的特性,让文档管理回归开发者肌肉记忆。当 Markdown 与 CLI 结合,再引入 LangChain 编排框架和 AI Agent 的检索增强能力,知识库便从静态存储升级为可问答、可追溯的智能系统。这套方案尤其适合团队内部文档散落、新人重复提问等场景,能有效打通“写文档”与“用文档”之间的壁垒。本文围绕 OpenWiki 的落地实践,详解从文档切分、向量化到 Agent 问答的

weixin_33158887的博客 266

OpenWiki 实战:Markdown + CLI 构建 AI Agent 本地知识库

Markdown 作为纯文本格式,天然具备结构化标题层级,便于版本管理与 AI 分块处理。CLI 工具则通过命令行交互减少上下文切换,提升开发效率。将 Markdown 与 CLI 结合,可快速搭建可检索的本地知识库,为 LangChain 等 AI Agent 提供高质量上下文输入,解决文档散乱、检索困难的问题。OpenWiki 正是这一思路的工程实践,它统一组织项目文档与注释,支持全文与标题混合索引,并能封装为 Agent 检索工具,适用于独立开发者、AI 应用构建者及重度终端用户。

weixin_29046611的博客 319

OpenWiki 实战:用 Markdown + CLI 为 AI Agent 构建结构化知识库

在 AI Agent 开发中,LLM 负责推理,而知识组织与检索常成为瓶颈。Markdown 作为纯文本格式,天然支持版本管理与结构化解析,结合 CLI 的脚本化能力,可将文档转化为 Agent 可稳定读取的数据源。通过 Front Matter 元数据与语义切分策略,能显著提升 LangChain 等框架的检索命中率,降低 token 消耗。这一方案尤其适用于需要私有知识库、文档频繁更新或工业级可追溯场景的 Agent 应用。OpenWiki 正是基于此理念,将 Markdown 知识库与 AI 工作流无

weixin_32487557的博客 217

OpenWiki 知识库搭建指南:让 AI Agent 高效读取 Markdown 文档

在 AI Agent 开发中,知识库的构建与检索是核心环节。Markdown 作为纯文本格式,凭借清晰的标题层级和语义结构,成为人与 AI 都能理解的最大公约数。通过 CLI 工具实现批量操作与自动化,结合 LangChain 的检索能力,可将 Markdown 文档转化为 Agent 可调用的结构化知识。这种方案尤其适用于需要频繁读写文档的 AI Agent 场景,能显著提升上下文注入效率。OpenWiki 正是基于这一思路,以 Markdown 为载体,为 AI Agent 提供统一的知识底座,解决文档

weixin_28224217的博客 233
上一篇: [LLM Wiki理论与实践-06]详细解析OpenWiki如何摄取外部数据源
JaydenAI
博客等级 码龄1年 242粉丝 323原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值