langchain_community.llms.LlamaCpp
是 LangChain 提供的本地 LLM(大型语言模型)包装器,基于 LLaMA.cpp 库,支持运行本地量化的 LLaMA 模型(GGUF 格式)。
本文基于 LangChain 0.3.x,详细介绍 langchain_community.llms.LlamaCpp
的初始化、配置和使用方式,包括核心功能、参数、方法和典型场景,并提供一个独立示例,展示如何使用 LlamaCpp
结合 langchain_core.prompts.PromptTemplate
构建一个简单的问答应用,示例使用本地 GGUF 模型,回答关于加密货币的问题。
LlamaCpp
简介langchain_community.llms.LlamaCpp
是 LangChain 的 LLM 类,继承自 langchain_core.language_models.llms.BaseLLM
,通过 LLaMA.cpp 库加载和运行本地 GGUF 格式的 LLaMA 模型。它适合隐私敏感场景或无需云服务的应用,常用于对话、问答、RAG 系统等。
核心功能:
适用场景:
与云 LLM(如 OpenAI)对比:
以下是 langchain_community.llms.LlamaCpp
的使用方式,涵盖初始化、配置、调用方法和典型应用场景,基于源码(langchain_community/llms/llamacpp.py
)和官方文档(LlamaCpp)。
要使用 LlamaCpp
,需安装 LangChain 和 LLaMA.cpp 的 Python 绑定:
pip install --upgrade langchain langchain-community llama-cpp-python
llama-cpp-python
:pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
pip install langchain-core
llama-2-7b-chat.Q4_0.gguf
。
TheBloke/Llama-2-7B-Chat-GGUF
(约 4GB)。/models/llama-2-7b-chat.Q4_0.gguf
。import os
assert os.path.exists("/models/llama-2-7b-chat.Q4_0.gguf")
LlamaCpp
创建 LlamaCpp
实例,指定模型路径和其他配置参数。
常用初始化参数:
model_path
(str,必填):GGUF 模型文件路径。n_gpu_layers
(int,默认 0):分配到 GPU 的层数,0 表示仅 CPU。-1表示所有GPU层数。n_batch
(int,默认 512):批处理大小,影响推理速度。temperature
(float,默认 0.8):控制生成随机性,0~1。max_tokens
(int,默认 512):最大输出 token 数。n_ctx
(int,默认 512):上下文窗口大小。top_p
(float,默认 0.95):Top-p 采样参数。top_k
(int,默认 40):Top-k 采样参数。stop
(List[str],默认 None):停止词列表。verbose
(bool,默认 False):是否打印详细日志。示例初始化:
from langchain_community.llms import LlamaCpp
llm = LlamaCpp(
model_path="/models/llama-2-7b-chat.Q4_0.gguf",
n_gpu_layers=0, # 仅 CPU
n_batch=512,
temperature=0.7,
max_tokens=512,
n_ctx=2048,
verbose=False
)
GPU 配置(若有 GPU):
llm = LlamaCpp(
model_path="/models/llama-2-7b-chat.Q4_0.gguf",
n_gpu_layers=40, # 分配 40 层到 GPU
n_batch=1024,
temperature=0.7,
max_tokens=512,
n_ctx=2048
)
LlamaCpp
LlamaCpp
提供多种调用方式,支持同步、异步和流式生成。
invoke
或 __call__
)invoke(input: str, stop: Optional[List[str]] = None, **kwargs) -> str
response = llm.invoke("什么是加密货币?")
print(response) # 输出: 加密货币是...
stream
)stream(input: str, stop: Optional[List[str]] = None, **kwargs) -> Iterator[str]
for chunk in llm.stream("加密货币有哪些类型?"):
print(chunk, end="", flush=True)
ainvoke
)ainvoke(input: str, stop: Optional[List[str]] = None, **kwargs) -> Awaitable[str]
import asyncio
async def run():
response = await llm.ainvoke("什么是区块链?")
print(response)
asyncio.run(run())
astream
)astream(input: str, stop: Optional[List[str]] = None, **kwargs) -> AsyncIterator[str]
async def run_stream():
async for chunk in llm.astream("加密货币的优点是什么?"):
print(chunk, end="", flush=True)
asyncio.run(run_stream())
generate
)generate(prompts: List[str], **kwargs) -> LLMResult
results = llm.generate(["什么是加密货币?", "它有哪些应用?"])
for generation in results.generations:
print(generation[0].text)
LlamaCpp
常与 LCEL(LangChain Expression Language)结合,使用提示模板和输出解析器构建链。
常用组件:
langchain_core.prompts.PromptTemplate
:格式化提示。langchain_core.output_parsers.StrOutputParser
:解析输出为字符串。langchain_core.runnables.RunnablePassthrough
:传递输入。示例链:
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
prompt = PromptTemplate(
template="问题:{question}\n回答:",
input_variables=["question"]
)
chain = prompt | llm | StrOutputParser()
response = chain.invoke({"question": "什么是加密货币?"})
invoke
或 __call__
。stream
或 astream
。RunnableWithMessageHistory
。generate
处理多提示。LlamaCpp
的问答示例以下是一个独立示例,展示 LlamaCpp
的使用方式,结合 langchain_core.prompts.PromptTemplate
构建一个简单问答应用,回答关于加密货币的问题。示例使用 invoke
和 stream
方法,动态调整 temperature
。
准备文件:
llama-2-7b-chat.Q4_0.gguf
),放置在本地路径(如 /models/llama-2-7b-chat.Q4_0.gguf
)。
TheBloke/Llama-2-7B-Chat-GGUF
(约 4GB)。代码:
import os
from langchain_community.llms import LlamaCpp
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 初始化 LlamaCpp LLM
llm = LlamaCpp(
model_path="/models/llama-2-7b-chat.Q4_0.gguf",
n_gpu_layers=0, # 仅 CPU
n_batch=512,
temperature=0.7,
max_tokens=512,
n_ctx=2048,
stop=["\n"],
verbose=False
)
# 检查配置
print("LlamaCpp 配置:")
print(f"Model Path: {llm.model_path}")
print(f"Temperature: {llm.temperature}")
print(f"Max Tokens: {llm.max_tokens}")
# 定义 PromptTemplate
prompt = PromptTemplate(
template="""你是一个加密货币专家,回答以下问题:
问题:{question}
回答:""",
input_variables=["question"]
)
# 创建问答链
qa_chain = (
{"question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 使用 invoke 方法(同步)
print("\n使用 invoke 方法:")
response = qa_chain.invoke("什么是加密货币?")
print(response)
# 调整 temperature,测试不同风格
llm.temperature = 0.3 # 更确定性
print("\n使用 invoke 方法(低 temperature):")
response = qa_chain.invoke("加密货币有哪些类型?")
print(response)
# 使用 stream 方法(流式)
print("\n使用 stream 方法:")
for chunk in qa_chain.stream("加密货币的优点是什么?"):
print(chunk, end="", flush=True)
print()
输出示例(取决于模型和硬件,实际输出可能略有不同):
LlamaCpp 配置:
Model Path: /models/llama-2-7b-chat.Q4_0.gguf
Temperature: 0.7
Max Tokens: 512
使用 invoke 方法:
加密货币是基于区块链的数字货币,使用加密技术确保安全。
使用 invoke 方法(低 temperature):
加密货币的类型包括比特币、以太坊和稳定币。
使用 stream 方法:
加密货币的优点包括去中心化、透明性和低交易成本。
n_gpu_layers=0
)。temperature=0.7
、max_tokens=512
、n_ctx=2048
、stop=["\n"]
。model_path
、temperature
、max_tokens
,验证设置。langchain_core.prompts.PromptTemplate
,格式化加密货币问题。prompt
、llm
和 StrOutputParser
。invoke
(同步)和 stream
(流式)生成答案。temperature
到 0.3,展示更确定性的输出。运行要求:
llama-2-7b-chat.Q4_0.gguf
)存在且路径正确。pip install --upgrade langchain langchain-core langchain-community llama-cpp-python
n_gpu_layers=40
)。import os
assert os.path.exists("/models/llama-2-7b-chat.Q4_0.gguf")
pip install --upgrade langchain langchain-core langchain-community llama-cpp-python
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
n_gpu_layers=40
。n_batch
(如 1024)。n_ctx
(如 4096)支持长对话。temperature
(如 0.3)提高确定性。stop=["\n", "###"]
控制终止。model_path
和文件完整性。max_tokens
(如 1024)。n_ctx
是否足够。n_batch
。temperature
和 top_p
值。Q1:如何选择合适的 n_ctx
和 max_tokens
?
A:
n_ctx
:根据输入提示和预期输出长度设置(如 2048 或 4096),需更多内存。max_tokens
:控制输出长度(如 512),避免过长生成。Q2:如何支持对话历史?
A:结合 RunnableWithMessageHistory
:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history"),
("human", "{question}")
])
chain = prompt | llm | StrOutputParser()
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: ChatMessageHistory(),
input_messages_key="question",
history_messages_key="chat_history"
)
Q3:如何结合 RAG?
A:使用向量存储(如 Milvus):
from langchain_milvus import Milvus
from langchain_core.prompts import PromptTemplate
vectorstore = Milvus(...)
prompt = PromptTemplate(
template="上下文:{context}\n问题:{question}\n回答:",
input_variables=["context", "question"]
)
chain = (
{"context": vectorstore.as_retriever() | lambda docs: "\n".join(d.page_content for d in docs), "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
Q4:如何处理慢速推理?
A:
n_gpu_layers
> 0)。n_batch
(如 1024):llm = LlamaCpp(..., n_batch=1024, n_threads=8)
langchain_community.llms.LlamaCpp
的使用方式包括:
model_path
、GPU 层数、上下文大小等。invoke
(同步)、stream
(流式)、ainvoke
/astream
(异步)、generate
(批量)。PromptTemplate
和 LCEL 构建问答或 RAG 系统。temperature
、max_tokens
、n_ctx
,启用 GPU。