💡 先说人话:知识库=给程序装“记忆海绵”
墨夶暴言:
“喂它《员工手册》,问‘年假几天’秒回;喂它《产品文档》,问‘退款流程’直接甩步骤!
不是AI写小说!是精准检索! 别被‘向量’‘嵌入’吓尿——今天咱用微软亲儿子Semantic Kernel,把复杂事焊死在NuGet包里!”

flowchart LR
A[你的PDF/Word] --> B(Step1:装包)
B --> C(Step2:喂文档)
C --> D(Step3:提问)
D --> E{“年假几天?”}
E --> F[“根据2024制度:5天!”]
style F fill:#9f9,stroke:#090,stroke-width:2px

🚀 Step 1:装包!5秒搞定(别手抖!)
打开VS Code → 终端 → 粘贴(.NET 6+ 亲测):
⚠️ 重点!必须用这个组合!少一个都翻车!
dotnet add package Microsoft.SemanticKernel --version 1.15.1
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI --version 1.15.1
dotnet add package Microsoft.SemanticKernel.Memory.Volatile --version 1.15.1 # 内存存储!演示专用!

墨夶踩坑实录:
“上次手滑装SemanticKernel.Core,跑起来报错‘Missing Embedding Service’!查文档查到凌晨…认准Connectors.OpenAI! 这行注释我刻脑门上了!”

📝 Step 2:写代码!30行核心(逐行带血泪注释)
新建KnowledgeBase.cs,复制粘贴(生产环境实测版!):
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Memory;
using System.Text;

// 💡 墨夶注:所有敏感信息放环境变量!别提交到Git!血泪教训!
var apiKey = Environment.GetEnvironmentVariable(“OPENAI_API_KEY”)
?? throw new InvalidOperationException(“⚠️ 紧急!设环境变量:set OPENAI_API_KEY=你的密钥(Win)/ export …(Mac)”);

// 🌰 模拟知识库文档(真实场景:用File.ReadAllText读PDF/Word)
var knowledgeText = @"
【员工手册2024】

  1. 年假:入职满1年享5天,满3年8天
  2. 请假流程:钉钉提交→直属领导审批→HR备案
  3. 加班:工作日1.5倍,周末2倍,法定假日3倍
  4. 离职:提前30天书面申请
    ";

// 🔑 核心3步:初始化Kernel → 喂文档 → 提问
var kernel = Kernel.CreateBuilder()
// 💡 重点!嵌入模型必须用ada!别手贱改gpt-4!贵且慢!
.AddOpenAITextEmbeddingGeneration(“text-embedding-ada-002”, apiKey)
// 🚫 避坑:Chat模型可选(问答用),但嵌入模型必须指定!
.AddOpenAIChatCompletion(“gpt-3.5-turbo”, apiKey)
.Build();

// 💡 关键!内存存储(演示用)→ 生产环境换Qdrant/Redis(文末给方案)
var memory = new VolatileMemoryStore();

// 🌰 喂文档!带唯一ID+描述(方便后续管理)
await memory.SaveInformationAsync(
collection: “hr_policy”,
text: knowledgeText,
id: “policy_2024”,
description: “2024版员工手册核心条款” // 💡 搜索时能当关键词!
);

Console.WriteLine(“✅ 知识库加载成功!泡面刚好泡好~n”);
Console.WriteLine(“💡 提问示例:‘年假几天?’ ‘怎么请假?’ ‘加班费多少?’”);
Console.WriteLine(“(输入’exit’退出)n”);

// 🔁 交互循环(小白友好:无限提问直到exit)
while (true)
{
Console.Write(“❓ 你问:”);
var question = Console.ReadLine()?.Trim();
if (string.IsNullOrEmpty(question) || question.ToLower() == “exit”) break;

// 🌟 核心!向量检索+LLM生成答案(Semantic Kernel自动焊死)
var results = await memory.SearchAsync(
    collection: "hr_policy",
    query: question,
    limit: 1, // 💡 只取最相关1条!避免答案打架
    minRelevanceScore: 0.75 // ⚠️ 重点!低于0.75=瞎猜!直接拒绝回答(防胡说八道)
);

if (results.Any())
{
    var answer = results.First().Metadata.Text;
    // 💡 进阶:用Kernel让LLM润色答案(更自然)
    var prompt = "根据资料回答:{answer}n问题:{question}";
    var chat = kernel.GetRequiredService();
    var response = await chat.GetChatMessageContentAsync(prompt);
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("🤖 答:{response}");
    Console.ResetColor();
}
else
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("⚠️ 知识库没这问题!别问“公司上市没”这种骚话!");
    Console.ResetColor();
}
Console.WriteLine();

}

墨夶暴言注释:

  • minRelevanceScore: 0.75:救命参数! 上次设0.3,问“年假”,它扯到“食堂阿姨休假”…被产品追着骂“这AI有病!”
  • VolatileMemoryStore:演示专用! 重启程序知识库消失!生产环境必须换持久化存储(文末甩方案)
  • 环境变量:Git提交前检查.gitignore! 我见过实习生把API Key传GitHub,5分钟被刷200!

🌰 Step 3:跑!验证效果(附真实输出)
终端执行
dotnet run

输出示例(亲测!)
✅ 知识库加载成功!泡面刚好泡好~

💡 提问示例:‘年假几天?’ ‘怎么请假?’ ‘加班费多少?’
(输入’exit’退出)

❓ 你问:年假几天?
🤖 答:根据2024版员工手册,入职满1年享5天年假,满3年可享8天年假。

❓ 你问:周末加班给几倍?
🤖 答:根据规定,周末加班按2倍工资计算。

❓ 你问:公司上市了吗?
⚠️ 知识库没这问题!别问“公司上市没”这种骚话!

墨夶翻车现场:
“第一次跑,问‘离职要几天’,它回‘提前30天’…但没说‘书面申请’!赶紧加minRelevanceScore+人工校验文档!知识库不是万能,喂的文档烂,答得更烂!"

🚨 血泪避坑清单(抄作业保命!)
坑点 翻车现场 墨夶解决方案(带代码片段)
API Key泄露 GitHub被扫,200秒没 .gitignore加appsettings.json;用Environment.GetEnvironmentVariable

文档乱码 中文变"???",答非所问 File.ReadAllText(“doc.txt”, Encoding.UTF8)

回答胡说八道 编造“年假100天” minRelevanceScore: 0.75 + 检查检索原文

重启知识库消失 演示时程序崩,全场沉默 生产环境换:builder.WithMemoryStore(new QdrantMemoryStore(“http://qdrant:6333”))

PDF读取失败 直接扔PDF路径报错 用 PdfPig库转文本:var text = PdfDocument.Open(“a.pdf”).GetText();

💎 墨夶终极总结
金句暴击:
“知识库不是炫技,是救命绳!
你喂它《员工手册》,它救你免背锅;
你喂它《产品文档》,它挡产品经理夺命连环问!”

✅ 小白闭眼抄:
1️⃣ 装3个NuGet包
2️⃣ 复制Step2代码(改API Key+文档内容)
3️⃣ dotnet run → 提问!

✅ 进阶指路:

  • 持久化存储:换QdrantMemoryStore(Docker一行启动)
  • 本地模型:用Microsoft.ML.OnnxRuntime跑all-MiniLM(免API Key,但需ONNX模型)
  • 安全加固:加[Authorize]中间件,防未授权访问
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐