在macOS上使用llama.cpp和LangChain本地部署量化LLAMA模型,为构建不依赖于云资源的AI驱动应用开辟了新的可能性。在本文中,我们将逐步介绍如何设置llama.cpp、加载LLAMA 3.2模型权重,以及使用LangChain框架创建一个问答应用程序——所有步骤均附有易于遵循的代码示例。
理解组件
在实现之前,我们先简要回顾一下你将使用的组件。
llama.cpp
llama.cpp是一个C++库,支持在本地部署LLAMA和其他大型语言模型。该库适用于各种设备,支持高性能GPU和基本CPU,甚至在智能手机上也能运行。使用llama.cpp,你可以部署适应内存限制的量化模型,非常适合边缘设备。幸运的是,它提供了包括Python在内的多种语言的绑定,因此我们可以将其作为一个Python包来使用。
在这里,我们将使用LLAMA 3.2(1B和3B)模型,这些模型既轻便又强大,非常适合本地AI应用。
LangChain
LangChain是一个多功能框架,可以更有效地与语言模型一起工作,提供了内存、链和代理等工具来简化复杂的工作流程。通过LangChain,你可以利用大型语言模型(LLMs、)来实现从问答应用到具有记忆功能和实时令牌流的对话机器人等各种应用。
第一步:设置你的macOS环境
为了将llama.cpp与LangChain集成,首先设置你的macOS环境。
安装所需库
首先,确保已安装Python 3。然后,设置一个虚拟环境并安装必要的库:
python3 -m venv llama_langchain_env
source llama_langchain_env/bin/activate
pip install langchain langchain-core langchain-community
CMAKE_ARGS="-DGGML_METAL=on" pip install llama-cpp-python
加载LLAMA 3.2
为了运行LLAMA 3.2模型,请从官方授权的来源(如Meta的LLaMA仓库)下载相应的权重,并确保它们与llama.cpp兼容。Meta对LLAMA的权重施加了许可限制,因此你需要提交请求以获得访问权限。
然后,找到任何合适的模型,无论是原始模型还是量化模型,检查其与llama.cpp的兼容性,并下载权重。例如,在下图中,你可以看到来自这个仓库的模型与llama-cpp-python是兼容的。
然后,你可以进入仓库中的文件,下载你喜欢的任何模型变体的权重。在这里,我选择了LLAMA 3.2 3B,它被量化到了4位,其中Q4表示每个权重所占的位数,而K_S表示量化方法。所以Q4_K_S的意思是“采用随机舍入的4位量化”。
为了帮助你选择一个特定的量化模型,我附上了一张来自GitHub上一个非常有用的Issue的截图。
测试LLAMA 3.2
你可以尝试像这样在纯llama.cpp环境中运行模型,
from llama_cpp import Llama
model_path = "/path/to/llama-3.2-3B-Instruct.Q4_K_S.gguf"
llama_model = Llama(model_path=model_path)
response = llama_model("Continue: Knock Knock")
print(response)
第二步:使用LangChain初始化llama-cpp
环境准备完毕后,我们来为LLAMA 3.2使用LangChain设置llama.cpp。
定义提示模板
为了引导模型的响应,创建一个结构化的提示:
from langchain_core.prompts import PromptTemplate
template = """Question: {question}
Answer: Let's work this out in a step-by-step."""
prompt = PromptTemplate.from_template(template)
配置流式回调
LangChain支持实时生成令牌的回调功能。以下是如何为逐令牌流式传输设置回调管理器的方法:
from langchain_core.callbacks import CallbackManager, StreamingStdOutCallbackHandler
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
使用自定义参数设置llama-cpp模型
通过将n_gpu_layers设置为0(仅使用CPU)或-1(使用所有可用的GPU性能)来针对macOS进行优化。以下是配置:
from langchain_community.llms import LlamaCpp
n_gpu_layers = -1
n_batch = 512 # Adjust based on your Mac's resources
llm = LlamaCpp(
model_path="models/Llama-3.2-3B-Instruct.Q4_K_S.gguf",
n_gpu_layers=n_gpu_layers,
n_batch=n_batch,
f16_kv=True,
callback_manager=callback_manager,
verbose=True
)
设置链接口
使用LangChain的链功能将提示连接到模型:
llm_chain = prompt | llm
LangChain使用“|”操作符将提示、模型和解析器连接在一起。这被称为LangChain表达式语言(LCEL)。
现在,测试设置。
question = "What NFL team won the Super Bowl the year Justin Bieber was born?"
print(llm_chain.invoke({"question": question}))
这条命令将问题发送给模型,模型将根据提供的提示模板生成回答。
第三步:构建一个简单的问答应用程序
扩展设置,增加一个基本的命令行界面(CLI)来与模型进行交互:
def main():
while True:
user_question = input("Enter your question (or type 'quit' to exit): ")
if user_question.lower() == 'quit':
break
response = llm_chain.invoke({"question": user_question})
print("Answer:", response)
if __name__ == "__main__":
main()
这个设置允许持续交互,直到输入“quit”为止。
高级用法:为LangChain增强记忆功能
为了使交互更具上下文关联性,可以使用LangChain的ConversationBufferMemory来添加记忆功能。
LangChain的记忆功能使模型能够在多次交互中保留上下文。这对于基于对话的应用程序尤其有用。以下是初始化记忆的方法:
from langchain.memory import ConversationBufferMemoryimport ConversationBufferMemory
memory = ConversationBufferMemory()
以下是带有记忆功能的问答AI助手的完整代码:
from langchain_core.prompts import PromptTemplate
from langchain_core.callbacks import CallbackManager, StreamingStdOutCallbackHandler
from langchain_community.llms import LlamaCpp
from langchain.memory import ConversationBufferMemory
# Set up template and callback
template = """Question: {question}
Answer: Let's work this out in a step-by-step way to ensure we get the right answer."""
prompt = PromptTemplate.from_template(template)
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
# Initialize memory, model, and chain
memory = ConversationBufferMemory()
n_gpu_layers = -1
n_batch = 512 # Adjust for Mac's resources
llm = LlamaCpp(
model_path="models/Llama-3.2-3B-Instruct.Q4_K_S.gguf",
n_gpu_layers=n_gpu_layers,
n_batch=n_batch,
f16_kv=True,
callback_manager=callback_manager,
verbose=True
)
llm_chain = prompt | llm
def main_with_memory():
memory.clear() # Clear memory at start
while True:
user_question = input("Enter your question (or type 'quit' to exit): ")
if user_question.lower() == 'quit':
break
# Retrieve past messages from memory
context = " ".join([f"Q: {msg['input']}\nA: {msg['output']}" for msg in memory.chat_memory.messages])
combined_prompt = f"{context}\nQuestion: {user_question}"
generated_text = llm_chain.invoke({"question": combined_prompt})
print("Answer:", generated_text)
memory.save_context({"input": user_question}, {"output": generated_text})
if __name__ == "__main__":
main_with_memory()
这种修改使模型具有更自然的对话语气,能够在多个问题之间保留上下文。
在macOS上使用LangChain优化llama.cpp的提示:
为了最大限度地提高性能和准确性:
结论
通过遵循本指南,你现在已经在macOS上拥有了一个完全配置好的环境,可以无缝集成LangChain运行LLAMA 3.2与llama.cpp。从基本的问答界面到带有记忆功能的高级应用程序,这个框架提供了一种强大的方式来探索本地大型语言模型(LLM)的潜力。无论是用于个人项目还是大型应用程序,本地部署量化模型都使你能够在macOS上构建高效、人工智能驱动的应用程序。