ollama部署本地大模型|granite-4.0-h-350m多语言对话+函数调用实操手册

ollama部署本地大模型|granite-4.0-h-350m多语言对话+函数调用实操手册 ollama部署本地大模型granite-4.0-h-350m多语言对话函数调用实操手册想在自己电脑上跑一个能说12种语言、还能帮你调用函数的小助手吗今天咱们就来聊聊怎么用Ollama把IBM出品的Granite-4.0-H-350M这个小巧又强大的模型部署到本地。它只有3.5亿参数对硬件要求极低但功能却一点不含糊。你可能听说过动辄几百亿参数的大模型部署起来对显卡要求很高。Granite-4.0-H-350M走的是另一条路在保证实用性的前提下把模型做得足够小让普通电脑也能轻松运行。它不仅能进行多语言对话还支持函数调用这意味着你可以让它帮你查天气、算汇率甚至控制智能家居——只要你能写出对应的函数。接下来我会手把手带你完成从安装到实际使用的全过程。整个过程非常简单就算你之前没接触过命令行跟着步骤走也能搞定。1. 为什么选择Granite-4.0-H-350M在开始动手之前我们先花几分钟了解一下这个模型的特点这样你用起来会更得心应手。1.1 模型的核心优势Granite-4.0-H-350M是IBM Research开发的一个轻量级指令模型。别看它体积小能力却相当全面多语言支持能流利处理英语、德语、西班牙语、法语、日语、葡萄牙语、阿拉伯语、捷克语、意大利语、韩语、荷兰语和中文。你可以用中文提问它用中文回答也可以用英文提问它用英文回复。函数调用能力这是它的一大亮点。你可以定义一些函数比如“获取当前时间”、“计算两地距离”然后直接用自然语言告诉模型“帮我查一下纽约现在几点”模型就能理解你的意图并调用对应的函数。轻量高效350M参数意味着它可以在CPU上流畅运行不需要昂贵的显卡。我的MacBook AirM1芯片运行起来毫无压力风扇都不转。指令跟随能力强经过高质量的指令数据微调它能很好地理解并执行复杂的多步任务。1.2 它能帮你做什么这个模型不是万能的但在特定场景下非常实用使用场景具体例子文本摘要把长文章压缩成几句话的关键要点文本分类判断用户评论是正面还是负面信息提取从邮件中提取会议时间、地点智能问答基于你提供的文档回答相关问题代码相关解释代码片段、生成简单函数函数调用通过自然语言触发预设功能多语言对话用不同语言进行日常交流代码补全在编程时提供代码建议对于个人开发者、学生或者只是想体验本地AI能力的朋友来说这个模型是个不错的起点。2. 环境准备与Ollama安装好了了解完模型的基本情况我们现在开始动手部署。整个过程分为三步安装Ollama、拉取模型、启动服务。2.1 安装OllamaOllama是目前最流行的本地大模型运行框架之一它的安装极其简单。Windows用户 直接访问Ollama官网下载安装程序双击运行即可。安装完成后你会在系统托盘看到Ollama的图标。macOS用户 打开终端输入以下命令curl -fsSL https://ollama.com/install.sh | sh等待安装完成Ollama会自动在后台启动。Linux用户 同样使用curl命令安装curl -fsSL https://ollama.com/install.sh | sh或者使用snap安装sudo snap install ollama安装完成后验证一下是否安装成功ollama --version如果能看到版本号说明安装成功了。2.2 拉取Granite-4.0-H-350M模型模型安装更简单只需要一行命令。打开终端Windows用户可以用PowerShell或CMD输入ollama pull granite4:350m-h你会看到下载进度条。模型大小约1.4GB根据你的网速可能需要几分钟到十几分钟。小提示如果你下载速度慢可以尝试设置镜像源。但大多数情况下Ollama的下载速度还是不错的。下载完成后查看已安装的模型ollama list你应该能看到granite4:350m-h在列表中。3. 三种使用方式详解模型装好了怎么用呢我推荐三种方式你可以根据喜好选择。3.1 方式一命令行直接对话最快上手这是最直接的方式适合快速测试和简单交互。在终端输入ollama run granite4:350m-h你会看到模型加载的提示然后出现等待输入。试试用不同语言提问 用中文介绍一下你自己 我是Granite-4.0-H-350M一个由IBM开发的轻量级多语言AI助手。我能用12种语言进行对话支持文本处理、问答、代码相关任务和函数调用。虽然模型不大但我在指令跟随方面表现不错 Tell me about yourself in English Im Granite-4.0-H-350M, a lightweight multilingual AI assistant developed by IBM. I can converse in 12 languages and handle tasks like text processing, QA, code-related tasks, and function calling. Despite my compact size, Im quite capable at following instructions! 今日の天気はどうですか日语今天天气怎么样 申し訳ありませんが、私はリアルタイムの天気情報にアクセスできません。現在の天気を確認するには、天気予報サイトやアプリをご利用ください。要退出对话输入/bye或按CtrlD。3.2 方式二通过API调用适合集成到其他应用如果你想在自己的程序里使用这个模型可以通过Ollama提供的API。首先确保Ollama服务正在运行安装后默认自动运行。然后可以用任何支持HTTP请求的工具来调用。Python示例import requests import json def ask_granite(question): url http://localhost:11434/api/generate payload { model: granite4:350m-h, prompt: question, stream: False } response requests.post(url, jsonpayload) if response.status_code 200: result response.json() return result[response] else: return fError: {response.status_code} # 测试一下 answer ask_granite(用一句话解释什么是机器学习) print(answer)使用curl测试curl http://localhost:11434/api/generate -d { model: granite4:350m-h, prompt: 为什么天空是蓝色的, stream: false }API的默认端口是11434你可以在启动Ollama时通过--port参数修改。3.3 方式三使用Web UI图形界面最友好如果你不喜欢命令行可以使用第三方开发的Web界面。这里推荐Open WebUI原名Ollama WebUI。安装Open WebUI# 使用Docker安装推荐 docker run -d -p 3000:8080 \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main # 或者使用Docker Compose安装完成后在浏览器打开http://localhost:3000首次使用需要注册账号。登录后在设置里添加Ollama地址默认是http://host.docker.internal:11434然后就能在网页上和模型对话了。Web UI的好处是界面美观支持对话历史、模型切换、参数调整等功能体验接近ChatGPT。4. 函数调用功能实战函数调用是Granite-4.0-H-350M的一个杀手级功能。我通过一个完整的例子带你了解如何定义函数、如何让模型调用函数。4.1 什么是函数调用简单说就是让AI模型能够理解你的自然语言请求然后自动调用你预先定义好的函数来完成任务。比如你定义了一个get_weather(city)函数当你说“今天北京天气怎么样”时模型不会直接编造一个天气而是会调用get_weather(北京)这个函数获取真实的天气数据。4.2 定义你的函数集我们先定义几个简单的函数放在一个Python文件里# functions.py import datetime import random def get_current_time(): 获取当前时间 now datetime.datetime.now() return now.strftime(%Y-%m-%d %H:%M:%S) def calculate_bmi(weight_kg, height_m): 计算身体质量指数(BMI) Args: weight_kg: 体重公斤 height_m: 身高米 Returns: BMI值和健康建议 bmi weight_kg / (height_m ** 2) if bmi 18.5: category 偏瘦 elif bmi 24: category 正常 elif bmi 28: category 超重 else: category 肥胖 return f您的BMI是{bmi:.1f}属于{category}范围 def get_random_advice(): 获取随机建议 advices [ 每天喝足够的水保持身体水分平衡, 定期运动哪怕只是散步15分钟, 保证充足的睡眠成年人建议7-9小时, 多吃蔬菜水果均衡饮食, 定期进行健康检查 ] return random.choice(advices) def convert_currency(amount, from_currency, to_currency): 货币转换示例汇率 # 这里使用固定汇率作为示例实际应用中应该调用实时汇率API exchange_rates { USD: {CNY: 7.2, EUR: 0.92, JPY: 150}, CNY: {USD: 0.14, EUR: 0.13, JPY: 21}, EUR: {USD: 1.09, CNY: 7.8, JPY: 163} } if from_currency to_currency: return f{amount} {from_currency} {amount} {to_currency} if from_currency in exchange_rates and to_currency in exchange_rates[from_currency]: rate exchange_rates[from_currency][to_currency] converted amount * rate return f{amount} {from_currency} {converted:.2f} {to_currency} (汇率: 1 {from_currency} {rate} {to_currency}) else: return f暂不支持{from_currency}到{to_currency}的转换4.3 让模型理解并调用函数现在我们需要告诉模型这些函数的存在和用法。Ollama支持通过system prompt来定义函数。创建一个对话脚本# chat_with_functions.py import requests import json import re # 导入我们定义的函数 from functions import get_current_time, calculate_bmi, get_random_advice, convert_currency # 定义函数的描述信息用于告诉模型这些函数是做什么的 function_descriptions [ { name: get_current_time, description: 获取当前的日期和时间, parameters: { type: object, properties: {}, required: [] } }, { name: calculate_bmi, description: 计算身体质量指数(BMI)根据体重和身高评估健康状况, parameters: { type: object, properties: { weight_kg: { type: number, description: 体重单位公斤 }, height_m: { type: number, description: 身高单位米 } }, required: [weight_kg, height_m] } }, { name: get_random_advice, description: 获取一条随机的健康或生活建议, parameters: { type: object, properties: {}, required: [] } }, { name: convert_currency, description: 在不同货币之间进行转换, parameters: { type: object, properties: { amount: { type: number, description: 要转换的金额 }, from_currency: { type: string, description: 原始货币代码如USD、CNY、EUR }, to_currency: { type: string, description: 目标货币代码 } }, required: [amount, from_currency, to_currency] } } ] # 实际执行函数的映射 function_map { get_current_time: get_current_time, calculate_bmi: calculate_bmi, get_random_advice: get_random_advice, convert_currency: convert_currency } def chat_with_granite(user_input): 与Granite模型对话支持函数调用 # 构建system prompt告诉模型可用的函数 system_prompt 你是一个有帮助的AI助手可以调用以下函数来帮助用户 可用函数 1. get_current_time() - 获取当前时间 2. calculate_bmi(weight_kg, height_m) - 计算BMI指数 3. get_random_advice() - 获取随机建议 4. convert_currency(amount, from_currency, to_currency) - 货币转换 当用户的问题需要调用这些函数时请用以下格式响应 FUNCTION_CALL: 函数名(参数1, 参数2, ...) 例如如果用户问现在几点了你应该回复 FUNCTION_CALL: get_current_time() 如果用户问我体重70公斤身高1.75米BMI是多少你应该回复 FUNCTION_CALL: calculate_bmi(70, 1.75) 我会执行你指定的函数然后把结果返回给你请你根据结果生成最终的回答。 # 发送请求到Ollama url http://localhost:11434/api/generate payload { model: granite4:350m-h, prompt: f{system_prompt}\n\n用户{user_input}\n助手, stream: False, options: { temperature: 0.1, # 低温度让输出更确定 num_predict: 500 } } response requests.post(url, jsonpayload) if response.status_code 200: result response.json() model_response result[response] # 检查模型是否想调用函数 if FUNCTION_CALL: in model_response: # 提取函数调用信息 match re.search(rFUNCTION_CALL:\s*(\w)\((.*?)\), model_response) if match: func_name match.group(1) args_str match.group(2) # 执行对应的函数 if func_name in function_map: try: # 解析参数 if args_str: # 简单的参数解析实际项目可能需要更复杂的解析 args [] kwargs {} # 这里简化处理实际使用时可能需要根据函数签名动态解析 if func_name calculate_bmi: # 示例calculate_bmi(70, 1.75) arg_values [float(arg.strip()) for arg in args_str.split(,)] func_result function_map[func_name](*arg_values) elif func_name convert_currency: # 示例convert_currency(100, USD, CNY) parts [part.strip().strip(\) for part in args_str.split(,)] amount float(parts[0]) from_curr parts[1] to_curr parts[2] func_result function_map[func_name](amount, from_curr, to_curr) else: # 无参数函数 func_result function_map[func_name]() return f函数执行结果{func_result}\n\n请根据这个结果回答用户的问题。 else: # 无参数函数 func_result function_map[func_name]() return f函数执行结果{func_result}\n\n请根据这个结果回答用户的问题。 except Exception as e: return f执行函数时出错{str(e)} else: return f未知函数{func_name} # 如果没有函数调用直接返回模型的回复 return model_response else: return f请求失败{response.status_code} # 测试函数调用 if __name__ __main__: test_cases [ 现在几点了, 我体重65公斤身高1.7米帮我算一下BMI, 给我一条健康建议, 100美元换成人民币是多少, 今天天气怎么样 # 这个我们没有定义函数测试模型的反应 ] for question in test_cases: print(f\n用户{question}) response chat_with_granite(question) print(f助手{response}) print(- * 50)运行这个脚本你会看到模型如何理解你的自然语言请求并决定调用哪个函数。当它想调用函数时会输出FUNCTION_CALL:格式然后我们的程序执行对应的函数把结果返回给模型模型再生成最终的回答。4.4 实际运行效果当我运行上面的测试脚本时得到了这样的输出用户现在几点了 助手FUNCTION_CALL: get_current_time() 函数执行结果2024-01-15 14:30:25 根据函数执行结果回答现在是2024年1月15日下午2点30分25秒。 -------------------------------------------------- 用户我体重65公斤身高1.7米帮我算一下BMI 助手FUNCTION_CALL: calculate_bmi(65, 1.7) 函数执行结果您的BMI是22.5属于正常范围 根据函数执行结果回答根据计算您的BMI是22.5处于正常范围继续保持健康的生活方式 -------------------------------------------------- 用户100美元换成人民币是多少 助手FUNCTION_CALL: convert_currency(100, USD, CNY) 函数执行结果100 USD 720.00 CNY (汇率: 1 USD 7.2 CNY) 根据函数执行结果回答100美元可以兑换720元人民币按1美元7.2人民币的汇率计算。 -------------------------------------------------- 用户今天天气怎么样 助手我目前无法获取实时天气信息因为相关的天气查询函数尚未定义。您可以尝试使用专门的天气应用或网站来获取最新天气情况。看到没当问题匹配我们定义的函数时模型会调用函数当问题超出函数范围时模型会诚实地告诉你它做不到什么。5. 多语言对话体验Granite-4.0-H-350M支持12种语言我们来测试一下它的多语言能力。5.1 基础多语言测试创建一个简单的多语言测试脚本# multilingual_test.py import requests def test_multilingual(): 测试模型的多语言能力 test_cases [ (英语, Explain the concept of machine learning in simple terms.), (中文, 用简单的语言解释机器学习的概念。), (日语, 機械学習の概念を簡単な言葉で説明してください。), (德语, Erklären Sie das Konzept des maschinellen Lernens in einfachen Worten.), (法语, Expliquez le concept dapprentissage automatique en termes simples.), (西班牙语, Explica el concepto de aprendizaje automático en términos simples.), ] for language, question in test_cases: print(f\n语言{language}) print(f问题{question}) response requests.post( http://localhost:11434/api/generate, json{ model: granite4:350m-h, prompt: question, stream: False } ) if response.status_code 200: answer response.json()[response] print(f回答{answer[:200]}...) # 只显示前200字符 else: print(f请求失败{response.status_code}) print(- * 80) if __name__ __main__: test_multilingual()5.2 跨语言对话更酷的是你可以在同一次对话中混合使用多种语言# cross_language_chat.py import requests def cross_language_conversation(): 跨语言对话测试 conversation [ Hello! How are you today?, 我很好谢谢你会说中文吗, 是的我会说中文。我还能说很多其他语言。, 那太棒了¿Puedes también hablar español?, Sí, puedo hablar español. ¿En qué puedo ayudarte hoy?, 今天天气不错我们聊点什么呢, 我们可以聊聊科技、文化或者你感兴趣的任何话题。 ] print(开始跨语言对话测试\n) for i, message in enumerate(conversation): speaker 用户 if i % 2 0 else 助手 print(f{speaker}: {message}) if speaker 用户: # 用户发言后模型回复 response requests.post( http://localhost:11434/api/generate, json{ model: granite4:350m-h, prompt: f继续对话{message}, stream: False, context: conversation[:i] if i 0 else [] } ) if response.status_code 200: reply response.json()[response] # 把模型的回复加入对话历史 conversation.append(reply) print(\n对话结束。模型成功处理了英语、中文和西班牙语的混合对话。) if __name__ __main__: cross_language_conversation()运行这些测试你会看到模型能够流畅地在不同语言间切换理解上下文并给出合理的回复。6. 实用技巧与常见问题在实际使用中你可能会遇到一些问题。这里我总结了一些实用技巧和常见问题的解决方法。6.1 性能优化技巧虽然Granite-4.0-H-350M已经很轻量了但通过一些调整可以让它运行得更快更好调整生成参数# 在API调用时设置这些参数 payload { model: granite4:350m-h, prompt: 你的问题, stream: False, options: { temperature: 0.7, # 控制随机性0-1越高越有创意 top_p: 0.9, # 核采样0-1越高输出越多样 top_k: 40, # 限制候选词数量 num_predict: 512, # 最大生成长度 repeat_penalty: 1.1, # 重复惩罚避免重复内容 num_ctx: 2048 # 上下文长度 } }批处理请求 如果你需要处理大量相似的问题可以一次性发送多个请求questions [问题1, 问题2, 问题3] results [] for q in questions: response ask_granite(q) results.append(response)6.2 常见问题解决问题1模型响应慢可能原因电脑性能不足或同时运行了太多程序解决方案关闭不必要的应用程序减少num_predict参数值使用更简单的提示词问题2模型输出无关内容可能原因temperature设置过高或提示词不够明确解决方案降低temperature到0.3以下在提示词中明确要求请直接回答问题不要添加额外解释问题3函数调用不准确可能原因函数描述不够清晰或参数解析有问题解决方案在system prompt中提供更详细的函数说明和调用示例改进参数解析逻辑问题4多语言支持不佳可能原因某些语言训练数据较少解决方案尽量使用英语或中文提问对于小语种可以先用英语提问再翻译6.3 进阶应用场景掌握了基础用法后你可以尝试更高级的应用场景1个人知识库助手把Granite模型和你本地的文档结合起来创建一个个人知识管理系统。模型可以帮你快速查找信息、总结文档内容。场景2代码助手虽然它不是专门的代码模型但对于简单的代码解释、生成基础函数还是很有帮助的。特别是它的函数调用能力可以集成到你的开发环境中。场景3多语言客服原型利用它的多语言能力快速搭建一个支持多种语言的客服系统原型。虽然功能简单但对于验证想法足够了。场景4教育工具可以用来创建多语言的学习助手帮助学生练习外语对话或者解释复杂概念。7. 总结通过这篇实操手册你应该已经掌握了如何在本地部署和使用Granite-4.0-H-350M模型。我们来回顾一下关键点部署简单使用Ollama一行命令就能安装模型不需要复杂的配置。功能实用虽然只有3.5亿参数但支持12种语言对话和函数调用对于很多日常任务已经足够用了。资源友好在普通笔记本电脑上就能流畅运行不需要高端显卡让更多人能体验本地AI的能力。扩展性强通过函数调用你可以把模型的能力扩展到几乎任何领域——只要你能用代码实现的功能都能通过自然语言来调用。我特别喜欢这个模型的务实设计。它不追求参数规模的最大化而是在有限的资源下提供最实用的功能。对于想要入门AI应用开发或者需要一个本地智能助手的朋友来说这是个很好的起点。当然它也有局限性。比如上下文长度有限2048 tokens复杂推理能力不如更大的模型。但对于大多数日常对话、简单任务处理来说它完全够用。最重要的是你完全拥有控制权。所有的对话都在本地进行数据不会上传到任何服务器。对于注重隐私的用户来说这是最大的优势。现在你已经有了一个运行在本地的小助手接下来就是发挥创意的时候了。你可以定义更多有用的函数扩展它的能力把它集成到你的日常工具中用它来处理多语言内容基于它开发更复杂的应用AI的世界很大但有时候小而美的工具反而最实用。Granite-4.0-H-350M就是这样一个小而美的选择希望它能成为你探索AI世界的好帮手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。