langchain_community.llms.LlamaCpp
是 LangChain 提供的本地 LLM(大型语言模型)包装器,基于 LLaMA.cpp 库,支持运行本地量化的 LLaMA 模型(GGUF 格式)。
本文基于 LangChain 0.3.x,详细介绍 langchain_community.llms.LlamaCpp
的核心方法和属性,包括功能、参数和使用场景,并提供一个独立示例,展示如何使用 LlamaCpp
的方法构建一个简单的问答应用,示例使用本地 GGUF 模型和 langchain_core.prompts.PromptTemplate
。
LlamaCpp
简介langchain_community.llms.LlamaCpp
是 LangChain 的 LLM 类,继承自 langchain_core.language_models.llms.BaseLLM
,通过 LLaMA.cpp 库加载和运行本地 GGUF 格式的 LLaMA 模型。它适合隐私敏感场景或无需云服务的应用,广泛用于对话、问答和 RAG 系统。
功能:
初始化参数(常用属性):
model_path
(str,必填):GGUF 模型文件路径,如 /path/to/llama-2-7b-chat.Q4_0.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):是否打印详细日志。适用场景:
以下是 langchain_community.llms.LlamaCpp
的常用方法和属性,基于源码(langchain_community/llms/llamacpp.py
)和官方文档(LlamaCpp)。列出方法签名、参数、返回值、功能描述及使用场景。
__call__(prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str
prompt
:输入提示字符串。stop
:可选停止词列表,覆盖初始化时的 stop
。**kwargs
:附加参数,如 max_tokens
。str
,生成的文本。from langchain_community.llms import LlamaCpp
llm = LlamaCpp(model_path="/models/llama-2-7b-chat.Q4_0.gguf")
response = llm("什么是人工智能?")
print(response) # 输出: 人工智能是...
invoke(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> str
input
:输入提示字符串。config
:运行时配置,如 max_tokens
。stop
:停止词列表。**kwargs
:附加参数。str
,生成的文本。__call__
,更符合现代 LangChain API。response = llm.invoke("什么是人工智能?", stop=["\n"])
print(response)
stream(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> Iterator[str]
input
:输入提示字符串。config
:运行时配置。stop
:停止词列表。**kwargs
:附加参数。Iterator[str]
,生成文本的迭代器。for chunk in llm.stream("人工智能有哪些应用?"):
print(chunk, end="", flush=True)
ainvoke(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> Awaitable[str]
invoke
。Awaitable[str]
,异步返回生成的文本。import asyncio
async def run():
response = await llm.ainvoke("什么是人工智能?")
print(response)
asyncio.run(run())
astream(input: str, config: Optional[RunnableConfig] = None, *, stop: Optional[List[str]] = None, **kwargs) -> AsyncIterator[str]
stream
。AsyncIterator[str]
,异步生成文本的迭代器。async def run_stream():
async for chunk in llm.astream("人工智能有哪些应用?"):
print(chunk, end="", flush=True)
asyncio.run(run_stream())
generate(prompts: List[str], **kwargs) -> LLMResult
prompts
:提示字符串列表。**kwargs
:附加参数,如 stop
。LLMResult
,包含生成结果和元数据。results = llm.generate(["什么是人工智能?", "它有哪些应用?"])
for generation in results.generations:
print(generation[0].text)
model_path: str
str
print(llm.model_path) # 输出: /models/llama-2-7b-chat.Q4_0.gguf
temperature: float
float
temperature
更严谨,高更创意)。llm.temperature = 0.5
print(llm.temperature) # 输出: 0.7
max_tokens: int
int
llm.max_tokens = 1024
print(llm.max_tokens) # 输出: 1024
n_ctx: int
int
print(llm.n_ctx) # 输出: 2048
n_gpu_layers: int
int
print(llm.n_gpu_layers) # 输出: 0
stop: Optional[List[str]]
Optional[List[str]]
llm.stop = ["\n", "###"]
print(llm.stop) # 输出: None 或 ["\n"]
类型 | 名称 | 功能 | 典型场景 |
---|---|---|---|
方法 | __call__ |
同步生成文本 | 快速测试 |
方法 | invoke |
同步生成(LCEL) | LCEL 链 |
方法 | stream |
流式生成 | 实时输出 |
方法 | ainvoke |
异步生成 | 异步应用 |
方法 | astream |
异步流式生成 | 实时 Web 服务 |
方法 | generate |
批量生成 | 批量处理 |
属性 | model_path |
模型路径 | 调试加载 |
属性 | temperature |
随机性控制 | 输出风格 |
属性 | max_tokens |
输出长度 | 控制生成 |
属性 | n_ctx |
上下文窗口 | 长对话 |
属性 | n_gpu_layers |
GPU 层数 | 性能优化 |
属性 | stop |
停止词 | 终止控制 |
推荐方法:
invoke
:标准同步调用,适合 LCEL 链。stream
:实时输出,适合交互应用。astream
:异步流式,适合 Web 服务。推荐属性:
temperature
:调整输出风格。max_tokens
:控制输出长度。n_ctx
:支持长上下文。LlamaCpp
的问答示例以下是一个独立示例,展示 LlamaCpp
的常用方法(invoke
, stream
)和属性(temperature
, max_tokens
),结合 langchain_core.prompts.PromptTemplate
构建一个简单问答应用,回答关于区块链的问题。
准备文件:
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, # 0 表示仅 CPU
n_batch=512,
temperature=0.7,
max_tokens=512,
n_ctx=2048,
verbose=False
)
# 检查属性
print("模型属性:")
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)
# 使用 stream 方法
print("\n使用 stream 方法:")
for chunk in qa_chain.stream("区块链有哪些应用?"):
print(chunk, end="", flush=True)
print()
输出示例(取决于模型和硬件,实际输出可能略有不同):
模型属性:
Model Path: /models/llama-2-7b-chat.Q4_0.gguf
Temperature: 0.7
Max Tokens: 512
使用 invoke 方法:
区块链是分布式账本技术,通过加密保证数据安全和透明。
使用 stream 方法:
区块链的应用包括加密货币、金融结算和供应链管理。
n_gpu_layers=0
)。temperature=0.7
、max_tokens=512
、n_ctx=2048
。model_path
、temperature
、max_tokens
,验证配置。invoke
:同步生成答案,回答 “什么是区块链?”。stream
:流式生成,实时输出 “区块链有哪些应用?”。langchain_core.prompts.PromptTemplate
,格式化问题。prompt
、llm
和 StrOutputParser
。运行要求:
llama-2-7b-chat.Q4_0.gguf
)存在且路径正确。pip install --upgrade langchain langchain-core langchain-community llama-cpp-python
import os
assert os.path.exists("/models/llama-2-7b-chat.Q4_0.gguf")
n_gpu_layers=40
(需 6GB+ 显存)。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_ctx
(如 4096)支持长上下文。n_batch
(如 1024)提高吞吐量。n_gpu_layers=40
。temperature
(如 0.5)提高确定性。stop=["\n"]
控制输出终止。model_path
和文件完整性。max_tokens
(如 1024)。n_ctx
是否足够。n_batch
。stream
和 astream
适合交互应用,但需确保终端或 UI 支持实时显示。Q1:invoke
和 __call__
的区别?
A:invoke
是 LCEL 标准方法,支持配置(如 stop
)和链集成;__call__
是快捷调用,功能类似但更简单。
Q2:如何加速 LlamaCpp
推理?
A:启用 GPU(n_gpu_layers
> 0),使用量化模型(如 Q4_0),优化 n_batch
和 n_threads
:
llm = LlamaCpp(..., n_gpu_layers=40, n_batch=1024, n_threads=8)
Q3:如何处理长对话?
A:增加 n_ctx
(如 4096),结合 RunnableWithMessageHistory
:
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
chain_with_history = RunnableWithMessageHistory(
runnable=qa_chain,
get_session_history=lambda session_id: ChatMessageHistory()
)
Q4:可以结合 RAG 吗?
A:可以,使用向量存储(如 Milvus):
from langchain_milvus import Milvus
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()
)
langchain_community.llms.LlamaCpp
的常用方法包括:
invoke
:同步生成,适合 LCEL 链。stream
:流式生成,实时输出。ainvoke
/astream
:异步调用,适合 Web 服务。generate
:批量处理。常用属性包括:
model_path
:模型路径。temperature
:随机性控制。max_tokens
:输出长度。n_ctx
:上下文窗口。