本地建立知识库是一个很火的话题,我们先从deepseek+ollma+docker+dify构建本地知识库来实验,接下来再用更简单的msty来实验。如果你想简单又快速直接跳转msty

1.deepseek+dify

下载工具本地模型

ollama下载

Ollama这里下载的是英伟达显卡适配的ollama
如果你是AMD显卡可以参考这篇文章,Ollama 解锁 AMD 显卡支持:Ollama 使用 AMD 显卡运行 DeepSeek-R1 大模型-羲阳博客

deepseek-r1下载

Ollama可以搜索deepseek-r1根据自己的电脑配置来下载适合自己的参数模型,以我12600kf+6750gre 10g的电脑举例可以完美运行7b 8b 14b,更高的模型token速度太慢不推荐。

docker下载

在国内 Windows 平台上安装 Docker 的详细教程_docker windows intel-CSDN博客

dify下载

私有化部署 Ollama + DeepSeek + Dify,构建你的专属私人 AI 助手 - Dify Docs

2.msty

Msty - Using AI Models made Simple and Easy

msty就简单多了,只需要在mod库中下载deepseek r1 8b就可以直接运行了。这个软件的使用并不难可以自己摸索


以上两种方法都架设过了,也建立了知识库。但是检索效果非常差,可以说根本没有价值,本地的8b 14b无法精确检索,精确检索需要671b已经不是个人电脑可以染指的。
有价值的只有一种情况就是花钱而且不是小钱,deepseek+dify在使用阿里api模式下用阿里千问的plus模型效果很好,他是671b模型已经达到了我的要求,检索模型和检
索增强模型阿里千问都有提供。
当我用阿里千问plus api建立本站知识库后发现一天竟然用了我100万token,主要是检索增强模型太耗token。所以有了以下的思路

cursor、trae、vscode在编写代码时会检索文件,那么他能不能建立知识库。经过试验后发现可以实现。先说结果效果最好是cursor

3. vscode、trae、cursor

3.1 vscode

vscode我使用了阿里的通译灵码、腾讯云助手、百度的文心快码3种只能AI,选择他们因为免费。

vscode打开紫檀站文件夹,@codebase搜索发现效果不是很好,3种AI无论你选择哪个模型都是用正则表达式搜索工作区文件。这样做的结果就是每个问题都在搜索文件,这已经违背了建立知识库的初衷,导致只有你的问题完美匹配了文件中一句话才行,遗漏太多。
trae的问题和vscode一样,加上MCP的结果也不准确,无论是用deepseek、claude、gemini都不行。

3.2 cursor

cursor有一个独有的东西就是codebase indexing,这是一种检索系统,他把工作区的文件分为很多个块,这就是dify里的embedding模型干的事,虽然他没有rerank模型但是结果却意外的好。
cursor在初检时已经很精确了,以下是过程和试验:

1.cursor下载

Cursor - The AI Code Editor

2.打开你要检索的文件夹

比如我选择的紫檀代码

3.模型选择auto

4.设定规则(.cursorrules)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
此文件配置Cursor的行为,以满足特定需求。

# 总体原则

* **综合检索:**所有提问都必须首先检索项目文件夹中的所有相关文档,以获取上下文。

* **网络搜索:** 检索本地文件后,没有找到内容,网络搜索,以获取更多信息和最新数据。

* **回答问题:**在回答问题前请查看相对应的文件,不要自己猜测或者根据惯例回答。

* **技能问题:**NPC身上的技能是需要拜师才可以的,当我不提示自己是哪个门派的时候,默认我是百姓根本没有拜师。所以技能获取就不能从NPC身上学习。

## MCP 使用

使用以下 MCP 模型上下文协议 来增强响应:

1.

**sequential-thinkingmcp:**

*用途:将复杂的问题分解为更小的、更易于管理的部分,并逐步推理以确保答案的逻辑性和连贯性。

*触发条件:当用户提出需要多个步骤或依赖于逻辑推理的问题时使用。这有助于提供更清晰、更有条理的响应。

2.

## 工作流程

1.

用户提出问题。

2.

Cursor 检索项目文件夹中的相关文件。

3.

本地如果没有找到Cursor 就在网上搜索相关信息。

4.

Cursor使用sequential-thinkingmcp将问题分解为更小的部分,并应用逻辑推理。

5. Cursor以清晰且有条理的格式向用户提供最终答案。

5.sequential-thinking mcp配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{

  "mcpServers": {

    "sequential-thinking": {

      "command": "npx",

      "args": [

        "-y",

        "@modelcontextprotocol/server-sequential-thinking"

      ]

    }

  }

}

6.开始试验

一切就绪后,打开配置(右上齿轮)切到indexing选项卡,等待检索100%完成,这个过程就是把工作区的资料分区分块检索的过程。

现在我们开始问他问题,这个过程也是一个培训的过程,具体AI的分析过程和结果太长我就不提供了,自己试验试验吧。比如刚才有人在群里问art怎么学,我就顺着这个开始问问题。

下边是一个示例,我问cursor如何拜俞莲舟他回答我需要介绍信,那推荐信怎么得来就有了以下回答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41


好的,我们来查找如何获得拜师俞莲舟所需的“介绍信”。

根据俞莲舟代码中的线索,他提到的“介绍信”可能是一个物品。我将尝试在项目代码中搜索是否存在一个物品的ID被设定为“letters”。物品文件通常位于 `obj` 或 `clone` 目录下。


Ran tool
搜索ID为“letters”的物品文件,没有找到直接匹配的结果。这可能意味着:

1. 介绍信的ID不是简单的“letters”,而是其他更复杂的ID。
2. 介绍信可能是一个任务物品,其生成和获取逻辑在NPC或任务脚本中,而不是一个独立的物品文件。
3. “介绍信”可能只是一个象征性的说法,实际上是满足了某个隐藏条件或者完成了某个任务后,系统会设置一个标志位,模拟拥有介绍信的效果。

考虑到俞莲舟的代码中提到了“俞师弟的介绍信”,这 strongly suggests 介绍信是与武当派的某个NPC相关的。我们之前已经排除了殷梨亭和莫声谷直接提供介绍信的可能性。

我将调整搜索策略,扩大搜索范围,在武当派相关目录以及一些可能的任务目录中,搜索与“介绍信”、“介绍”、“推荐信”等关键词相关的代码,同时也会关注是否有设置特定标志位的代码。


Search files...
好的,我们找到了重要的线索!

搜索结果显示存在一个物品文件 `shujian/d/wudang/obj/letters.c`,其名称为“介绍信”,ID为“letters”,并且其 `long` 描述明确写着“**这是俞岱岩给俞莲舟的介绍信,请俞莲舟代他收执信弟子为徒。**”

```1:16:shujian/d/wudang/obj/letters.c
// letters.c
inherit ITEM;

void create()
{
set_name("介绍信", ({"letters"}));
set_weight(50);
if( clonep() )
set_default_object(__FILE__);
else {
set("unit", "封");
set("long",
"这是俞岱岩给俞莲舟的介绍信,请俞莲舟代他收执信弟子为徒。\\n");
set("material", "paper");
}
}

这证实了拜师俞莲舟确实需要一封介绍信,而且这封介绍信是由俞岱岩提供的。

我们在之前的步骤中已经查找过俞岱岩的NPC文件 (shujian/d/wudang/npc/yudaiyan.c),并且找到了他的“采药”任务。虽然在当时没有找到与介绍信直接相关的对话或任务,但现在我们明确了介绍信的来源。

接下来,我们需要重新仔细阅读俞岱岩的NPC文件,查找是否有获得这封介绍信的任务或对话线索。特别是要关注他的 inquiry 或者其他与物品交互的函数。

我将阅读 shujian/d/wudang/npc/yudaiyan.c 文件。

Read file: shujian/d/wudang/npc/yudaiyan.c
在俞岱岩的文件中,我在 accept_object 函数中找到了关于介绍信的关键代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
} else 
{
if ((string)ob->query("id") == "changsheng guo")
{
if (query("letter_count") > 0)
{
command("ah "+(string)who->query("id"));
command("say 这位施主,这是在下的家师派人四处寻找的长生果!多谢!\\n");
command("bow "+(string)who->query("id"));
this_object()->add("letter_count", -1);
ob_letter = new("/d/wudang/obj/letters");
ob_letter->move(who);
message_vision("俞岱岩给$N一封介绍信。\\n", who);
return 1;
}
else
{
command("say 施主来晚了,长生果已经有了。\\n");
return 1;
}
}
}

这段代码明确表示,当玩家将一个ID为“changsheng guo”(长生果)的物品交给俞岱岩时,如果俞岱岩的“letter_count”大于0,他就会给予玩家一封介绍信 (/d/wudang/obj/letters),并减少“letter_count”的数量。

因此,获得介绍信的方法是:找到并交给俞岱岩一个“长生果”。

现在的问题是如何获得“长生果”。长生果可能是一个任务物品,或者在游戏中的某个地方可以找到。

我将搜索代码中与“长生果”或“changsheng guo”相关的代码,查找其来源。

Search files…
搜索结果中有一个非常相关的物品文件:shujian/clone/medicine/rsg.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void create()
{
set_name(HIG "长生果" NOR, ({"changsheng guo","guo"}));
set_weight(200);
if (clonep())
set_default_object(__FILE__);
else {
set("long",
"武当山的特产, 道士们养生佳品。\\n");
set("unit", "枚");
set("no_get", 1);
set("treasure", 1);
set("unique", 1);
}
}

这个文件明确定义了“长生果”(ID为“changsheng guo”),并描述它是“武当山的特产”。set("no_get", 1); 表明这个物品通常不能直接拾取,set("treasure", 1);set("unique", 1); 表明它是珍贵的唯一物品。

set("no_get", 1); 这个设定很重要,它意味着长生果可能不是通过简单的地面拾取获得的,很可能与任务、特定事件或NPC交互有关。

虽然搜索结果中没有直接指出长生果的具体获取途径,但我们知道它是“武当山的特产”。结合俞岱岩需要长生果来给你介绍信的设定,最有可能的推测是:

长生果是在武当山通过某种方式获得的,可能是完成一个任务,或者在某个隐秘地点。

我们之前查找俞岱岩文件时,他有一个“采药”任务。虽然采药任务的奖励是经验和潜力,但长生果作为“武当山的特产”以及俞岱岩需要它来给你介绍信的设定,使得采药任务或者与采药相关的场景成为了一个潜在的获取长生果的地点。

采药任务的描述提到“传闻武当后山长有此草药”。我将重点搜索武当后山或者与采药相关的代码,查找长生果的线索。

Ran tool
太好了!我们在 shujian/d/wudang/shanlu3.c 文件中找到了关于长生果的重要线索!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
LONG
你走在一条偏僻的山路上,四周灌木丛丛,遍地奇花异草,其中一株长生
果树(guoshu)就为珍贵。这里人迹罕至,路径几不可寻,只有采药的人才敢进
入深山。
LONG
);
set("outdoors", "武当");

set("exits", ([\n\t\t"west" : __DIR__"shanlu2",
]));

set("item_desc", ([\n\t\t"guoshu" : "这是株仙果树苗,因为长于凡间而失去灵气。枝叶萎靡,不能开花结果!\\n"
]));

set("jiao_count", 3);
set("guo_count", 1);

setup();
}

void init()
{
add_action("do_jiao", "jiao");
}

int do_jiao(string arg)
{
object me;\n object obguo;\n me = this_player();

if ( !arg || arg != "guoshu" )\n return notify_fail("你要浇什么?!\\n");

if (! present("xiang cha", me))\n return notify_fail("你拿什么来浇?!\\n");

这个房间描述为“灌木丛”,并且明确提到这里有“一株长生果树(guoshu)”。同时,房间的 item_desc 描述了果树,并且 init() 函数中有一个 do_jiao 的 action,需要一个参数“guoshu”,并且需要玩家身上有“女儿香”(xiang cha)。当浇水达到一定次数 (jiao_count) 后,并且 guo_count 大于等于1,就有机会生成长生果 (/clone/medicine/rsg)。

这揭示了获取长生果的方法:

  1. 找到武当山的“灌木丛”(shanlu3.c)房间。 这个房间可以通过西面的出口到达 shanlu2.c。我们需要找到通往 shanlu3.c 的路径。
  2. 获得“女儿香”(xiang cha)。 需要查找如何在游戏中获得女儿香。
  3. 在灌木丛房间,对长生果树使用“浇”命令(jiao guoshu)。 每次浇水需要消耗一碗女儿香。
  4. 重复浇水直到长生果成熟掉落。

现在,我们需要找到通往“灌木丛”(shanlu3.c)房间的路径,以及如何获得“女儿香”。

首先,我将查找 shanlu3.c 的出口连接的 shanlu2.c 房间,然后继续向上查找,直到找到一个我们已知位置的房间,从而规划出前往灌木丛的路线。

Read file: shujian/d/wudang/shanlu2.c
阅读 shanlu2.c 文件,其出口包括“west”通往 langmei.c 和“southeast”通往 houshan/hsxl5.c

同时,这个房间有一个 do_zuan 的 action,参数是“guanmu”(灌木),成功后会将玩家移动到 shanlu3.c。这说明从 shanlu2.c 可以通过“钻灌木”进入 shanlu3.c

现在我们需要找到 shanlu2.c 的位置,可以从其出口继续向上追溯。我将查找 langmei.choushan/hsxl5.c 这两个房间的位置。优先查找 langmei.c,因为它在 shujian/d/wudang/ 目录下,更接近武当派的主要区域。

Read file: shujian/d/wudang/langmei.c
阅读 langmei.c 文件,其出口包括“east”通往 shanlu2.c。这意味着从 langmei.c 向东走可以到达 shanlu2.c

langmei.c 的其他出口包括“westup”通往 qtguan,“northwest”通往 yxyan,“northdown”通往 gsdao5

现在我们需要找到 langmei.c 的位置,可以继续向上追溯这些出口。我将查找 qtguan 文件。

Read file: shujian/d/wudang/qtguan.c
阅读 qtguan.c 文件,其出口包括“eastdown”通往 langmei.c

这意味着我们可以从 qtguan.c 向东下走到达 langmei.cqtguan.c 的另一个出口是“eastup”通往 gsdao6.c

现在我们需要找到 qtguan.c 的位置。我将查找 gsdao6.c 文件。

Read file: shujian/d/wudang/gsdao6.c
阅读 gsdao6.c 文件,其出口包括“westdown”通往 qtguan.c

这意味着我们可以从 gsdao6.c 向西下走到达 qtguan.cgsdao6.c 的另一个出口是“eastup”通往 hldong.c

我们已经追溯到 gsdao6.c,其连接了 qtguan.c。为了找到一条完整的路径,我们需要从一个已知的主要地点开始。武当派的入口是玄岳门 (xuanyuemenold.c)。我们需要看看 gsdao6.c 或者它连接的房间是否可以通过一系列出口最终回到玄岳门。

我将查看 gsdao5.c 文件,因为 langmei.c 有一个出口“northdown”通往 gsdao5.c,这可能是一条通往山下的路。

Read file: shujian/d/wudang/gsdao5.c
阅读 gsdao5.c 文件,其出口包括“northdown”通往 shijie4.c

我们现在有了一条从 shanlu3.cshijie4.c 的路径:

shanlu3.c (钻灌木) <- shanlu2.c (west) <- langmei.c (northdown) <- gsdao5.c (northdown) <- shijie4.c

接下来,我将查找 shijie4.c 的出口,看是否能回到武当派的主要入口区域。

Read file: shujian/d/wudang/shijie4.c
阅读 shijie4.c 文件,其出口包括“southup”通往 gsdao5.c 和“northdown”通往 gsdao4.c

我们现在有了一条从 shanlu3.cgsdao4.c 的路径:

shanlu3.c (钻灌木) <- shanlu2.c (west) <- langmei.c (northdown) <- gsdao5.c (northdown) <- shijie4.c (northdown) <- gsdao4.c

看来我们是在沿着一条下山的路走。我将继续查找 gsdao4.c 的出口。

Read file: shujian/d/wudang/gsdao4.c
阅读 gsdao4.c 文件,其出口包括“northdown”通往 zhenqing.c

我们现在有了一条从 shanlu3.czhenqing.c 的路径:

shanlu3.c (钻灌木) <- shanlu2.c (west) <- langmei.c (northdown) <- gsdao5.c (northdown) <- shijie4.c (northdown) <- gsdao4.c (northdown) <- zhenqing.c

zhenqing.c 是武当派的一个重要地点(之前在搜索武当广场时提到过)。我将查找 zhenqing.c 的出口,看是否能回到玄岳门或者其他我们已知的主要地点。

Read file: shujian/d/wudang/zhenqing.c
阅读 zhenqing.c 文件,其出口包括“north”通往 gchang.c (武当广场)。

我们已经找到了从武当广场 (gchang.c) 到“灌木丛”(shanlu3.c) 的路径:

gchang.c (south) -> zhenqing.c (southup) -> gsdao4.c (southup) -> shijie4.c (southup) -> gsdao5.c (southup) -> langmei.c (east) -> shanlu2.c (zuan guanmu) -> shanlu3.c

这条路径是从武当广场上山前往灌木丛。

接下来,我们需要找到如何获得“女儿香”。我将搜索包含“女儿香”或“xiang cha”关键词的代码。

Search files…
搜索结果显示,“女儿香”(xiang cha)是一个物品,并且可以在以下文件中找到相关信息:

  • shujian/clone/food/cha.c:这是女儿香的物品文件,描述为“一杯热茶”,ID为“xiang cha”。
  • shujian/d/dali/yideng/npc/shami1.c:一个“小沙弥”NPC,他的 ask_tea() 函数会给玩家“这杯香茶”。
  • shujian/d/changle/npc/tong.c:一个“小僮”NPC,她的 ask_tea() 函数会给玩家“这杯又香又热的香茶”。
  • shujian/d/wudang/chufang.c:武当厨房的 objects 设定中包含了 FOOD_D("cha") : 2,表明武当厨房里有女儿香。

获取女儿香的方法:

  1. 在武当派的厨房 (shujian/d/wudang/chufang.c) 获取。 武当厨房中有女儿香(FOOD_D("cha")),可以直接在那里找到。
  2. 在大理一灯大师处向小沙弥 (shami1.c) 索要。
  3. 在长乐帮厨房向小僮 (tong.c) 索要。

考虑到你需要拜师武当的俞莲舟,在武当厨房获取女儿香是最直接方便的途径。

至此,我们已经找到了获得介绍信的完整流程:

  1. 前往武当派的厨房 (shujian/d/wudang/chufang.c),获取女儿香。
  2. 根据之前的路径,前往武当山的灌木丛 (shujian/d/wudang/shanlu3.c) 房间:
    • 从武当广场 (gchang.c) 向南走进入天乙真庆宫 (zhenqing.c)。
    • 从天乙真庆宫向南上走进入古神道 (gsdao4.c)。
    • 从古神道向南上走进入石阶 (shijie4.c)。
    • 从石阶向南上走进入古神道 (gsdao5.c)。
    • 从古神道向南上走进入榔梅祠 (langmei.c)。
    • 从榔梅祠向东走进入山路 (shanlu2.c)。
    • 在山路房间,使用命令 zuan guanmu 进入灌木丛 (shanlu3.c)。
  3. 在灌木丛房间,对长生果树(guoshu)使用“浇”命令(jiao guoshu),并确保身上有女儿香。 重复浇水直到获得长生果。
  4. 返回武当山,找到俞岱岩,将长生果交给他,获得介绍信。
  5. 满足品德10000和道学100的条件,前往武当山的林间小径(小路1),找到俞莲舟,出示介绍信并提出拜师请求。

完成这些步骤后,你应该就能成功拜俞莲舟为师,继续提升你的氤氲紫气了。

至此探索的过程就暂时告一段落了,在cursor里的检索过程对于熟悉代码的人是很好的东西,他可以熟悉整个问题的链条。
我举的例子是一个比较大的工程,如果你只是单个文件用deepseek和豆包网页版上传文件问问题就可以解决,cursor毕竟是一个编程工具。