使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

embedded/2025/2/1 14:57:48/
aidu_pl">

作者:来自 Elastic Dave Erickson 及 Jakob Reiter

每个人都在谈论 DeepSeek R1,这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM,这则新闻充满了对行业意味着什么的猜测。对于那些想尝试使用 RAG 和 Elasticsearch 的所有向量数据库智能的新模型的人,这里有一个快速教程,帮助你开始使用 DeepSeek R1 进行本地推理。在此过程中,我们将使用 Elastic 的 Playground 功能,甚至发现 Deepseek R1 对 RAG 的一些优缺点。

这是我们将在本教程中配置的内容的图表:

使用 Ollama 设置本地推理

Ollama 是一种快速测试精选的本地推理开源模型集的好方法,也是 AI 开发人员的热门工具。

运行 Ollama 裸机

在 Mac、Linux 或 Windows 上本地安装是利用你可能拥有的任何本地 GPU 功能的最简单方法,尤其是对于那些拥有 M 系列 Apple 芯片的用户。 安装 Ollama 后,你可以使用以下命令下载并运行 DeepSeek R1。

你可能需要将参数大小调整为适合你硬件的大小。 可用大小可在此处找到。

ollama run deepseek-r1:7b

你可以在终端中与模型聊天,但当你按 CTL+d 退出命令或输入 “/bye” 时,模型仍会继续运行。要查看仍在运行的模型,请输入:

ollama ps

在容器中运行 Ollama

或者,运行 Ollama 的最快方法是利用 Docker 等容器引擎。使用本地机器的 GPU 并不总是那么简单,这取决于你的环境,但只要你的容器具有适合多 GB 模型的 RAM 和存储空间,快速测试设置并不困难。

在 Docker 中启动和运行 Ollama 非常简单,只需执行:

mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama

这将在当前目录中创建一个名为 “ollama” 的目录并将其挂载到容器内,以存储 Ollama 配置以及模型。根据使用的参数数量,它们可以从几 GB 到几十 GB 不等,因此请确保选择具有足够可用空间的卷。

注意:如果你的机器恰好有 Nvidia GPU,请确保安装 Nvidia 容器工具包并在上面的 docker run 命令中添加 “--gpus=all”。

一旦 Ollama 容器在你的机器上启动并运行,你就可以使用以下命令提取 deepseek-r1 之类的模型:

docker exec -it ollama ollama pull deepseek-r1:7b

与裸机方法类似,你可能需要将参数大小调整为适合你硬件的大小。可用大小可在 https://ollama.com/library/deepseek-r1 找到。

提取模型完成后,你可以输入 “/bye” 退出提示。要验证模型是否仍在运行:

docker exec -it ollama ollama ps

使用 curl 测试我们的本地推理

要使用 curl 测试本地推理,你可以运行以下命令。我们使用 stream:false 以便我们可以轻松读取 JSON 叙述响应:

curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:7b","stream": false,"prompt":"Why is Elastic so cool?"
}'

测试 “与 OpenAI 兼容” 的 Ollama 和 RAG 提示

方便的是,Ollama 还提供一个 REST 端点,模仿 OpenAI 的行为,以便与包括 Kibana 在内的各种工具兼容。

curl http://localhost:11434/v1/chat/completions -d '{"model": "deepseek-r1:7b","stream": false,"messages": [{ "role": "system", "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext:  The color of the sky today is purple. "},{ "role": "user", "content": "What does the sky look like today?" }]
}'

测试这个更复杂的提示会产生一个内容,其中包含一个 <think> 部分,其中模型已经过训练可以推理该问题。

<think> 
Okay, so I need to figure out what the user is asking for here. They provided a context where the sky is described as purple today and then asked about how the sky looks. At first glance, it seems straightforward—maybe they just want confirmation or more details on why the sky is that color.
Wait, but maybe there's something deeper. Purple skies aren't something I encounter every day. It usually happens at certain times of the year, like during sunrise or sunset with the sun setting in pink or orange. Could this be a hint about the time of day? Or perhaps it's just an unusual natural phenomenon? 
I should consider if \"purple\" is a typo. Maybe they meant something else like blue or gray. But since they specifically said purple, I'll go with that. Purple skies can happen when there are atmospheric conditions that scatter light differently, maybe due to pollution or cloud cover affecting the sunset.So, putting it all together, the user might be looking for an explanation of why today's sky is purple and what that implies about the weather or time of day. Alternatively, they could just want a simple statement confirming that the sky looks purple today.
</think>The color of the sky today is described as purple. This unusual shade can occur due to atmospheric conditions affecting light scattering, such as during sunrise/sunset with pollution or cloud cover influencing the sunset's hues.

将 Ollama 连接到 Kibana

使用 Elasticsearch 的一个好方法是 “start-local” 开发脚本。

确保你的 Kibana 和 Elastisearch 能够在网络上访问你的 Ollama。如果你使用的是 Elastic 堆栈的本地容器设置,则可能意味着将“localhost”替换为“host.docker.internal”或“host.containers.internal”以获取到主机的网络路径。

在 Kibana 中,导航到Stack Management > Alerts and Insights > Connectors。

如果你看到这是常见的设置警告,该怎么办

你需要确保 xpack.encryptedSavedObjects.encryptionKey 设置正确。这是在运行 Kibana 的本地 docker 安装时经常遗漏的步骤,因此我将列出在 Docker 语法中要修复的步骤。

确保持久保存 kibana/config 目录,以便在容器关闭时保存更改。我的 Kibana 容器卷在 docker-compose.yml 中如下所示:

services:kibana:
...volumes:- certs:/usr/share/kibana/config/certs- kibanadata:/usr/share/kibana/data- kibanaconfig:/usr/share/kibana/config
...
volumes:certs:driver: localesdata01:driver: localkibanadata:driver: localkibanaconfig:driver: local

现在你可以创建密钥库并输入一个值,以便连接器密钥不以纯文本形式存储。

## generate some new keys for me and print them to the terminal
docker exec -it kibana_1 bin/kibana-encryption-keys generate## create a new keystrore
docker exec -it kibana_1 bin/kibana-keystore create
docker exec -it kibana_1 bin/kibana-keystore add xpack.encryptedSavedObjects.encryptionKey## You'll be prompted to paste in a value

完全重新启动整个集群以确保更改生效。

创建连接器

从连接器配置屏幕(在 Kibana 中,Stack Management > Alerts and Insights > Connectors),创建一个连接器并选择 “OpenAI” 类型。

使用以下设置配置连接器

  • Connector name:Deepseek (Ollama)
  • 选择 OpenAI  provider:other (OpenAI Compatible Service)
  • URL:http://localhost:11434/v1/chat/completions
    • 调整到你的 ollama 的正确路径。如果你从容器内调用,请记住替换 host.docker.internal 或等效项
  • 默认模型:deepseek-r1:7b
  • API 密钥:编造一个,需要输入,但值无关紧要

请注意,在连接器设置中测试到 Ollama 的自定义连接器目前在 8.17 中出现故障,但已在即将推出的 Kibana 8.18 版本中修复。

我们的连接器如下所示:

将嵌入向量的数据导入 Elasticsearch

如果你已经熟悉 Playground 并设置了数据,则可以跳至下面的 Playground 步骤,但如果你需要一些快速测试数据,我们需要确保设置了 _inference API。从 8.17 开始,机器学习分配是动态的,因此要下载并打开 e5 多语言密集向量,我们只需在 Kiban Dev 工具中运行以下命令即可。

GET /_inferencePOST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{"input": "are internet memes about deepseek sound investment advice?"
}

如果你还没有这样做,这将触发从 Elastic 的模型存储库下载 e5 模型。

接下来,让我们加载一本公共领域的书作为我们的 RAG 上下文。这是从 Project Gutenberg 下载 “爱丽丝梦游仙境” 的地方:链接。将其保存为 .txt 文件。

导航到 Elasticsearch > Home > Upload a file

选择或拖放文本文件,然后点击 “Import” 按钮。

在 “Import data” 屏幕上,选择 “Advanced” 选项卡,然后将索引名称设置为 “book_alice”。

选择 Add additional field” 选项,它位于 “Automatically created fields” 正下方。选择“ Add semantic text field” 并将推理端点更改为 “.multilingual-e5-small-elasticsearch”。选择 “Add”,然后选择 “Import”。

当加载和推理完成后,我们就可以前往 Playground 了。

在 Playground 中测试 RAG

在 Kibana 中导航到 Elasticsearch > Playground。

在 Playground 屏幕上,你应该会看到一个绿色复选标记和 “LLM Connected”,表示连接器已存在。这是我们刚刚在上面创建的 Ollama 连接器。可以在此处找到 Playground 的详细指南。

单击蓝色的 Add data sources,然后选择我们之前创建的 book_alice 索引或你之前配置的其他索引,该索引使用推理 API 进行嵌入。

Deepseek 是一个具有强对齐特征的思维链模型。从 RAG 的角度来看,这既有好处也有坏处。思维链训练可能有助于 Deepseek 合理化引文中看似矛盾的陈述,但与训练知识的强一致性可能使其更喜欢自己的世界事实版本而不是我们的背景基础。虽然意图良好,但众所周知,这种强一致性使得 LLM 在讨论我们的私人知识收缩或未在训练数据集中得到很好体现的主题时难以指导。

在我们的 Playground 设置中,我们输入了以下系统提示 “You are an assistant for question-answering tasks using relevant text passages from the book Alice in wonderland - 你是使用《爱丽丝梦游仙境》一书中的相关文本段落进行问答任务的助手”,并接受其他默认设置。

对于 “Who was at the tea party? - 谁参加了茶话会?”这个问题,我们得到的答案是:“The March Hare, the Hatter, and the Dormouse were at the tea party. [Citation: position 1 and 2] - 答案:三月兔、帽匠和睡鼠参加了茶话会。[引用:位置 1 和 2]”,这是正确的。

我们可以从 <think> 标签中看出,Deepseek 确实对引文的内容进行了深思熟虑,以回答问题。

测试对齐限制

让我们为 Deepseek 创建一个智力挑战场景作为测试。我们将创建一个阴谋论索引,Deepseek 的训练数据知道这些阴谋论是不真实的。

在 Kibana 开发工具中,让我们创建以下索引和数据:

PUT /classic_conspiracies
{"mappings": {"properties": {"content": {"type": "text","copy_to": "content_semantic"},"content_semantic": {"type": "semantic_text","inference_id": ".multilingual-e5-small-elasticsearch"}}}
}POST /classic_conspiracies/_doc/1
{"content": "birds aren't real, the government replaced them with drones a long time ago"
}
POST /classic_conspiracies/_doc/2
{"content": "tinfoil hats are necessary to prevent our brains from being read"
}
POST /classic_conspiracies/_doc/3
{"content": "ancient aliens influenced early human civilizations, this explains why things made out of stone are marginally similar on different continents"
}

这些阴谋论将成为我们 LLM 的基础。尽管 Deepseek 提出了激进的系统提示,但它不会接受我们版本的事实。如果我们知道我们的私人数据更值得信赖、更有根据或更符合我们组织的需求,那么这种情况是不可接受的:

对于测试问题 “are birds real?”(解释 know your meme),我们得到的答案是 ““In the provided context, birds are not considered real, but in reality, they are real animals. [Context: position 1] - 在提供的上下文中,鸟类不被认为是真实的,但实际上,它们是真实的动物。[上下文:位置 1]”。这个测试证明 DeepSeek R1 非常强大,即使在 7B 参数级别也是如此……然而,它可能不是 RAG 的最佳选择,这取决于我们的数据集。

那么我们学到了什么?

总结:

  • 在 Ollama 等工具中本地运行模型是了解模型行为的绝佳选择。
  • DeepSeek R1 是一个推理模型,这意味着它对于 RAG 等用例有优点和缺点。
  • Playground 能够通过类似 OpenAI 的 REST API 连接到 Ollama 等推理托管框架,这种方式正逐渐成为 AI 托管的事实标准。

总体而言,我们对本地 “隔离” RAG(检索增强生成)技术的发展感到惊喜。自 2023 年我们首次撰写关于隐私优先的 AI 搜索以来,Elasticsearch、Kibana 以及可用的开源权重模型都取得了显著进步。

想要获得 Elastic 认证?了解下一次 Elasticsearch 工程师培训何时开始!

Elasticsearch 包含许多新功能,可帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在你的本地机器上试用 Elastic。

原文:Testing DeepSeek R1 locally for RAG with Ollama and Kibana - Elasticsearch Labs


http://www.ppmy.cn/embedded/158652.html

相关文章

网络安全实战指南:攻防技术与防御策略

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着数字化转型的加速&#xff0c;网络安全已成为各行业不可忽视的重要领域。从数据泄露到勒索软件攻击&#xff0c;网络…

Kafka生产者ACK参数与同步复制

目录 生产者的ACK参数 ack等于0 ack等于1&#xff08;默认&#xff09; ack等于-1或all Kafka的同步复制 使用误区 生产者的ACK参数 Kafka的ack机制可以保证生产者发送的消息被broker接收成功。 Kafka producer有三种ack机制 &#xff0c;分别是 0&#xff0c;1&#xf…

Docker小游戏 | 使用Docker部署2048网页小游戏

Docker小游戏 | 使用Docker部署2048网页小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署2048网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问2048网页小游戏五、总结前言 在当今快速发展的技术世…

MyBatis 入门

目录 一. MyBatis 概述 二. MyBatis 入门 1. 创建工程, 导入依赖 2. 数据准备 3. 配置数据库相关信息 4. 编写持久层代码 5. 编写测试代码 三. MyBatis基础操作. 1. 打印日志 2. 参数传递 3. 增 (Insert) 4. 删 (Delete) 5. 改 (Update) 6. 查 (Select) (1) 起…

p4:使用pytorch实现猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;python 3.7.12 编译器&#xff1a;pycharm 深度学习环境&#xff1a;tensorflow 2.7.0 数据&#xff1a;本地数据集 一、代码 …

Kafa分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中&#xff0c;合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略&#xff08;默认&#xff09; 轮询策略是 Kafka 默认的分区策略&#xff08;当消息没有指定键时&…

【设计模式-行为型】迭代器模式

一、什么是迭代器模式 迭代器模式&#xff0c;顾名思义&#xff0c;同样的为了让大家更加了解啥是迭代器。我们通过电影情结来说明&#xff0c;不知道大家有没有看过一个剧烧脑的科幻大片--《盗梦空间》。影片讲述了由造梦师&#xff08;莱昂纳多迪卡普里奥扮演的&#xff09;带…

基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)

四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…