MacOS本地问答应用
使用 llama.cpp 和 LangChain 在 macOS 上本地部署量化的 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,你可以利用 LLM 实现一切,从问答应用程序到具有内存和实时令牌流的对话机器人。
1、设置macOS 环境
要将 llama.cpp 与 LangChain 集成,请先设置你的 macOS 环境。
1.1 安装依赖库
首先,确保已安装 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
1.2 加载 LLAMA 3.2
要运行 LLAMA 3.2 模型,请从授权来源(Meta 的 LLaMA 存储库)下载适当的权重,并确保它们与 llama.cpp 兼容。Meta 对 LLAMA 的权重应用许可,因此你必须提交请求才能访问。
然后,只需找到任何合适的模型(原始模型或量化模型),检查其与 llama.cpp 的兼容性并下载权重。例如,在下图中,你可以看到来自此 repo 的模型与 llama-cpp-python 兼容
然后,你可以转到 repo 中的文件并下载你喜欢的任何模型变体的权重。在这里,我选择 LLAMA 3.2 3B,它被量化为 4 位,其中 Q4 指定每个权重占用的位数,K_S 表示量化方法。因此 Q4_K_S 表示“随机舍入的 4 位量化”
为了帮助你选择特定的量化模型,我附上了一个非常有用的 GitHub 问题的屏幕截图:
1.3 测试 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)
2、使用 LangChain 初始化 llama-cpp
环境准备好后,让我们使用 LangChain 为 LLAMA 3.2 设置 llama.cpp。
2.1 定义提示模板
要指导模型的响应,请创建一个结构化的提示:
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)
2.2 配置流式传输的回调
LangChain 为生成的令牌的实时流式传输提供回调支持。以下是如何为令牌流式传输设置回调管理器:
from langchain_core.callbacks import CallbackManager, StreamingStdOutCallbackHandler
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
2.3 使用自定义参数设置 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
)
2.4 设置 Chain 接口
使用 LangChain 的 chain 功能将提示连接到模型:
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}))
此命令将问题发送给模型,模型将根据提供的提示模板生成响应。
3、构建一个简单的问答应用程序
使用基本命令行界面 (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”。
3.1 高级用法:使用内存增强 LangChain
为了使交互更具上下文性,请使用 LangChain 的 ConversationBufferMemory 添加内存。
LangChain 的内存功能使模型能够在多个交互中保留上下文。这对于基于对话的应用程序特别有用。以下是初始化内存的方法:
from langchain.memory import 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()
此修改使模型具有更具对话性的语气,在问题之间保留了上下文。
4、小技巧
为了最大限度地提高性能和准确性:
- 尝试使用提示工程:定制提示以测试响应并针对你的用例进行优化。
- 调整内存和批处理大小:根据系统资源调整内存设置和批处理大小。
- 监控资源使用情况:分析系统资源以根据需要调整 GPU 层或线程。
- 与社区互动:加入 GitHub、Stack Overflow 或 Discord 上的论坛以获取更多见解和故障排除。
5、结束语
通过遵循本指南,你现在拥有一个完全配置的设置,可以在 macOS 上使用 llama.cpp 运行 LLAMA 3.2,并与 LangChain 无缝集成。从基本的问答界面到具有内存的高级应用程序,此框架提供了一种探索本地 LLM 潜力的强大方法。无论是个人项目还是大型应用程序,在本地部署量化模型都可以帮助你在 macOS 上构建高效的 AI 驱动应用程序。
原文链接:Running Quantized LLAMA Models Locally on macOS with LangChain and Llama.cpp: A Step-by-Step Guide
汇智网翻译整理,转载请标明出处