AI入门启航:看见知识库的运行原理

一 开篇

通过上一篇文章的学习,我们已经了解了 AI 的发展历史、基本概念以及它擅长和不擅长的地方。今天是入门启航系列的第二篇,我们开始借助一些工具,去实际的体验一些 AI 应用,让我们能看得见,摸得着这些应用背后的运行原理,消除对 AI 的神秘感。

目前市场上的 AI 应用处于井喷的状态,有的有质量的产品体验,有的则是套壳应用,五花八门的,什么样的都有。我们会选择一些本地部署/调用的工具,这样我们可以去观察它背后的运行原理。本地类的工具有很多,我们根据应用场景的不同,列出了市面上常见的的四款工具:

  • Cherry Studio
  • Ollama
  • AnythingLLM
  • Dify

它们的使用场景如下:

对比维度 Cherry Studio Ollama Dify AnythingLLM
目标定位 创意工作者的AI桌面助手 开发者友好的模型运行框架 低代码 AI 应用开发平台 企业级本地知识库系统
界面类型 桌面GUI应用 命令行+API Web可视化界面 Web界面
部署难度 ⭐⭐⭐⭐⭐ 一键安装 ⭐⭐⭐⭐ 简单安装 ⭐⭐ 复杂部署 ⭐⭐⭐ 中等复杂
主要优点 • 界面美观易用 • 专注创意场景 • 开箱即用 • 轻量高效 • API功能强大 • 模型管理完善 • 可视化工作流 • 企业级功能 • 团队协作完善 • 强大的文档处理 • 知识库构建 • 数据完全本地化
主要缺点 • 功能相对单一 • 扩展性有限 • 社区较小 • 需要命令行技能 • 缺少GUI界面 • 学习门槛高 • 学习曲线陡峭 • 资源消耗大 • 配置复杂 • 专注知识库场景 • 配置相对复杂 • 依赖外部模型
核心应用场景 创意写作、设计灵感、内容创作 API集成、自动化脚本、开发环境 企业AI应用开发、工作流自动化 知识库问答、文档分析、RAG应用
适用人群 设计师、创意工作者、内容创作者 开发者、系统管理员、技术爱好者 企业开发团队、产品经理、AI应用开发者 企业用户、研究人员、知识工作者
技术门槛 中高 中高
资源消耗 中等
团队协作 ❌ 不支持 ⚠️ 需要额外工具 ✅ 强大的团队功能 ✅ 支持多用户
开发能力 ❌ 无开发功能 ⭐⭐⭐⭐⭐ API集成 ⭐⭐⭐⭐⭐ 可视化开发 ⭐⭐⭐ 有限的定制
企业级特性 ❌ 个人工具 ⚠️ 需要额外开发 ✅ 完整企业功能 ✅ 企业级部署

作为一个新手,我们先从最简单的 Cherry Studio 开始上手,其他工具我们后面会逐步讲解。

二 下载与安装

1 下载与安装

点击 www.cherry-ai.com/ 下载安装 Cherry Studio 客户端。

下载完成以后,点击安装,安装完成以后启动进入应用主界面。

2 配置大模型

Cherry Studio 支持多种大模型的 api key 配置,也支持 Olama 这种本地模型的配置,这里我们以 硅基流动 为例:

点击设置-模型服务-硅基流动-点击「获取密钥」

进入 硅基流动 后台,点击「新建令牌」,令牌新建完成以后,点击复制,复制令牌。

将复制的 API Key 输入到 API 密钥中,然后点击「检测」

检测以后,会提示连接成功。

点击右上角开关,启用模型服务。

回到聊天页面,选择 DeepSeek 模型。

配置好模型,下方对话框输入「你是谁?」,就可以看到模型的回答啦。

Cherry Studio 里还有很多预置的提示词:

可以添加到助手里去玩一玩。

好了,至此 Cherry Studio 的下载、安装和配置就完成啦。我们开始进行的主要内容,搭建本地知识库,"看见"知识库的原理。

三 搭建本地知识库

第1步:添加 embedding 模型

什么是 嵌入模型 embedding ?因为本文是以 AI 体验为主,暂不展开复杂的概念解释,这里给一个通俗易懂的解释。

图片来自于:Brilliant --- Daily Learning, Lifelong Impact!

嵌入模型是将文字、图片等各种信息转换成数字向量的技术,让计算机能够理解和处理这些信息的语义含义。

举几个生活中的例子做类比:

例子1:地图坐标系

就像每个地点都可以用经纬度坐标来表示一样,嵌入模型把每个词汇或句子都转换成一个多维坐标。相似意思的词会在这个"语义地图"上靠得更近,比如"汽车"和"车辆"会在坐标系中距离很近。

例子2:指纹识别系统

每个人的指纹都可以提取出独特的特征向量,嵌入模型也是如此------它把文本的语义特征提取成数字向量,让计算机能够识别和比较不同文本的含义。

例子3:翻译字典

就像中英文字典能把中文词汇对应到英文词汇一样,嵌入模型把人类语言"翻译"成计算机能理解的数字语言,保持原有的语义关系。

在模型服务-点击「管理」

在「嵌入」TAB 选择一个嵌入模型。

第2步:新建知识库

新建好的知识库

第3步:上传知识库文件

新建好知识库以后,我们给知识库上传文件,首先让我们打开 的开发者模式,Mac 电脑使用 Command + Option + I,打开开发者模式是为了让我们看到与大模型的接口请求,可以"看见"知识库的工作过程。

1 这里写了一个语料文件,可以把它复制保持成 ai.txt。

makefile 复制代码
语料库 A:人工智能基础知识
```
Q1: 什么是人工智能?
A1: 人工智能(AI)是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的系统,如学习、推理、感知和决策。

Q2: 机器学习与深度学习有什么区别?
A2: 机器学习是人工智能的一个子集,通过算法让计算机从数据中学习。深度学习是机器学习的一个分支,使用多层神经网络来模拟人脑的工作方式。

Q3: 什么是神经网络?
A3: 神经网络是一种计算模型,由大量相互连接的节点(神经元)组成,能够识别数据中的模式。它模仿了人脑神经元的工作方式。

Q4: 监督学习和无监督学习的区别?
A4: 监督学习使用带标签的数据进行训练,目标是学习输入和输出之间的映射关系。无监督学习处理无标签数据,寻找数据中的隐藏模式。

Q5: 什么是自然语言处理?
A5: 自然语言处理(NLP)是人工智能的一个分支,专门处理人类语言的理解、生成和交互,使计算机能够理解和生成人类语言。
```

语料库 B:技术实现相关
```
Q6: 如何构建一个向量数据库?
A6: 构建向量数据库需要选择合适的向量存储引擎(如Faiss、Pinecone或Weaviate),将文本转换为向量嵌入,建立索引,并实现相似性搜索功能。

Q7: 什么是词嵌入?
A7: 词嵌入是将词汇转换为数值向量的技术,使计算机能够理解词汇的语义关系。常见的方法包括Word2Vec、GloVe和BERT等。

Q8: RAG模型是如何工作的?
A8: RAG(检索增强生成)模型结合了信息检索和文本生成。它首先从知识库中检索相关信息,然后将检索到的信息与原始查询一起输入到生成模型中,产生更准确的回答。
```

2 点击「添加文件」

3 出现对号,表示添加完成。

第4步:引用知识库,然后进行提问

1 返回聊天界面,在「知识库」添加刚才创建的知识库。

2 根据知识库,进行提问。

这个时候我们问一个知识库里面的有答案的问题:什么是人工智能?

可以看到大模型在回答的时候进行了引用

点开以后,会发现一些 unicode 编码,这些就是召回的向量化的文本。

转成文本以后长这个样子

arduino 复制代码
U+4EBA: 期望='人', 实际='人'
U+5DE5: 期望='工', 实际='工'
U+667A: 期望='智', 实际='智'
U+80FD: 期望='能', 实际='能'
U+FF1F: 期望='?', 实际='?'
U+FF08: 期望='(', 实际='('
U+FF09: 期望=')', 实际=')'
U+662F: 期望='是', 实际='是'
U+8BA1: 期望='计', 实际='计'
U+7B97: 期望='算', 实际='算'
U+673A: 期望='机', 实际='机'
U+79D1: 期望='科', 实际='科'
U+5B66: 期望='学', 实际='学'

在向大模型提问的时候,会把些召回的文本一起发给大模型,这样相当于给了大模型"参考资料",大模型就能基于知识库更加准确的回答问题啦。

这里是发给大模型的提示词:

swift 复制代码
content
: 
"Please answer the question based on the reference materials\n\n## Citation Rules:\n- Please cite the context at the end of sentences when appropriate.\n- Please use the format of citation number [number] to reference the context in corresponding parts of your answer.\n- If a sentence comes from multiple contexts, please list all relevant citation numbers, e.g., [1][2]. Remember not to group citations at the end but list them in the corresponding parts of your answer.\n\n## My question is:\n\n什么是人工智能?\n\n## Reference Materials:\n\n```json\n[\n  {\n    "id": 1,\n    "content": "u20154 u24037 u26234 u33021 u65311 A1: uc0u20154 u24037 u26234 u33021 u65288 AIu65289 u26159 u35745 u31639 u26426 u31185 u23398 u30340 u19968 u20010 u20998 u25903 u65292 u26088 u22312 u21019 u24314 u33021 u22815 u25191 u34892 u36890 u24120 u38656 u35201 u20154 u31867 u26234 u33021 u30340 u20219",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  },\n  {\n    "id": 2,\n    "content": "u31070 u32463 u32593 u32476 u26469 u27169 u25311 u20154 u33041 u30340 u24037 u20316 u26041 u24335 u12290 Q3: uc0u20160 u20040 u26159 u31070 u32463 u32593 u32476 u65311 A3: uc0u31070 u32463 u32593 u32476 u26159 u19968 u31181 u35745 u31639 u27169 u22411 u65292 u30001 u22823 u37327 u30456 u20114",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  },\n  {\n    "id": 3,\n    "content": "uc0u33258 u28982 u35821 u35328 u22788 u29702 u65288 NLPu65289 u26159 u20154 u24037 u26234 u33021 u30340 u19968 u20010 u20998 u25903 u65292 u19987 u38376 u22788 u29702 u20154 u31867 u35821 u35328 u30340 u29702 u35299 u12289 u29983 u25104 u21644 u20132 u20114 u65292 u20351 u35745 u31639 u26426 u33021",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  },\n  {\n    "id": 4,\n    "content": "u30456 u20284 u24615 u25628 u32034 u21151 u33021 u12290 Q7: uc0u20160 u20040 u26159 u35789 u23884 u20837 u65311 A7: uc0u35789 u23884 u20837 u26159 u23558 u35789 u27719 u36716 u25442 u20026 u25968 u20540 u21521 u37327 u30340 u25216 u26415 u65292 u20351 u35745 u31639 u26426 u33021 u22815 u29702",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  },\n  {\n    "id": 5,\n    "content": "u27169 u22411 u32467 u21512 u20102 u20449 u24687 u26816 u32034 u21644 u25991 u26412 u29983 u25104 u12290 u23427 u39318 u20808 u20174 u30693 u35782 u24211 u20013 u26816 u32034 u30456 u20851 u20449 u24687 u65292 u28982 u21518 u23558 u26816 u32034 u21040 u30340 u20449 u24687 u19982 u21407 u22987",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  },\n  {\n    "id": 6,\n    "content": "u23398 u20064 u21644 u26080 u30417 u30563 u23398 u20064 u30340 u21306 u21035 u65311 A4: uc0u30417 u30563 u23398 u20064 u20351 u29992 u24102 u26631 u31614 u30340 u25968 u25454 u36827 u34892 u35757 u32451 u65292 u30446 u26631 u26159 u23398 u20064 u36755 u20837 u21644 u36755 u20986 u20043 u38388",\n    "sourceUrl": "{\\rtf1\\ansi\\ansicpg936\\c... \\u31572 \\u12290 \\\n```}",\n    "type": "file"\n  }\n]\n```\n\nPlease respond in the same language as the user's question.\n"
role
: 
"user"

四 看见知识库的原理

上面我们看到了知识库的搭建、召回、以及大模型回答。这整个过程就是 检索增强生成 RAG 的全流程,以下我们会尝试通过伪代码描述的方式让读者进一步"看见"这个过程。这个部分不理解也没关系,后续会有专门的文章讲解 RAG 技术。读者只需要对 RAG 技术有个大概的印象就行,了解知识库不是魔法,一切都是计算。

图片来源自:16 Techniques to Supercharge and Build Real-world RAG Systems---Part 1

我们接下来对 RAG 的核心环节做一个伪代码演示:

  1. 原始问答语料
  2. 文档预处理
  3. 向量嵌入转换
  4. 向量数据库存储
  5. 用户查询输入
  6. 查询向量化
  7. 相似性计算
  8. 结果排序返回

第1步:原始语料输入

arduino 复制代码
输入文本:
"Q: 什么是人工智能?
A: 人工智能(AI)是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的系统。"

第2步:文档预处理

swift 复制代码
{
  "doc_id": "qa_001",
  "original_text": "Q: 什么是人工智能?\nA: 人工智能(AI)是计算机科学的一个分支...",
  "processed_text": "问题:什么是人工智能? 回答:人工智能是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的系统,如学习、推理、感知和决策。",
  "tokens": ["问题", "什么", "是", "人工智能", "回答", "人工智能", "是", "计算机", "科学", "分支", "创建", "系统", "学习", "推理", "感知", "决策"],
  "char_count": 87,
  "token_count": 32
}

第3步:向量嵌入(1024维示例)

ini 复制代码
# 原始文本
text = "问题:什么是人工智能? 回答:人工智能是计算机科学的一个分支..."

# 经过BGE模型嵌入后的向量(只显示前20维)
embedding_vector = [
    0.0234,  -0.1567,   0.2891,  -0.0445,   0.1723,   # 维度 1-5
   -0.2156,   0.0987,  -0.1434,   0.3421,  -0.0678,   # 维度 6-10  
    0.1890,  -0.2234,   0.0567,   0.1987,  -0.1123,   # 维度 11-15
    0.2456,  -0.0789,   0.1345,  -0.1876,   0.0934,   # 维度 16-20
    # ... 省略其余1004维
]

# 向量长度归一化
vector_norm = sqrt(sum(x**2 for x in embedding_vector))  # ≈ 1.0

第4步:向量数据库存储

json 复制代码
{
  "index_info": {
    "collection_name": "ai_qa_knowledge",
    "vector_dimension": 1024,
    "total_documents": 100,
    "index_type": "HNSW",
    "distance_metric": "cosine"
  },
  "stored_document": {
    "id": "qa_001",
    "vector": [0.0234, -0.1567, 0.2891, ...],
    "metadata": {
      "question": "什么是人工智能?",
      "answer": "人工智能是计算机科学的一个分支...",
      "category": "AI基础概念",
      "keywords": ["人工智能", "计算机科学", "智能系统"],
      "timestamp": "2024-01-15T10:30:00Z"
    }
  }
}

第5步:用户查询输入

arduino 复制代码
用户输入:
"AI是什么?"

预处理后:
"AI是什么"

关键词提取:
["AI", "是什么"]

查询意图识别:
"定义查询"

第6步:查询向量化

ini 复制代码
# 查询文本
query = "AI是什么"

# 经过同样BGE模型嵌入的查询向量(前20维)
query_vector = [
    0.0198,  -0.1423,   0.2756,  -0.0312,   0.1589,   # 与文档向量相似
   -0.1987,   0.0834,  -0.1298,   0.3156,  -0.0523,   
    0.1745,  -0.2089,   0.0489,   0.1823,  -0.0987,   
    0.2234,  -0.0654,   0.1198,  -0.1654,   0.0812,   
    # ... 省略其余1004维
]

第7步:相似性计算

python 复制代码
# 计算余弦相似度
def cosine_similarity(vec1, vec2):
    dot_product = sum(a * b for a, b in zip(vec1, vec2))
    norm1 = sqrt(sum(a**2 for a in vec1))
    norm2 = sqrt(sum(b**2 for b in vec2))
    return dot_product / (norm1 * norm2)

# 与存储的文档进行相似性计算
similarities = {
    "qa_001": {
        "question": "什么是人工智能?",
        "similarity": 0.8765,
        "distance": 0.1235,
        "calculation": {
            "dot_product": 0.8923,
            "query_norm": 1.0184,
            "doc_norm": 1.0089,
            "cosine_sim": 0.8765
        }
    },
    "qa_002": {
        "question": "机器学习与深度学习有什么区别?", 
        "similarity": 0.7234,
        "distance": 0.2766,
        "calculation": {
            "dot_product": 0.7445,
            "query_norm": 1.0184,
            "doc_norm": 1.0098,
            "cosine_sim": 0.7234
        }
    },
    "qa_003": {
        "question": "什么是神经网络?",
        "similarity": 0.6789,
        "distance": 0.3211,
        "calculation": {
            "dot_product": 0.6923,
            "query_norm": 1.0184,
            "doc_norm": 1.0076,
            "cosine_sim": 0.6789
        }
    }
}

第8步:结果排序与返回

json 复制代码
{
  "query": "AI是什么?",
  "query_vector_preview": [0.0198, -0.1423, 0.2756, "..."],
  "search_results": [
    {
      "rank": 1,
      "doc_id": "qa_001",
      "similarity_score": 0.8765,
      "distance": 0.1235,
      "content": {
        "question": "什么是人工智能?",
        "answer": "人工智能(AI)是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的系统,如学习、推理、感知和决策。"
      },
      "metadata": {
        "category": "AI基础概念",
        "keywords": ["人工智能", "计算机科学", "智能系统"],
        "relevance": "高度相关"
      }
    },
    {
      "rank": 2,
      "doc_id": "qa_002", 
      "similarity_score": 0.7234,
      "distance": 0.2766,
      "content": {
        "question": "机器学习与深度学习有什么区别?",
        "answer": "机器学习是人工智能的一个子集,通过算法让计算机从数据中学习。深度学习是机器学习的一个分支,使用多层神经网络来模拟人脑的工作方式。"
      },
      "metadata": {
        "category": "机器学习",
        "keywords": ["机器学习", "深度学习", "神经网络"],
        "relevance": "中等相关"
      }
    },
    {
      "rank": 3,
      "doc_id": "qa_003",
      "similarity_score": 0.6789,
      "distance": 0.3211,
      "content": {
        "question": "什么是神经网络?",
        "answer": "神经网络是一种计算模型,由大量相互连接的节点(神经元)组成,能够识别数据中的模式。它模仿了人脑神经元的工作方式。"
      },
      "metadata": {
        "category": "AI基础概念",
        "keywords": ["神经网络", "计算模型", "神经元"],
        "relevance": "相关"
      }
    }
  ],
  "search_metadata": {
    "total_candidates": 100,
    "search_time_ms": 12,
    "relevance_threshold": 0.6,
    "results_above_threshold": 3
  }
}

好了,今天的文章就到这里了,AI 这块的学习,动手实践的效果远大于只看不做,不知道读者是否有收获呢,期待你们的反馈~

五 参考资料

16 Techniques to Supercharge and Build Real-world RAG Systems---Part 1

Brilliant --- Daily Learning, Lifelong Impact!

相关推荐
m0_5374375724 分钟前
【深度学习基础与概念】笔记(一)深度学习革命
人工智能·笔记·深度学习
W说编程26 分钟前
算法导论第二十四章 深度学习前沿:从序列建模到创造式AI
c语言·人工智能·python·深度学习·算法·性能优化
hao_wujing1 小时前
RNN工作原理和架构
人工智能
大模型铲屎官2 小时前
【深度学习-Day 31】CNN基石:彻底搞懂卷积层 (Convolutional Layer) 的工作原理
人工智能·pytorch·python·深度学习·机器学习·cnn·llm
算法如诗3 小时前
Stacking集成BP神经网络/RF/SVM和遗传算法的煤炭配比优化
人工智能·神经网络·支持向量机
观默3 小时前
我用AI造了个“懂我家娃”的育儿助手
前端·人工智能·产品
大明者省3 小时前
清代大模型:智能重构下的帝国黄昏与文明余晖
人工智能·重构
请输入验证码3 小时前
PyTorch 入门之官方文档学习笔记(一)
人工智能·pytorch·深度学习
四川兔兔3 小时前
Pytorch 实战四 VGG 网络训练
人工智能·pytorch·python·深度学习·机器学习·回归·vgg网络
Sim time4 小时前
用AI从0开始量化交易-Anaconda环境(env)和缓存(pkg)更改储存位置
人工智能·python·conda