【大模型应用】知识库AnythingLLM接口调用

目录

一、本地知识库

1.0 什么是RAG架构

1.1 Anything LLM 的安装和使用

二、Anything LLM 的 API 调用

2.0 创建 API 密钥

2.1 查看Swagger文档。工具-Api密钥-阅读Api文档

2.2 尝试调用聊天接口

三、文章总结


一、本地知识库

        OK,基于已经安装好了本地的Ollama后,我们接下来尝试Ai的进阶运用,打通本地知识库,让AI在回复消息时可以带上我们个人积累的知识经验,更加真实、丰富以及完整的回复信息。

1.0 什么是RAG架构

        RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与生成模型的人工智能技术,旨在通过检索外部知识库中的信息来增强语言模型的生成能力。

       简单来说就是一种让 AI 更聪明回答问题的方法,它分为三个步骤:找资料、整理资料和回答问题。首先,它会在一个知识库里找到和问题相关的部分;然后,把找到的内容整理成简单易懂的形式;最后,用整理好的内容生成一个清晰准确的回答。

        从图中可以看到,一个用户提问过来,在AI生成回复时,有三个主要概念需要了解。主要有三个概念 :LLM(Large Language Model,大语言模型)、Embedding(嵌入)和 Vector Database(向量数据库).这里LLM就不多说了,重点另外两个
        
  • Embedding(嵌入)
       在机器学习和自然语言处理中, Embedding模型是指将高维度的数据(例如文字、图片、视频)映射到低维度空间的过程。简单来说通过一个 专门的模型来把你上传的文本、表格数据等本地文件处理成机器能理解的 “数字代码”。
         静态向量Embedding:Word2Vec、GloVe、 FastText为代表。
         动态向量Embedding: ELMo、GPT、 BERT为代表生成上下文相关。
        
        动态向量可以更好地捕捉单词的语义和上下文信息。这里不在过多赘述,感兴趣的朋友可以单独学习了解。
  • Vector Database(向量数据库)
        用来存储上一步处理好的 “数字代码” 的数据库,它能够高效地存储和检索这些向量。当你有一个问题时,它会把问题转换成向量,然后在这个仓库里快速找到和问题最相关的向量。比如,你问“苹果是什么?”它会在这个仓库里找到和“苹果”相关的向量,比如“水果”“红色”“圆形”等。
    三个概念的协作就组成了 RAG 架构:
  • 检索(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 还支持直接贴网页链接来构建知识库,我们尝试贴一个硅基流动的文档进去:

未增加知识库前,回复效果比较简单:

增加知识库后,回复内容大大丰富:
         ps:网页一般都属于非结构化的数据,不利于模型检索,推荐还是先在本地处理成 AI 友好的格式再上传,效果更好。

二、Anything LLM 的 API 调用

2.0 创建 API 密钥

        我们可以在设置 - 工具 - API 密钥下创建 API 密钥,并且查看 Anything LLM 提供的 API 文档:

2.1 查看Swagger文档。工具-Api密钥-阅读Api文档

        Anything LLM 提了非常详细的 API,基本上客户端内能做的事情都能使用 API 调用,包括各种设置、知识库上传、与大模型交互等等 ,点开每个 API 可以看到具体的参数详情,也可以直接测试调用:

2.2 尝试调用聊天接口

        最常用的是聊天接口:( Anything LLM 中与大模型的交互都发生在 Workspace 下的 Thread 中)

        两个参数是 slug 和 threadSlug ,这两个参数就分别代表 Workspace 和 Thread 的唯一标识,在客户端我们是看不到这两个标识的,我们可以通过接口创建新的 Workspace 和 Thread 来获取,或者通过接口查询已有的 Workspace 和 Thread 的 slug

        Anything LLM 在本地启动的端口默认是 3001 ,当前已经可以找到所有关键参数:apiToken、slug 和 threadSlug,我们写个C# 的脚本来测试一下:
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}");
        }
    }
}

三、文章总结

        以上就是使用AnythingLLM调用接口的全部过程了,其他接口也是按照如上方式尝试使用。
        把之所学以文载之,欢迎交流学习~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勿芮介

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值