使用 Ollama 的 LiteLLM
LiteLLM 是一个开源的本地代理服务器,提供了与 OpenAI 兼容的 API。它与许多进行推理的服务提供商进行接口交互。为了处理推理,一个流行的开源推理引擎是 Ollama。
由于并非所有代理服务器都支持 OpenAI 的函数调用(可与 AutoGen 一起使用),LiteLLM 与 Ollama 使这个有用的功能成为可能。
运行这个堆栈需要安装以下内容:
- AutoGen(安装说明)
- LiteLLM
- Ollama
注意:我们建议为您的堆栈使用虚拟环境,详见这篇文章。
安装 LiteLLM
使用代理服务器功能安装 LiteLLM:
pip install 'litellm[proxy]'
注意:如果使用 Windows,请在 WSL2 中运行 LiteLLM 和 Ollama。
有关自定义 LiteLLM 安装说明,请参阅他们的 GitHub 仓库。
安装 Ollama
对于 Mac 和 Windows,请下载 Ollama。
对于 Linux:
curl -fsSL https://ollama.com/install.sh | sh
下载模型
Ollama 有一个模型库供您选择,可以在这里查看。
在使用模型之前,您需要下载它(使用模型库中的模型名称):
ollama pull llama2
要查看您已下载并可用的模型:
ollama list
Ollama 支持使用 Hugging Face 上现成的 GGUF 模型文件。请参阅 Ollama 的 GitHub 仓库 获取示例。
运行 LiteLLM 代理服务器
要使用您已下载的模型运行 LiteLLM,请在终端中运行:
litellm --model ollama_chat/llama2
INFO: Started server process [19040]
INFO: Waiting for application startup.
#------------------------------------------------------------#
# #
# 'This feature doesn't meet my needs because...' #
# https://github.com/BerriAI/litellm/issues/new #
# #
#------------------------------------------------------------#
Thank you for using LiteLLM! - Krrish & Ishaan
Give Feedback / Get Help: https://github.com/BerriAI/litellm/issues/new
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:4000 (Press CTRL+C to quit)
这将运行代理服务器,并且可以在 'http://0.0.0.0:4000/' 上访问。
使用 LiteLLM+Ollama 与 AutoGen
现在我们有了 LiteLLM 代理服务器的 URL,您可以在 AutoGen 中使用它。 与 OpenAI 或基于云的代理服务器一样。
由于您在本地运行此代理服务器,因此不需要 API 密钥。此外,由于在运行 LiteLLM 命令时设置了模型,因此不需要在 AutoGen 中配置模型名称。但是,在 AutoGen 中,model
和 api_key
是必填字段,因此我们在这些字段中放入了虚拟值,如下所示。
from autogen import UserProxyAgent, ConversableAgent
local_llm_config={
"config_list": [
{
"model": "NotRequired", # 使用 LiteLLM 命令加载
"api_key": "NotRequired", # 不需要
"base_url": "http://0.0.0.0:4000" # 您的 LiteLLM URL
}
],
"cache_seed": None # 关闭缓存,用于测试不同的模型
}
# 创建使用 LLM 的代理。
assistant = ConversableAgent("agent", llm_config=local_llm_config)
# 创建代表对话中用户的代理。
user_proxy = UserProxyAgent("user", code_execution_config=False)
# 让助手开始对话。当用户输入 exit 时,对话将结束。
assistant.initiate_chat(user_proxy, message="今天我能帮你什么?")
输出:
今天有什么我可以帮助您的吗?
--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“exit”结束对话:告诉我,为什么天空是蓝色的?
告诉我,为什么天空是蓝色的?
--------------------------------------------------------------------------------
>>>>>>>> 使用自动回复...
啊,一个经典问题!天空之所以呈现蓝色,是因为一种叫做瑞利散射的现象。当阳光进入地球的大气层时,会遇到氮气和氧气等气体的微小分子。这些分子会将光线向各个方向散射,但它们对较短(蓝色)波长的光线的散射比较多,对较长(红色)波长的光线的散射较少。这就是为什么白天天空看起来蓝色,尤其是朝向太阳的方向。
但是,等等,还有更多!天空的颜色还会根据时间和大气条件的不同而变化。例如,在日出和日落时,由于光线与地球大气层的相互作用方式,天空可能呈现出红色、橙色和粉色的色调。如果你身处一个有很多灰尘或污染物的地方,天空可能会显得更朦胧或灰色。
所以,这就是原因!天空之所以是蓝色的,是因为光线与地球大气层的相互作用方式,而且有很多因素会影响它的外观。还有其他什么问题您想了解的吗?
--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“exit”结束对话:那要怎样才能让它变红呢?
那要怎样才能让它变红呢?
--------------------------------------------------------------------------------
>>>>>>>> 使用自动回复...
啊,一个有趣的问题!要让天空呈现红色,我们需要以不同的方式来看待光的散射。当太阳低于地平线时,它发出的光线需要穿过更长的大气距离才能到达我们的眼睛。因此,较短波长的蓝光大部分被散射掉,只有较长波长的红光和橙光到达我们的眼睛。这就是为什么在日出和日落时,天空可能呈现出红色、橙色和粉色的原因。
然而,如果我们能够改变大气的组成或向空气中添加一些额外的颗粒物,即使太阳高悬在天空中,我们也有可能使天空呈现红色。例如,如果我们向大气中添加大量的灰尘或烟雾,由于这些颗粒物的光散射作用,天空可能呈现出红色的色调。或者,如果我们创造一种空气中含有高浓度的某些气体的情况,例如氮氧化物或硫化合物,由于这些气体与光的相互作用方式,天空可能呈现出红色或橙色。
所以,这就是原因!尽管由于瑞利散射,白天的天空通常是蓝色的,但还有许多其他因素会影响它的外观,而且在适当的条件下,我们甚至可以使天空呈现红色!还有其他什么问题您想了解的吗?
--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“exit”结束对话:exit
使用函数调用的示例
函数调用(也称为工具调用)是 OpenAI API 的一个功能,AutoGen 和 LiteLLM 都支持。
下面是使用 LiteLLM 和 Ollama 进行函数调用的示例。基于这个货币转换笔记本。
与之前的示例一样,LiteLLM 的加载方式也相同,但是使用了 DolphinCoder 模型,因为它更擅长构建所需的函数调用消息。
在终端中执行以下命令:
litellm --model ollama_chat/dolphincoder
import autogen
from typing import Literal
from typing_extensions import Annotated
local_llm_config={
"config_list": [
{
"model": "NotRequired", # 使用 LiteLLM 命令加载
"api_key": "NotRequired", # 不需要
"base_url": "http://0.0.0.0:4000" # 你的 LiteLLM URL
}
],
"cache_seed": None # 关闭缓存,用于测试不同的模型
}
# 创建代理并在提示中包含调用函数的 JSON 示例,以帮助指导模型
chatbot = autogen.AssistantAgent(
name="chatbot",
system_message="""对于货币兑换任务,
请仅使用您提供的函数。
当提供答案时,请输出 'TERMINATE'。
不要在 JSON 中包含函数名或结果。
返回 JSON 的示例是:
{
"parameter_1_name": 100.00,
"parameter_2_name": "ABC",
"parameter_3_name": "DEF",
}。
返回 JSON 的另一个示例是:
{
"parameter_1_name": "GHI",
"parameter_2_name": "ABC",
"parameter_3_name": "DEF",
"parameter_4_name": 123.00,
}。""",
llm_config=local_llm_config,
)
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
is_termination_msg=lambda x: x.get("content", "") and "TERMINATE" in x.get("content", ""),
human_input_mode="NEVER",
max_consecutive_auto_reply=1,
)
CurrencySymbol = Literal["USD", "EUR"]
# 定义我们期望调用的函数
def exchange_rate(base_currency: CurrencySymbol, quote_currency: CurrencySymbol) -> float:
if base_currency == quote_currency:
return 1.0
elif base_currency == "USD" and quote_currency == "EUR":
return 1 / 1.1
elif base_currency == "EUR" and quote_currency == "USD":
return 1.1
else:
raise ValueError(f"未知货币 {base_currency}, {quote_currency}")
# 使用代理注册函数
@user_proxy.register_for_execution()
@chatbot.register_for_llm(description="货币兑换计算器。")
def currency_calculator(
base_amount: Annotated[float, "基础货币的金额"],
base_currency: Annotated[CurrencySymbol, "基础货币"] = "USD",
quote_currency: Annotated[CurrencySymbol, "目标货币"] = "EUR",
) -> str:
quote_amount = exchange_rate(base_currency, quote_currency) * base_amount
return f"{format(quote_amount, '.2f')} {quote_currency}"
# 开始对话
res = user_proxy.initiate_chat(
chatbot,
message="123.45 EUR 等于多少美元?",
summary_method="reflection_with_llm",
)
输出:
用户代理 (对话机器人):
123.45 欧元等于多少美元?
--------------------------------------------------------------------------------
对话机器人 (对用户代理):
***** 建议使用工具 Call (call_c93c4390-93d5-4a28-b40d-09fe74cc58da): currency_calculator *****
参数:
{
"base_amount": 123.45,
"base_currency": "EUR",
"quote_currency": "USD"
}
************************************************************************************************
--------------------------------------------------------------------------------
>>>>>>>> 执行函数 currency_calculator...
用户代理 (对话机器人):
用户代理 (对话机器人):
***** 调用工具 "call_c93c4390-93d5-4a28-b40d-09fe74cc58da" 的响应 *****
135.80 美元
**********************************************************************************
--------------------------------------------------------------------------------
对话机器人 (对用户代理):
***** 建议使用工具 Call (call_d8fd94de-5286-4ef6-b1f6-72c826531ff9): currency_calculator *****
参数:
{
"base_amount": 123.45,
"base_currency": "EUR",
"quote_currency": "USD"
}
************************************************************************************************
并非所有的开源/权重模型都适用于函数调用,AutoGen 仍在不断开发中,以提供对开源模型的更广泛支持。
AutoGen 的 Discord 上的 #alt-models 频道是一个活跃的社区,讨论使用开源/权重模型与 AutoGen 的使用。