跳到主要内容
llama.cpp python 库是 @ggerganov llama.cpp 的一个简单的 Python 绑定。 此软件包提供:
  • 通过 ctypes 接口低层访问 C API。
  • 用于文本补全的高级 Python API
    • OpenAI 风格的 API
    • LangChain 兼容性
    • LlamaIndex 兼容性
  • 与 OpenAI 兼容的 Web 服务器
    • 本地 Copilot 替代品
    • 函数调用支持
    • 视觉 API 支持
    • 多模型

概览

集成详情

类别本地可序列化JS 支持
ChatLlamaCpplangchain-community

模型功能

工具调用结构化输出JSON 模式图像输入音频输入视频输入令牌级流式传输原生异步Token 用量Logprobs

设置

要开始使用并利用下面展示的所有功能,我们建议使用经过工具调用微调的模型。 我们将使用 NousResearch 的 Hermes-2-Pro-Llama-3-8B-GGUF
Hermes 2 Pro 是 Nous Hermes 2 的升级版本,包含更新和清理后的 OpenHermes 2.5 数据集,以及内部开发的新的函数调用和 JSON 模式数据集。这个新版本的 Hermes 保持了其出色的通用任务和对话能力,并且在函数调用方面表现出色。
请参阅我们的本地模型指南,以深入了解

安装

LangChain LlamaCpp 集成存在于 langchain-communityllama-cpp-python 包中
pip install -qU langchain-community llama-cpp-python

实例化

现在我们可以实例化我们的模型对象并生成聊天完成
# Path to your model weights
local_model = "local/path/to/Hermes-2-Pro-Llama-3-8B-Q8_0.gguf"
import multiprocessing

from langchain_community.chat_models import ChatLlamaCpp

llm = ChatLlamaCpp(
    temperature=0.5,
    model_path=local_model,
    n_ctx=10000,
    n_gpu_layers=8,
    n_batch=300,  # Should be between 1 and n_ctx, consider the amount of VRAM in your GPU.
    max_tokens=512,
    n_threads=multiprocessing.cpu_count() - 1,
    repeat_penalty=1.5,
    top_p=0.5,
    verbose=True,
)

调用

messages = [
    (
        "system",
        "You are a helpful assistant that translates English to French. Translate the user sentence.",
    ),
    ("human", "I love programming."),
]

ai_msg = llm.invoke(messages)
ai_msg
print(ai_msg.content)
J'aime programmer. (In France, "programming" is often used in its original sense of scheduling or organizing events.)

If you meant computer-programming:
Je suis amoureux de la programmation informatique.

(You might also say simply 'programmation', which would be understood as both meanings - depending on context).

工具调用

首先,它的工作方式与 OpenAI 函数调用大致相同。 OpenAI 提供了一个工具调用(我们在这里交替使用“工具调用”和“函数调用”)API,允许您描述工具及其参数,并让模型返回一个 JSON 对象,其中包含要调用的工具和该工具的输入。工具调用对于构建使用工具的链和代理,以及更普遍地从模型获取结构化输出非常有用。 通过 ChatLlamaCpp.bind_tools,我们可以轻松地将 Pydantic 类、字典模式、LangChain 工具,甚至是函数作为工具传递给模型。在底层,这些被转换为 OpenAI 工具模式,其格式如下:
{
    "name": "...",
    "description": "...",
    "parameters": {...}  # JSONSchema
}
并传递给每次模型调用。 但是,它无法自动触发函数/工具,我们需要通过指定“工具选择”参数来强制执行。此参数通常格式如下所述。 {"type": "function", "function": {"name": <<tool_name>>}}。
from langchain.tools import tool
from pydantic import BaseModel, Field


class WeatherInput(BaseModel):
        location: str = Field(description="The city and state, e.g. San Francisco, CA")
        unit: str = Field(enum=["celsius", "fahrenheit"])


@tool("get_current_weather", args_schema=WeatherInput)
def get_weather(location: str, unit: str):
    """Get the current weather in a given location"""
    return f"Now the weather in {location} is 22 {unit}"


llm_with_tools = llm.bind_tools(
        tools=[get_weather],
        tool_choice={"type": "function", "function": {"name": "get_current_weather"}},
)
ai_msg = llm_with_tools.invoke(
    "what is the weather like in HCMC in celsius",
)
ai_msg.tool_calls
[{'name': 'get_current_weather',
  'args': {'location': 'Ho Chi Minh City', 'unit': 'celsius'},
  'id': 'call__0_get_current_weather_cmpl-394d9943-0a1f-425b-8139-d2826c1431f2'}]
class MagicFunctionInput(BaseModel):
        magic_function_input: int = Field(description="The input value for magic function")


@tool("get_magic_function", args_schema=MagicFunctionInput)
def magic_function(magic_function_input: int):
    """Get the value of magic function for an input."""
    return magic_function_input + 2


llm_with_tools = llm.bind_tools(
        tools=[magic_function],
        tool_choice={"type": "function", "function": {"name": "get_magic_function"}},
)

ai_msg = llm_with_tools.invoke(
    "What is magic function of 3?",
)

ai_msg
ai_msg.tool_calls
[{'name': 'get_magic_function',
  'args': {'magic_function_input': 3},
  'id': 'call__0_get_magic_function_cmpl-cd83a994-b820-4428-957c-48076c68335a'}]

结构化输出

from langchain_core.utils.function_calling import convert_to_openai_tool
from pydantic import BaseModel


class Joke(BaseModel):
    """A setup to a joke and the punchline."""

    setup: str
    punchline: str


dict_schema = convert_to_openai_tool(Joke)
structured_llm = llm.with_structured_output(dict_schema)
result = structured_llm.invoke("Tell me a joke about birds")
result
result
{'setup': '- Why did the chicken cross the playground?',
 'punchline': '\n\n- To get to its gilded cage on the other side!'}

流式处理

for chunk in llm.stream("what is 25x5"):
        print(chunk.content, end="\n", flush=True)

API 参考

有关所有 ChatLlamaCpp 功能和配置的详细文档,请查阅 API 参考:python.langchain.com/api_reference/community/chat_models/langchain_community.chat_models.llamacpp.ChatLlamaCpp.html
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.