一、Ollama的安装和使用
Ollama是开源跨平台大模型工具,利用这个工具可以非常方便地在电脑上进行语言的大模型的本地化部署。
1.安装Ollama
在终端上输入以下指令:
curl -fsSL https://ollama.com/install.sh | sh
即可进入安装过程,由于中国大陆的网络问题可能比较缓慢
2.使用Ollama下载本地化模型
Ollama官网上为我们提供了很多本地化模型的选择:Ollama Search
这里4GB内存的树莓派推荐下载不超过2b量级的大模型,如果是8GB内存的树莓派可以尝试下载不超过7b的大模型。
使用以下命令安装本地化模型:
ollama pull 模型名称:量级
以gemma3的1b模型为例,应该使用以下指令进行下载:
ollama pull gemma3:1b
3.使用Ollama运行本地化模型
使用以下命令
ollama run 模型名称:量级
可以在终端上运行大模型,如果这个模型成功运行并且可以成功回答问题,那么说明这个离线大模型已经成功安装到电脑上了。
二、使用Ollama的pythonAPI将大模型写入python代码
1.创建虚拟环境
这里有两种方法,个人更推荐第二种。
1.使用指令创建一个新的虚拟环境
在需要创建虚拟环境的目录下输入以下指令:
python3 -m venv myvenv
即可创建一个myvenv的文件夹,这个文件夹就是所谓的虚拟环境,这个文件夹的lib目录下是虚拟环境中安装的所有包,bin目录下包括了pip程序,python解释器还有用于激活虚拟环境的active。但是经过我个人的尝试,直接使用这个代码创建的虚拟环境可能面临pip install失败,python解释器定位错误等一系列奇怪问题,所以并不是非常推荐。
2.复制一个已有的虚拟环境文件夹
如上文所说,所谓的虚拟环境就是一个文件夹,那么可以找到一个已经创建好并且没有出现问题的myenv文件夹,将这个文件夹复制到相应的目录下就变成了我们自己的虚拟环境,激活这个虚拟环境之后使用以下命令清空这个虚拟环境中多余的包:
pip list --format=freeze | grep -vE 'pip|setuptools|wheel' | cut -d= -f1 | xargs pip uninstall -y
这样我们就得到了一个健康并且干净的虚拟环境了。
2.安装必备的包
首先激活虚拟环境,尝试使用`pip install`进行包的安装,如果一直显示SSL并且没有进行安装的话(注意:有的时候尽管终端上一直刷新SSL的报错信息,但是实际上是进行了安装的,可以看到在终端上时不时会跳出一个安装进度条,最后也有一个安装成功的提示),那么再尝试以下这个代码:
pip install package --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple
把代码里面的package改成需要安装的包的名称就可以了,我几次试下来这个代码是没有问题的。
在这里,我们需要安装的包的名称是ollama
3.代码示例
安装好包之后,就可以直接写程序了,示例代码如下:
import ollama
import time
import signal
import resource
import sys
def init_environment():
"""初始化环境"""
# 设置内存限制(6GB)
resource.setrlimit(
resource.RLIMIT_AS,
(6 * 1024**3, resource.RLIM_INFINITY)
)
# 注册信号处理
signal.signal(signal.SIGTERM, lambda s,f: sys.exit(0))
signal.signal(signal.SIGINT, lambda s,f: sys.exit(0))
def robust_offline_query(prompt, max_tokens=1024):
"""鲁棒的离线查询 - 增强流式响应处理"""
init_environment()
try:
client = ollama.Client(
host='http://127.0.0.1:11434',
timeout=3000 # time limits
)
full_response = ""
print("生成中: ", end="", flush=True)
# 使用chat接口并设置流式响应
stream = client.chat(
model='gemma3:1b',
messages=[{'role': 'user', 'content': prompt}],
stream=True,
options={
'num_predict': max_tokens,
'temperature': 0.2,
'num_ctx': 2048,
'num_thread': 4
}
)
# 增强的流式响应处理
response_chunks = []
start_time = time.time()
last_chunk_time = time.time()
try:
for chunk in stream:
# 检查是否超时
if time.time() - last_chunk_time > 60:
print("\n警告: 响应超时,可能已结束", flush=True)
break
# 获取内容
content = chunk.get('message', {}).get('content', '')
if content:
print(content, end='', flush=True)
response_chunks.append(content)
full_response += content
last_chunk_time = time.time()
# 检查是否达到最大token数
if len(full_response.split()) >= max_tokens * 0.9:
print("\n警告: 接近最大token限制", flush=True)
break
except Exception as inner_e:
print(f"\n流式处理错误: {str(inner_e)}", flush=True)
# 确保所有内容都已收集
return ''.join(response_chunks)
except Exception as e:
error_msg = f"错误: {str(e)}"
print(error_msg, flush=True)
return error_msg
if __name__ == "__main__":
print("=== 离线测试 ===")
prompt = input('请输入指令(输入q退出): ')
while prompt!='q':
start_time = time.time()
response = robust_offline_query(prompt, max_tokens=1024)
elapsed = time.time() - start_time
# 准确统计token数(近似值)
token_count = len(response)
print(f"\n耗时: {elapsed:.1f}秒")
print(f"字符数: {token_count}")
prompt = input('请输入指令(输入q退出): ')
三、增加语音播报功能
1.安装必需的组件
在终端中输入:
sudo apt-get update
sudo apt-get install espeak
下载espeak进行播报
激活安装了ollama的虚拟环境之后输入:
pip install pyttsx3
如果pip install报错SSL并且安装失败,使用上面的方法进行安装
下载中文语音包
espeak的原生版本默认不含中文语音包,所以我们需要额外找到一个语音包代替原有的语音包
有一篇文章写的挺好的,可以直接按照上面的方法解决:linux espeak语音tts;pyttsx3 ubuntu使用_espeak 中文语音包-优快云博客
到此为止,所有的组件就已经准备完成了,我们只需要在原来代码的基础上稍作修改即可实现语音播报功能。
2.代码示例
import ollama
import time
import signal
import resource
import sys
import pyttsx3
import subprocess
from threading import Lock
tts_lock = Lock()
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 调慢语速(默认200)
#engine.setProperty('volume', 1.0) # 最大音量
def init_environment():
"""初始化环境"""
# 设置内存限制(6GB)
resource.setrlimit(
resource.RLIMIT_AS,
(6 * 1024**3, resource.RLIM_INFINITY)
)
# 注册信号处理
signal.signal(signal.SIGTERM, lambda s,f: sys.exit(0))
signal.signal(signal.SIGINT, lambda s,f: sys.exit(0))
def speak(text):
"""文本转语音"""
with tts_lock:
try:
subprocess.run(
['espeak', '-v', 'zh', '-s', '120', text],
stderr=sys.stderr,
check=True
)
except Exception as e:
print(f"语音播报错误: {e}", flush=True)
def robust_offline_query(prompt, max_tokens=1024):
"""鲁棒的离线查询 - 增强流式响应处理"""
init_environment()
sentence_buffer=""
try:
client = ollama.Client(
host='http://127.0.0.1:11434',
timeout=3000 # time limits
)
full_response = ""
print("生成中: ", end="", flush=True)
# 使用chat接口并设置流式响应
stream = client.chat(
model='gemma3:1b',
messages=[{'role': 'user', 'content': prompt}],
stream=True,
options={
'num_predict': max_tokens,
'temperature': 0.7,
'num_ctx': 2048,
'num_thread': 4
}
)
# 增强的流式响应处理
response_chunks = []
start_time = time.time()
last_chunk_time = time.time()
try:
for chunk in stream:
content = chunk.get('message', {}).get('content', '')
if content:
print(content, end='', flush=True)
full_response += content
# 中文句子检测
sentence_buffer += content.replace('*','')
if (any(punc in content for punc in ["。", "!", "?",";", "..."]) or len(sentence_buffer) > 30):
if len(sentence_buffer.strip()) > 1: # 忽略单个标点
speak(sentence_buffer.strip())
sentence_buffer = ""
elif len(sentence_buffer) > 50:
speak(sentence_buffer.strip())
sentence_buffer = ""
# 播报剩余内容
if sentence_buffer:
speak(sentence_buffer.strip())
except Exception as inner_e:
print(f"\n流式处理错误: {str(inner_e)}", flush=True)
# 确保所有内容都已收集
return ''.join(response_chunks)
except Exception as e:
error_msg = f"错误: {str(e)}"
print(error_msg, flush=True)
return error_msg
if __name__ == "__main__":
print("=== 离线测试 ===")
prompt = input('请输入指令(输入q退出): ')
while prompt!='q':
start_time = time.time()
response = robust_offline_query(prompt, max_tokens=1024)
elapsed = time.time() - start_time
# 准确统计token数(近似值)
token_count = len(response)
print(f"\n耗时: {elapsed:.1f}秒")
print(f"字符数: {token_count}")
prompt = input('请输入指令(输入q退出): ')