跳到主要内容
Llama.cpp Python 绑定与 API 使用详解 | 极客日志
Python AI 算法
Llama.cpp Python 绑定与 API 使用详解 Llama.cpp 是一个高效的 C++ 实现,用于在 CPU 上运行 Meta 的 LLaMA 模型,支持多种架构和量化格式。其 Python 绑定 API,涵盖模型加载、文本生成、聊天对话、嵌入生成及服务器模式等核心功能。内容包含初始化参数配置、采样策略、性能优化及与 LangChain、Gradio 等库的集成示例,旨在帮助开发者快速上手本地大模型部署与应用开发。
草莓泡芙 发布于 2026/4/6 更新于 2026/5/24 37 浏览1. Llama.cpp 概述
Llama.cpp 是一个高效的 C++ 实现,用于在 CPU 上运行 Meta 的 LLaMA 模型,支持多种架构和量化格式。
主要特性
特性 说明 纯 CPU 推理 无需 GPU,在 CPU 上高效运行 多种量化 支持 4bit、5bit、8bit 量化 多平台 Windows/Linux/macOS/iOS/Android 多架构 ARM NEON, AVX2, AVX512 支持 多种模型 LLaMA, Alpaca, Vicuna, CodeLLaMA 等 绑定支持 Python, Go, Rust, Node.js 等
2. Python 绑定 API
2.1 安装和导入
pip install llama-cpp-python
pip install llama-cpp-python[server]
2.2 核心类和方法
类/方法 功能 参数说明 示例 Llama主模型类 加载和运行模型 llm = Llama(model_path="./models/7B/ggml-model-q4_0.bin").create_completion()生成文本 多种生成参数 llm.create_completion(prompt="Hello").create_chat_completion()聊天生成 支持对话格式 llm.create_chat_completion(messages=messages).embed()生成嵌入 文本向量化 embeddings = llm.embed("text")
3. 模型加载和初始化
3.1 基础初始化
from llama_cpp import Llama
llm = Llama(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_ctx= ,
n_threads= ,
n_gpu_layers= ,
verbose=
)
2048
8
0
True
3.2 完整初始化参数 参数 类型 默认值 说明 model_pathstr 必填 模型文件路径 n_ctxint 512 上下文窗口大小 n_partsint -1 模型分片数 n_gpu_layersint 0 使用 GPU 的层数 seedint -1 随机种子 f16_kvbool True 使用半精度键值缓存 logits_allbool False 返回所有 logits vocab_onlybool False 仅加载词汇表 use_mlockbool False 锁定内存防止交换 use_mmapbool True 使用内存映射 n_threadsint None CPU 线程数 n_batchint 512 批处理大小 last_n_tokens_sizeint 64 重复惩罚窗口 verbosebool True 显示加载信息
3.3 GPU 支持配置
llm = Llama(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_gpu_layers=35 ,
n_threads=4 ,
n_ctx=2048 ,
verbose=True
)
llm = Llama(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_gpu_layers=1 ,
n_threads=8 ,
n_ctx=2048 ,
verbose=True
)
4. 文本生成 API
4.1 基础文本生成
output = llm("Once upon a time" )
print (output["choices" ][0 ]["text" ])
output = llm.create_completion(
prompt="What is AI?" ,
max_tokens=100 ,
temperature=0.7 ,
top_p=0.9 ,
stop=["\n" ,"Human:" ,"AI:" ]
)
4.2 生成参数详解 参数 类型 默认值 说明 promptstr 必填 输入提示 suffixstr None 生成文本后的后缀 max_tokensint 16 最大生成 token 数 temperaturefloat 0.8 温度(随机性) top_pfloat 0.95 核采样概率 top_kint 40 仅考虑 top-k 个 token frequency_penaltyfloat 0.0 频率惩罚 presence_penaltyfloat 0.0 存在惩罚 repeat_penaltyfloat 1.1 重复惩罚 stopList[str] [] 停止序列 streambool False 流式输出 echobool False 是否回显输入
4.3 流式生成
stream = llm.create_completion(
prompt="Write a story about" ,
max_tokens=200 ,
temperature=0.8 ,
stream=True
)
for output in stream:
chunk = output["choices" ][0 ]["text" ]
print (chunk, end="" , flush=True )
4.4 带参数的生成示例 response = llm.create_completion(
prompt="解释量子计算的基本原理:" ,
max_tokens=300 ,
temperature=0.7 ,
top_p=0.9 ,
top_k=40 ,
frequency_penalty=0.5 ,
presence_penalty=0.3 ,
repeat_penalty=1.1 ,
stop=["\n\n" ,"###" ],
echo=False
)
print (response["choices" ][0 ]["text" ])
5. 聊天对话 API
5.1 基础聊天 messages = [
{"role" :"system" ,"content" :"你是一个有用的助手。" },
{"role" :"user" ,"content" :"你好,请介绍一下你自己。" }
]
response = llm.create_chat_completion(
messages=messages,
temperature=0.7 ,
max_tokens=200
)
print (response["choices" ][0 ]["message" ]["content" ])
5.2 多轮对话 def chat_with_llama (llm, messages ):
"""多轮对话函数"""
while True :
user_input = input ("\n用户:" )
if user_input.lower() == 'quit' :
break
messages.append({"role" :"user" ,"content" : user_input})
response = llm.create_chat_completion(
messages=messages,
max_tokens=150 ,
temperature=0.7
)
assistant_reply = response["choices" ][0 ]["message" ]["content" ]
print (f"助手:{assistant_reply} " )
messages.append({"role" :"assistant" ,"content" : assistant_reply})
return messages
messages = [{"role" :"system" ,"content" :"你是一个友好的 AI 助手,用中文回答。" }]
chat_with_llama(llm, messages)
5.3 不同聊天格式
alpaca_prompt = """Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction: {instruction}
### Response:"""
vicuna_prompt = """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.
USER: {prompt}
ASSISTANT:"""
chatml_prompt = """<|im_start|>system {system_message}<|im_end|>
<|im_start|>user {user_message}<|im_end|>
<|im_start|>assistant """
6. 嵌入生成 API
6.1 生成文本嵌入
embedding = llm.embed("This is a sample text." )
print (f"嵌入维度:{len (embedding)} " )
print (f"嵌入向量:{embedding[:5 ]} ..." )
texts = ["人工智能是计算机科学的一个分支" ,"机器学习是 AI 的子领域" ,"深度学习使用神经网络" ]
embeddings = []
for text in texts:
emb = llm.embed(text)
embeddings.append(emb)
print (f"生成了 {len (embeddings)} 个嵌入向量" )
6.2 计算相似度 import numpy as np
from numpy.linalg import norm
def cosine_similarity (vec1, vec2 ):
"""计算余弦相似度"""
return np.dot(vec1, vec2) / (norm(vec1) * norm(vec2))
emb1 = llm.embed("猫是一种动物" )
emb2 = llm.embed("狗是一种宠物" )
emb3 = llm.embed("Python 是一种编程语言" )
sim_cat_dog = cosine_similarity(emb1, emb2)
sim_cat_python = cosine_similarity(emb1, emb3)
print (f"猫 - 狗相似度:{sim_cat_dog:.4 f} " )
print (f"猫-Python 相似度:{sim_cat_python:.4 f} " )
7. 高级生成控制
7.1 采样策略
response = llm.create_completion(
prompt="写一首关于春天的诗:" ,
max_tokens=100 ,
temperature=0.8 ,
top_p=0.9 ,
top_k=50 ,
repeat_penalty=1.2 ,
frequency_penalty=0.5 ,
presence_penalty=0.5 ,
mirostat_mode=2 ,
mirostat_tau=5.0 ,
mirostat_eta=0.1
)
7.2 语法约束生成
grammar = """ root ::= (statement ". ")*
statement ::= "I" verb object
verb ::= " love" | " hate"
object ::= " cats" | " dogs"
"""
7.3 对数概率获取
response = llm.create_completion(
prompt="The weather is" ,
max_tokens=10 ,
logprobs=10 ,
echo=True
)
if "logprobs" in response["choices" ][0 ]:
logprobs = response["choices" ][0 ]["logprobs" ]
print ("Top token probabilities:" )
for token, logprob in zip (logprobs["tokens" ], logprobs["token_logprobs" ]):
prob = np.exp(logprob)
print (f" {token} : {prob:.4 f} " )
8. 模型信息和管理
8.1 获取模型信息
print (f"模型上下文大小:{llm.n_ctx()} " )
print (f"词表大小:{llm.n_vocab()} " )
print (f"模型参数:{llm.model.params} " )
vocab = llm.tokenize(b"test" )
print (f"Token IDs: {vocab} " )
token_id = 1234
token_text = llm.detokenize([token_id])
print (f"Token {token_id} 对应文本:{token_text} " )
8.2 Token 处理
text = "Hello, world!"
tokens = llm.tokenize(text.encode())
print (f"文本 '{text} ' 的 tokens: {tokens} " )
decoded_text = llm.detokenize(tokens)
print (f"解码后的文本:{decoded_text} " )
def count_tokens (text ):
tokens = llm.tokenize(text.encode())
return len (tokens)
text = "这是一个测试句子。"
token_count = count_tokens(text)
print (f"文本 token 数:{token_count} " )
9. 服务器模式 API
9.1 启动服务器
from llama_cpp.server.app import create_app
import uvicorn
app = create_app(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_ctx=2048 ,
n_threads=8
)
uvicorn.run(app, host="0.0.0.0" , port=8000 )
9.2 API 端点 端点 方法 功能 请求示例 /v1/completionsPOST 文本补全 {"prompt": "Hello", "max_tokens": 50}/v1/chat/completionsPOST 聊天补全 {"messages": [{"role": "user", "content": "Hi"}]}/v1/embeddingsPOST 嵌入生成 {"input": "text to embed"}/v1/modelsGET 模型信息 无参数
9.3 客户端调用 import requests
response = requests.post(
"http://localhost:8000/v1/chat/completions" ,
json={"messages" :[{"role" :"user" ,"content" :"你好" }],"temperature" :0.7 ,"max_tokens" :100 }
)
result = response.json()
print (result["choices" ][0 ]["message" ]["content" ])
10. 性能优化 API
10.1 批处理优化
prompts = ["解释 AI 的含义:" ,"什么是机器学习?" ,"深度学习有哪些应用?" ]
for prompt in prompts:
response = llm.create_completion(
prompt=prompt,
max_tokens=100 ,
temperature=0.7 ,
n_batch=512
)
print (f"Q: {prompt} " )
print (f"A: {response['choices' ][0 ]['text' ]} \n" )
10.2 内存优化
llm = Llama(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_ctx=2048 ,
n_threads=8 ,
n_batch=512 ,
use_mlock=True ,
use_mmap=True ,
verbose=True
)
del llm
import gc
gc.collect()
10.3 量化模型使用
quantizations = {
"q4_0" : "4-bit 整数量化(最快)" ,
"q4_1" : "4-bit 带尺度量化" ,
"q5_0" : "5-bit 整数量化" ,
"q5_1" : "5-bit 带尺度量化" ,
"q8_0" : "8-bit 整数量化" ,
"f16" : "半精度浮点数" ,
"f32" : "全精度浮点数"
}
model_path = "./models/llama-2-7b-chat.ggmlv3.q4_0.bin"
llm = Llama(model_path=model_path, n_ctx=2048 )
print (f"加载模型:{model_path} " )
print (f"量化类型:{model_path.split('.' )[-2 ]} " )
11. 实际应用示例
11.1 文档问答系统 class DocumentQA :
def __init__ (self, model_path ):
self .llm = Llama(
model_path=model_path,
n_ctx=4096 ,
n_threads=8 ,
verbose=False
)
def answer_question (self, context, question ):
prompt = f"""基于以下文本回答问题。
文本内容:{context}
问题:{question}
答案:"""
response = self .llm.create_completion(
prompt=prompt,
max_tokens=200 ,
temperature=0.3 ,
stop=["\n\n" ]
)
return response["choices" ][0 ]["text" ].strip()
qa_system = DocumentQA("./models/llama-2-7b-chat.ggmlv3.q4_0.bin" )
context = "Llama.cpp 是一个用 C++ 编写的 LLaMA 模型推理实现,支持 CPU 上的高效推理..."
question = "Llama.cpp 是什么?"
answer = qa_system.answer_question(context, question)
print (f"问题:{question} " )
print (f"答案:{answer} " )
11.2 代码生成助手 class CodeGenerator :
def __init__ (self, model_path ):
self .llm = Llama(
model_path=model_path,
n_ctx=2048 ,
n_threads=8 ,
verbose=False
)
def generate_code (self, description, language="python" ):
prompt = f"""# {language.capitalize()} 代码生成
# 要求:{description}
# 代码:"""
response = self .llm.create_completion(
prompt=prompt,
max_tokens=300 ,
temperature=0.5 ,
stop=["# " ,"\n\n" ]
)
return response["choices" ][0 ]["text" ]
coder = CodeGenerator("./models/codellama-7b.ggmlv3.q4_0.bin" )
description = "写一个函数计算斐波那契数列"
code = coder.generate_code(description,"python" )
print (code)
12. 错误处理和调试
12.1 常见错误处理 import traceback
try :
llm = Llama(
model_path="./models/nonexistent.bin" ,
n_ctx=2048
)
except FileNotFoundError as e:
print (f"模型文件不存在:{e} " )
llm = Llama(
model_path="./models/backup.bin" ,
n_ctx=2048
)
except Exception as e:
print (f"加载模型时出错:{e} " )
traceback.print_exc()
try :
response = llm.create_completion(
prompt="test" ,
max_tokens=100
)
except RuntimeError as e:
if "out of memory" in str (e).lower():
print ("内存不足,尝试减小上下文大小" )
llm = Llama(
model_path="./models/model.bin" ,
n_ctx=1024
)
12.2 性能监控 import time
def benchmark_generation (llm, prompt, iterations=5 ):
"""性能基准测试"""
times = []
for i in range (iterations):
start_time = time.time()
response = llm.create_completion(
prompt=prompt,
max_tokens=100 ,
temperature=0.7
)
end_time = time.time()
generation_time = end_time - start_time
times.append(generation_time)
tokens_per_second = 100 / generation_time
print (f"迭代 {i+1 } : {generation_time:.2 f} 秒,{tokens_per_second:.2 f} tokens/秒" )
avg_time = sum (times) / len (times)
print (f"\n平均生成时间:{avg_time:.2 f} 秒" )
print (f"平均速度:{100 /avg_time:.2 f} tokens/秒" )
benchmark_generation(llm, "Once upon a time" )
13. 与其他库集成
13.1 与 LangChain 集成 from langchain.llms import LlamaCpp
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = LlamaCpp(
model_path="./models/llama-2-7b-chat.ggmlv3.q4_0.bin" ,
n_ctx=2048 ,
n_threads=8 ,
temperature=0.7 ,
max_tokens=200 ,
verbose=True
)
template = """问题:{question}
回答:"""
prompt = PromptTemplate(template=template, input_variables=["question" ])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "什么是人工智能?"
response = llm_chain.run(question)
print (response)
13.2 与 Gradio 集成创建 Web 界面 import gradio as gr
def generate_text (prompt, temperature, max_tokens ):
response = llm.create_completion(
prompt=prompt,
temperature=temperature,
max_tokens=max_tokens
)
return response["choices" ][0 ]["text" ]
iface = gr.Interface(
fn=generate_text,
inputs=[
gr.Textbox(label="输入提示" , lines=3 ),
gr.Slider(0 , 1 , value=0.7 , label="温度" ),
gr.Slider(1 , 500 , value=100 , label="最大 Token 数" )
],
outputs=gr.Textbox(label="生成结果" , lines=10 ),
title="Llama.cpp 文本生成器" ,
description="使用 Llama.cpp 模型生成文本"
)
iface.launch(share=True )
14. 最佳实践总结 实践类别 建议 理由 模型选择 使用 4-bit 量化模型 平衡速度和精度 上下文大小 根据需求设置,不要过大 减少内存使用 批处理 设置合适的 n_batch 值 提高 CPU 利用率 温度设置 根据任务调整温度 创造性任务用高温,精确任务用低温 线程数 设置为物理核心数 充分利用 CPU 内存管理 使用 use_mmap=True 减少内存占用 错误处理 总是包含异常处理 提高稳定性 性能监控 定期基准测试 优化参数设置
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online