如何使用 Ollama 的 API 来生成聊天

embedded/2025/3/5 5:53:51/
aidu_pl">

ain-toc" name="tableOfContents">如何使用 Ollama 的 API 来生成聊天

简介

生成聊天

生成聊天的示例

加载模型

卸载模型

简介

        Ollama 提供了一个 RESTful API,允许开发者通过 HTTP 请求与 Ollama 服务进行交互。这个 API 覆盖了所有 Ollama 的核心功能,包括模型管理、运行和监控。本篇将介绍如何调用 Ollama 的 RESTful API 来生成聊天。

生成聊天

端点

POST /api/chat

        该 API 将使用所提供的模型生成聊天中的下一条消息 。要注意这是一个流式传输端点,因此会有一系列的回复,也可以通过设置 stream 为 false 来禁用流式传输,使得只进行一次回复(该次回复将恢复包含所有回复的内容)。最终回复回来的响应会包含来自请求的统计信息和其他数据。

基本参数

  • model(必需) : 模型名称
  • messages:聊天消息,可用于保留聊天记录
  • tools:以 JSON 格式列出可以供模型使用的工具(需要模型支持)

message 对象的参数

  • role:消息的角色,可以是 system(系统)、user(用户)、assistant(助手)或 tool(工具)
  • content:消息的内容
  • images(可选):消息中包含的图像列表(适用于像 LLaVA 这样的多模态模型)
  • tool_calls(可选):以 JSON 格式列出模型想要使用工具列表

高级参数(可选)

  • format:指定服务器返回响应的格式。格式可以是 json(模型能根据提供的 JSON 格式来生成一个符合该格式的格式化输出)或者是 JSON 模式(会返回一个标准且完整的 JSON 结构)。
  • options:Modelfile 中的其他模型参数,例如,temperature(温度)之类的参数。
  • stream:如果设置为 false,响应将作为单个响应对象返回,而对象流。
  • keep_alive:控制模型在请求完成后,在内存中保持加载状态的时长(默认为5分钟)。

生成聊天的示例

一、聊天请求(流式)

请求

        发送一条聊天消息,将会以流的形式进行响应。

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": [{"role": "user","content": "why is the sky blue?"}]
}'

响应

        流中的其中一个响应的 JSON 对象,如下所示

{"model": "llama3.2","created_at": "2025-03-03T03:06:32.8915833Z","message": {"role": "assistant","content": "The"},"done": false
}

        流最后一个响应包将会包含所有参数,如下所示

{"model": "llama3.2","created_at": "2025-03-03T03:06:34.7564372Z","message": {"role": "assistant","content": ""},"done_reason": "stop","done": true,"total_duration": 10451492400,"load_duration": 8474040300,"prompt_eval_count": 31,"prompt_eval_duration": 93000000,"eval_count": 298,"eval_duration": 1880000000
}

二、聊天请求(非流式)

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": [{"role": "user","content": "why is the sky blue?"}],"stream": false
}'

响应

{"model": "llama3.2","created_at": "2025-03-03T03:11:03.1902143Z","message": {"role": "assistant","content": "The sky appears blue to our eyes because of a phenomenon called Rayleigh scattering, ..., the sky appears blue because of the scattering of sunlight by tiny molecules in the atmosphere, specifically Rayleigh scattering."},"done_reason": "stop","done": true,"total_duration": 1927411000,"load_duration": 11525300,"prompt_eval_count": 31,"prompt_eval_duration": 2000000,"eval_count": 307,"eval_duration": 1913000000
}

三、聊天请求(格式化输出)

请求

curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{"model": "llama3.2","messages": [{"role": "user", "content": "Ollama is 22 years old and busy saving the world. Return a JSON object with the age and availability."}],"stream": false,"format": {"type": "object","properties": {"age": {"type": "integer"},"available": {"type": "boolean"}},"required": ["age","available"]},"options": {"temperature": 0}
}'

注意:-H(--header) 指的是请求包的头部需要包含的 key: value

 响应

{"model": "llama3.2","created_at": "2025-03-03T03:15:53.1135514Z","message": {"role": "assistant","content": "{ \"age\": 22, \"available\": false }"},"done_reason": "stop","done": true,"total_duration": 132875200,"load_duration": 11059800,"prompt_eval_count": 49,"prompt_eval_duration": 6000000,"eval_count": 13,"eval_duration": 113000000
}

四、聊天请求(有上下文的)

        发送一条带有聊天记录的聊天消息。如果想要进行多次提问或者思维链(CoT Prompting,Chain-of-Thought Prompting) 来开启对话,可以使用这一种方式。

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": [{"role": "user","content": "why is the sky blue?"},{"role": "assistant","content": "due to rayleigh scattering."},{"role": "user","content": "how is that different than mie scattering?"}]
}'

注意:该请求默认是流式响应,如果不想进行流式响应可以把 stream 参数设置为 false

响应

        请求默认为流式响应,流中的其中一个响应的 JSON 对象,如下所示

{"model": "llama3.2","created_at": "2025-03-03T03:32:57.8301713Z","message": {"role": "assistant","content": "Ray"},"done": false
}

        流最后一个响应包将会包含所有参数,如下所示

{"model": "llama3.2","created_at": "2025-03-03T03:32:59.947737Z","message": {"role": "assistant","content": ""},"done_reason": "stop","done": true,"total_duration": 10420930200,"load_duration": 7960990600,"prompt_eval_count": 55,"prompt_eval_duration": 57000000,"eval_count": 339,"eval_duration": 2147000000
}

五、聊天请求(带 images)

        发送一个带图片的聊天消息。在发送该请求时需要使用 LLaVA 或 BakLLaVA 这类多模态模型,如果是多张图片需要以数组的形式提供,并且每张图片都需要转换为 Base64 编码。

请求

{"model": "llava","stream": false,"messages": [{"role": "user","content": "what is in this image?","images": ["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"]}]
}

响应

{"model": "llava","created_at": "2025-03-03T03:37:28.2035137Z","message": {"role": "assistant","content": " The image shows a cartoon character that resembles a pig with a human-like gesture. It appears to be waving, as indicated by the hand above its head. The style of the character is reminiscent of manga or anime designs, with simple lines and exaggerated expressions. "},"done_reason": "stop","done": true,"total_duration": 538754700,"load_duration": 3500000,"prompt_eval_count": 591,"prompt_eval_duration": 1000000,"eval_count": 62,"eval_duration": 533000000
}

六、聊天请求(固定输出)

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","stream": false,"messages": [{"role": "user","content": "Hello!"}],"options": {"seed": 101,"temperature": 0}
}'

响应

{"model": "llama3.2","created_at": "2025-03-03T04:04:52.9114515Z","message": {"role": "assistant","content": "How can I assist you today?"},"done_reason": "stop","done": true,"total_duration": 63318300,"load_duration": 10508400,"prompt_eval_count": 27,"prompt_eval_duration": 2000000,"eval_count": 8,"eval_duration": 50000000
}

七、聊天请求(带 tools)

        tools 可以让模型调用特定的函数来完成更复杂的任务,它是一个数组,每个元素代表一个可以被模型调用的工具。每个工具对象通常包含 type 和 function 字段,type 一般为“function”,function 则描述了函数的详细信息,包括名称、描述和参数。

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": [{"role": "user","content": "What is the weather today in Paris?"}],"stream": false,"tools": [{"type": "function","function": {"name": "get_current_weather","description": "Get the current weather for a location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The location to get the weather for, e.g. San Francisco, CA"},"format": {"type": "string","description": "The format to return the weather in, e.g. 'celsius' or 'fahrenheit'","enum": ["celsius", "fahrenheit"]}},"required": ["location", "format"]}}}]
}'

响应

{"model": "llama3.2","created_at": "2025-03-03T04:11:33.4754367Z","message": {"role": "assistant","content": "","tool_calls": [{"function": {"name": "get_current_weather","arguments": {"format": "celsius","location": "Paris"}}}]},"done_reason": "stop","done": true,"total_duration": 179741300,"load_duration": 11204800,"prompt_eval_count": 217,"prompt_eval_duration": 5000000,"eval_count": 25,"eval_duration": 163000000
}

         当收到包含 tool_calls 的响应后,你需要根据 tool_calls 中的信息执行相应的函数。在这个例子中,你需要调用 get_current_weather 函数,并传入 location 和 format 参数。至于天气数据的获取就可能需要调用外部天气查询网站的 API 或者爬虫抓取来获取实际的天气信息了。

# 请替换为你自己的 OpenWeatherMap API 密钥
API_KEY="your_openweathermap_api_key"
LOCATION="Paris"
URL="https://api.openweathermap.org/data/2.5/weather?q=$LOCATION&appid=$API_KEY&units=metric"RESPONSE=$(curl -s $URL)
echo $RESPONSE

        最后把获取到的最终结果重新封装成 JSON 对象,然后发送给模型,让模型根据这些结果生成最终的回复

{"model": "llama3.2","messages": [{"role": "user","content": "What is the weather today in Paris?"},{"role": "tool","name": "get_current_weather","parameters": {"location": "Paris","format": "celsius"},"content": "{\"weather\": [\"description\": \"Clear\", \"temperature\": 3]}"}],"stream": false
}

加载模型

        如果只是想单单加载模型进内存当中,只需要发送一个聊天请求,当中包含一个空的消息列表(messages array)即可。

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": []
}'

响应

{"model": "llama3.2","created_at": "2025-03-03T04:20:32.7883778Z","message": {"role": "assistant","content": ""},"done_reason": "load","done": true
}

卸载模型

        卸载模型只需要在加载模型的基础上加上 keep_alive 参数,并设置为0即可卸载已加载的模型。 

请求

curl http://localhost:11434/api/chat -d '{"model": "llama3.2","messages": [],"keep_alive": 0
}'

响应

{"model": "llama3.2","created_at": "2025-03-03T04:21:35.8883384Z","message": {"role": "assistant","content": ""},"done_reason": "unload","done": true
}


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

相关文章

Python元类(Metaclass)

引言 Python中的**元类(Metaclass)**是一个高级且强大的概念,它允许开发者控制类的创建行为。尽管元类在日常开发中并不常见,但在某些场景下(如框架开发、ORM实现等),元类可以发挥重要作用。本文将深入探讨元类的概念、工作原理、常见用法以及实际应用场景,帮助你全面…

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中,首先要知道机器人的DH参数,然后计算出每一个关节的位置,最后利用 plot 函数画出关节之间的连杆就可以了,最后利用 animation 库来实现一个动画效果。 import matplo…

Python 图像处理之 Pillow 库:玩转图片

哈喽,大家好,我是木头左! Pillow 库作为 Python 图像处理的重要工具之一,为提供了便捷且功能丰富的接口,让能够轻松地对图像进行各种操作,从简单的裁剪、旋转到复杂的滤镜应用、图像合成等,几乎无所不能。接下来,就让一起深入探索如何使用 Pillow 库来处理图片,开启一…

【Python项目】基于Python的书籍售卖系统

【Python项目】基于Python的书籍售卖系统 技术简介:采用Python技术、MYSQL数据库等实现。 系统简介:书籍售卖系统是一个基于B/S结构的在线图书销售平台,主要分为前台和后台两部分。前台系统功能模块分为(1)用户中心模…

将 SSH 密钥添加到 macOS 的钥匙串中

git提交代码时,如果SSH密码并未免密,每次拉取,上传操作时都需要密码输入, 可将SSH密钥添加到钥匙串中 git config --global credential.helper store报错: WARNING: The -K and -A flags are deprecated and have bee…

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析《更新中》

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题D:回文数组试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需…

贪心算法+题目

贪心算法 跳跃游戏跳跃游戏2 跳跃游戏 题目 拿到题目就暴力穷举,我用的是dfs,加上备忘录之后还是超出时间限制。就考虑一下贪心算法。你想 我在[0,n-2]位置遍历求出可以跳跃的最远距离,用farthest更新最大值,如果>终点就返回t…

HarmonyOS学习第12天:解锁表格布局的奥秘

表格布局初相识 不知不觉,我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里,我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能,比如组件的基本使用、布局的初步搭建等,这些知识就像一块块基石,为我…