Skip to main content

使用 Ollama 的 LiteLLM

LiteLLM 是一个开源的本地代理服务器,提供了与 OpenAI 兼容的 API。它与许多进行推理的服务提供商进行接口交互。为了处理推理,一个流行的开源推理引擎是 Ollama

由于并非所有代理服务器都支持 OpenAI 的函数调用(可与 AutoGen 一起使用),LiteLLM 与 Ollama 使这个有用的功能成为可能。

运行这个堆栈需要安装以下内容:

  1. AutoGen(安装说明
  2. LiteLLM
  3. Ollama

注意:我们建议为您的堆栈使用虚拟环境,详见这篇文章

安装 LiteLLM

使用代理服务器功能安装 LiteLLM:

pip install 'litellm[proxy]'

注意:如果使用 Windows,请在 WSL2 中运行 LiteLLM 和 Ollama。

tip

有关自定义 LiteLLM 安装说明,请参阅他们的 GitHub 仓库

安装 Ollama

对于 Mac 和 Windows,请下载 Ollama

对于 Linux:

curl -fsSL https://ollama.com/install.sh | sh

下载模型

Ollama 有一个模型库供您选择,可以在这里查看。

在使用模型之前,您需要下载它(使用模型库中的模型名称):

ollama pull llama2

要查看您已下载并可用的模型:

ollama list
tip

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 中,modelapi_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="今天我能帮你什么?")

输出:

agent (to user):

今天有什么我可以帮助您的吗?

--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“exit”结束对话:告诉我,为什么天空是蓝色的?
user (to agent):

告诉我,为什么天空是蓝色的?

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
agent (to user):

啊,一个经典问题!天空之所以呈现蓝色,是因为一种叫做瑞利散射的现象。当阳光进入地球的大气层时,会遇到氮气和氧气等气体的微小分子。这些分子会将光线向各个方向散射,但它们对较短(蓝色)波长的光线的散射比较多,对较长(红色)波长的光线的散射较少。这就是为什么白天天空看起来蓝色,尤其是朝向太阳的方向。

但是,等等,还有更多!天空的颜色还会根据时间和大气条件的不同而变化。例如,在日出和日落时,由于光线与地球大气层的相互作用方式,天空可能呈现出红色、橙色和粉色的色调。如果你身处一个有很多灰尘或污染物的地方,天空可能会显得更朦胧或灰色。

所以,这就是原因!天空之所以是蓝色的,是因为光线与地球大气层的相互作用方式,而且有很多因素会影响它的外观。还有其他什么问题您想了解的吗?

--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“exit”结束对话:那要怎样才能让它变红呢?
user (to agent):

那要怎样才能让它变红呢?

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
agent (to user):

啊,一个有趣的问题!要让天空呈现红色,我们需要以不同的方式来看待光的散射。当太阳低于地平线时,它发出的光线需要穿过更长的大气距离才能到达我们的眼睛。因此,较短波长的蓝光大部分被散射掉,只有较长波长的红光和橙光到达我们的眼睛。这就是为什么在日出和日落时,天空可能呈现出红色、橙色和粉色的原因。

然而,如果我们能够改变大气的组成或向空气中添加一些额外的颗粒物,即使太阳高悬在天空中,我们也有可能使天空呈现红色。例如,如果我们向大气中添加大量的灰尘或烟雾,由于这些颗粒物的光散射作用,天空可能呈现出红色的色调。或者,如果我们创造一种空气中含有高浓度的某些气体的情况,例如氮氧化物或硫化合物,由于这些气体与光的相互作用方式,天空可能呈现出红色或橙色。

所以,这就是原因!尽管由于瑞利散射,白天的天空通常是蓝色的,但还有许多其他因素会影响它的外观,而且在适当的条件下,我们甚至可以使天空呈现红色!还有其他什么问题您想了解的吗?

--------------------------------------------------------------------------------
向代理提供反馈。按回车键跳过并使用自动回复,或输入“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"
}


************************************************************************************************
warning

并非所有的开源/权重模型都适用于函数调用,AutoGen 仍在不断开发中,以提供对开源模型的更广泛支持。

AutoGen 的 Discord 上的 #alt-models 频道是一个活跃的社区,讨论使用开源/权重模型与 AutoGen 的使用。