利用duckdb和ollama在本地部署大模型批量生成问题解答 - l1t1/note GitHub Wiki

利用DuckDB和Ollama在本地部署大模型批量生成问题解答

DuckDB提供了http_client插件(插件链接),而Ollama提供了基于HTTP协议的REST API。通过将两者结合,可以利用大模型批量生成问题解答,并将结果存入数据库文件。

以下是详细的操作步骤:


1. 启动Ollama

首先,启动Ollama服务:

ollama serve

2. 使用curl测试Ollama的REST API

通过curl命令测试Ollama的API是否正常工作:

curl http://localhost:11434/

如果返回Ollama is running,则表明Ollama服务已正常启动。

注意:

  • 如果在容器中运行Ollama,并在容器外使用curl访问,需要在运行容器时添加--network host参数。
  • 在Linux环境中,可以使用以下命令测试API:
    curl http://localhost:11434/api/chat -d '{
      "model": "deepseek-r1:1.5b",
      "messages": [
        { "role": "user", "content": "你是谁" }
      ],
      "stream": false
    }'
  • 在Windows环境中,由于不支持多行命令输入,可以将-d参数的内容(不含单引号)写入文件a.json,然后执行:
    curl http://localhost:11434/api/chat -d @a.json

返回示例:

{
  "model": "deepseek-r1:1.5b",
  "created_at": "2025-02-22T00:51:30.7930278Z",
  "message": {
    "role": "assistant",
    "content": "<think>\n\n</think>\n\n您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何问题,我会尽我所能为您提供帮助。"
  },
  "done_reason": "stop",
  "done": true,
  "total_duration": 2168808400,
  "load_duration": 1330808300,
  "prompt_eval_count": 5,
  "prompt_eval_duration": 32000000,
  "eval_count": 40,
  "eval_duration": 803000000
}

3. 启动DuckDB并安装HTTP插件

在DuckDB中安装并加载http_client插件:

INSTALL http_client FROM community;
LOAD http_client;

注意:

  • 如果DuckDB无法访问互联网,可以手动下载插件文件(下载链接),然后通过以下命令安装:
    INSTALL 'http_client.duckdb_extension.gz';

4. 测试DuckDB插件访问Ollama

使用DuckDB的http_get函数测试插件是否正常工作:

.mode list
SELECT http_get('http://localhost:11434/api/chat') AS r;

如果返回404 page not found,则表明插件可以正常访问Ollama的API。


5. 将curl命令改写为DuckDB的HTTP插件语法

将curl命令转换为DuckDB的http_post函数调用:

SELECT http_post(
  'http://localhost:11434/api/chat',
  headers => MAP {
    'accept': 'application/json'
  },
  params => {
    'model': 'deepseek-r1:1.5b',
    'messages': [{'role': 'user', 'content': '你是谁'}],
    'stream': false
  }
) AS a;

注意:

  • params参数后不能使用MAP关键字,因为DuckDB的MAP要求所有值类型一致,而此处值类型不同。使用{}表示结构类型,允许不同的值类型。
  • 此步骤的返回结果应与第2步的curl命令结果一致。

6. 从响应中提取有用信息

通过DuckDB的JSON函数从API响应中提取content字段:

SET threads=1;
.mode list

WITH a AS (
  SELECT q, http_post(
    'http://localhost:11434/api/chat',
    headers => MAP {
      'accept': 'application/json'
    },
    params => {
      'model': 'deepseek-r1:1.5b',
      'messages': [{'role': 'user', 'content': q}],
      'stream': false
    }
  ) AS res
  FROM (SELECT '你是谁' AS q UNION ALL SELECT '1+1')
)
SELECT q, unnest(
  from_json(
    ((res->>'body')::JSON)->'message',
    '{"content": "VARCHAR"}'
  )
) FROM a;

说明:

  • 将DuckDB的线程数设置为1,避免并发冲突导致请求失败。
  • 该SQL语句读取两个问题(“你是谁”和“1+1”),并将API响应中的content字段提取出来。

返回示例:

q|content
你是谁|<think>

</think>

您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何问题,我会尽我所能为您提供帮助。
1+1|<think>

</think>

**1 + 1 = 2**

When you add one to another one, you get two. This is a fundamental concept in arithmetic.

总结

通过以上步骤,您可以利用DuckDB和Ollama在本地部署大模型,并批量生成问题解答。此方法适用于需要自动化处理大量问题的场景,同时能够将结果直接存入数据库文件,便于后续分析和使用。

⚠️ **GitHub.com Fallback** ⚠️