利用duckdb和ollama在本地部署大模型批量生成问题解答 - l1t1/note GitHub Wiki
DuckDB提供了http_client
插件(插件链接),而Ollama提供了基于HTTP协议的REST API。通过将两者结合,可以利用大模型批量生成问题解答,并将结果存入数据库文件。
以下是详细的操作步骤:
首先,启动Ollama服务:
ollama serve
通过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
}
在DuckDB中安装并加载http_client
插件:
INSTALL http_client FROM community;
LOAD http_client;
- 如果DuckDB无法访问互联网,可以手动下载插件文件(下载链接),然后通过以下命令安装:
INSTALL 'http_client.duckdb_extension.gz';
使用DuckDB的http_get
函数测试插件是否正常工作:
.mode list
SELECT http_get('http://localhost:11434/api/chat') AS r;
如果返回404 page not found
,则表明插件可以正常访问Ollama的API。
将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命令结果一致。
通过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在本地部署大模型,并批量生成问题解答。此方法适用于需要自动化处理大量问题的场景,同时能够将结果直接存入数据库文件,便于后续分析和使用。