MLX
此筆記本示範如何開始使用 MLX
LLM 作為聊天模型。
特別是,我們將會
- 使用 MLXPipeline,
- 使用
ChatMLX
類別來啟用任何這些 LLM,以與 LangChain 的 聊天訊息 抽象介面互動。 - 示範如何使用開放原始碼 LLM 來驅動
ChatAgent
管線
%pip install --upgrade --quiet mlx-lm transformers huggingface_hub
1. 實例化 LLM
有三個 LLM 選項可供選擇。
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},
)
API 參考:MLXPipeline
2. 實例化 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)
API 參考:ChatMLX | HumanMessage
檢查聊天訊息如何為 LLM 呼叫格式化。
chat_model._to_chat_prompt(messages)
呼叫模型。
res = chat_model.invoke(messages)
print(res.content)
3. 將其作為 Agent 試用!
在這裡,我們將測試 gemma-2b-it
作為 zero-shot ReAct
Agent。以下範例取自此處。
注意:若要執行此章節,您需要將 SerpAPI Token 儲存為環境變數:
SERPAPI_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
API 參考:hub | AgentExecutor | load_tools | format_log_to_str | ReActJsonSingleInputOutputParser | render_text_description | SerpAPIWrapper
設定具有 react-json
樣式提示的 Agent,並存取搜尋引擎和計算機。
# setup tools
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# setup ReAct style prompt
# Based on 'hwchase17/react' prompt modification, cause mlx does not support the `System` role
human_prompt = """
Answer the following questions as best you can. You have access to the following tools:
{tools}
The way you use the tools is by specifying a json blob.
Specifically, this json should have a `action` key (with the name of the tool to use) and a `action_input` key (with the input to the tool going here).
The only values that should be in the "action" field are: {tool_names}
The $JSON_BLOB should only contain a SINGLE action, do NOT return a list of multiple actions. Here is an example of a valid $JSON_BLOB:
\`\`\`
{{
"action": $TOOL_NAME,
"action_input": $INPUT
}}
\`\`\`
ALWAYS use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action:
\`\`\`
$JSON_BLOB
\`\`\`
Observation: the result of the action
... (this Thought/Action/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin! Reminder to always use the exact characters `Final Answer` when responding.
{input}
{agent_scratchpad}
"""
prompt = human_prompt.partial(
tools=render_text_description(tools),
tool_names=", ".join([t.name for t in tools]),
)
# define the agent
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()
)
# instantiate 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?"
}
)