目录
2.1 查看Swagger文档。工具-Api密钥-阅读Api文档
一、本地知识库
1.0 什么是RAG架构
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与生成模型的人工智能技术,旨在通过检索外部知识库中的信息来增强语言模型的生成能力。
简单来说就是一种让 AI 更聪明回答问题的方法,它分为三个步骤:找资料、整理资料和回答问题。首先,它会在一个知识库里找到和问题相关的部分;然后,把找到的内容整理成简单易懂的形式;最后,用整理好的内容生成一个清晰准确的回答。

- Embedding(嵌入)
- Vector Database(向量数据库)
- 检索(Retrieve):当用户提出一个问题时,首先通过 Embedding 模型将问题转换成向量,然后在 Vector Database 中检索与问题向量最相似的文档向量。这一步就像是在图书馆里找到和问题最相关的书籍。
- 增强(Augment):检索到的文档向量会被提取出来,作为上下文信息,和原始问题一起输入到 LLM 中。这一步就像是把找到的书里的关键内容摘抄下来,整理成一个简洁的笔记,然后交给写作助手。
- 生成(Generate):LLM 根据整理好的上下文信息,生成一个准确且连贯的回答。这一步就像是写作助手根据笔记,写出一个完整的、让人容易理解的答案。
1.1 Anything LLM 的安装和使用
Anything LLM 是一款基于 RAG架构的本地知识库工具,能够将文档、网页等数据源与本地运行的大语言模型(LLM)相结合,构建个性化的知识库问答系统。它支持多种主流模型的 API 接入方式,如Ollama、 OpenAI、DeepSeek 等。
安装使用的方式也比较简单,我们直接访问 AnythingLLM | The all-in-one AI application for everyone 的官方网站:Download AnythingLLM for Desktop,选择适合你操作系统的版本进行下载。
下载完成后,运行安装包并按照提示完成安装,安装完成后,打开 Anything LLM 应用,第一步就是选择大模型,这里我们看到 AnythingLLM 同样支持大部分的主流模型提供商,我们选择 Ollama,工具会自动读取我们本地已经安装的模型:
然后下一步应该是选择前面我们提到的 Embedding(嵌入模型)和 Vector Database(向量数据库),由于我之前选择过了,所以这里默认记住了我之前的选项,想要调整可以在设置中更改:
然后他让我们输入一个 Workspace(工作区)的名字,我们可以在不同的工作区里设置不同的知识库:
然后进来就是一些引导话术,我们可以开始创建工作区或打开之前创建的大模型知识库:
初始化完成后,我们还可以去设置里更改 Embedding 和 Vector Database。小伙伴还记得前面提到的RAG三个概念吗?这里LLM已经选择的是本地,现在就是后面两个设置:
PS:嵌入模型其实也非常重要,它处理的准确性直接决定了基于知识库回答的准确度,我们可以看到 OPEN AI 也提供了嵌入模型,但是 OPEN AI 的嵌入模型需要联网和付费。我们这里先选的是默认的 AnythingLLM 提供的嵌入模型,它是完全运行在本地且免费的嵌入模型,当然准确度就比较一般了。
然后向量数据库我们也选择默认的 LanceDB,它也是完全运行在本地且免费的。
初始设置完成后,我们尝试运行一下:
Anything LLM 设置知识库
知识库的质量其实也直接决定了模型基于知识库回答的效果,AI 友好的知识库结构,首先应层次清晰,按主题、领域或功能分类,建立从概括到具体的合理层级,像图书馆分类摆放书籍;还要易于检索,有精准关键词索引、全文检索功能和智能联想,方便快速定位知识;并且通过知识图谱、交叉引用建立数据关联,形成知识网络。
我让 AI 帮我生成一个测试的知识库数据,使用 MarkDown 格式:
然后我们点击工作区的上传图标:
Anything LLM 支持上传多种类型的文件,包括常见的文本文件(如 TXT、Markdown)、文档文件(如 PDF、Word、PPT、Excel)、数据文件(如 CSV、JSON) 等等:
我们把刚才生成的知识库文件上传上去,并且添加到当前工作区,点击保存:

模型精准的回答出了结果,效果还不错。
另外 Anything LLM 还支持直接贴网页链接来构建知识库,我们尝试贴一个硅基流动的文档进去:
未增加知识库前,回复效果比较简单:


二、Anything LLM 的 API 调用
2.0 创建 API 密钥
我们可以在设置 - 工具 - API 密钥下创建 API 密钥,并且查看 Anything LLM 提供的 API 文档:
2.1 查看Swagger文档。工具-Api密钥-阅读Api文档
Anything LLM 提了非常详细的 API,基本上客户端内能做的事情都能使用 API 调用,包括各种设置、知识库上传、与大模型交互等等 ,点开每个 API 可以看到具体的参数详情,也可以直接测试调用:
2.2 尝试调用聊天接口

两个参数是 slug 和 threadSlug ,这两个参数就分别代表 Workspace 和 Thread 的唯一标识,在客户端我们是看不到这两个标识的,我们可以通过接口创建新的 Workspace 和 Thread 来获取,或者通过接口查询已有的 Workspace 和 Thread 的 slug:
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class AnythingLLMClient
{
private readonly HttpClient _httpClient;
private readonly string _workspaceId;
private readonly string _threadId;
private readonly int _userId;
public AnythingLLMClient(AnythingLLMConfig config)
{
// 创建并配置 HttpClient
_httpClient = new HttpClient
{
BaseAddress = new Uri(config.BaseUrl ?? "http://localhost:3001")
};
// 设置请求头
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", config.ApiToken);
_workspaceId = config.WorkspaceId;
_threadId = config.ThreadId;
_userId = config.UserId ?? 1;
}
public async Task<JsonDocument> ChatAsync(string message)
{
try
{
// 构造请求 URL
var url = $"/api/v1/workspace/{_workspaceId}/thread/{_threadId}/chat";
// 创建请求体
var requestBody = new
{
message,
mode = "chat",
userId = _userId
};
// 序列化请求体并发送 POST 请求
var content = new StringContent(
JsonSerializer.Serialize(requestBody),
Encoding.UTF8,
"application/json"
);
var response = await _httpClient.PostAsync(url, content);
response.EnsureSuccessStatusCode();
// 解析 JSON 响应
var responseContent = await response.Content.ReadAsStringAsync();
return JsonDocument.Parse(responseContent);
}
catch (Exception ex)
{
Console.WriteLine($"请求错误: {ex.Message}");
return null;
}
}
}
public class AnythingLLMConfig
{
public string BaseUrl { get; set; }
public string ApiToken { get; set; }
public string WorkspaceId { get; set; }
public string ThreadId { get; set; }
public int? UserId { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
try
{
// 初始化客户端配置
var config = new AnythingLLMConfig
{
BaseUrl = "http://127.0.0.1:3001",
ApiToken = "****自己的apitoken***",
WorkspaceId = "******工作区slug*******",
ThreadId = "*****threadslug*****",
UserId = 1
};
var client = new AnythingLLMClient(config);
// 发送请求
Console.WriteLine("发送问题中...");
var response = await client.ChatAsync("感冒分类有哪些?");
Console.WriteLine("\n回答:");
Console.WriteLine(JsonSerializer.Serialize(response, new JsonSerializerOptions { WriteIndented = true }));
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}