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

汇智网翻译整理,转载请标明出处