跳至内容

语言模型

任何DSPy代码的第一步都是设置你的语言模型。例如,你可以如下配置OpenAI的GPT-4o-mini作为默认LM。

1
2
3
# Authenticate via `OPENAI_API_KEY` env: import os; os.environ['OPENAI_API_KEY'] = 'here'
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)

几个不同的语言模型

您可以通过设置环境变量 OPENAI_API_KEY 或传递下方的 api_key 进行身份验证。

1
2
3
import dspy
lm = dspy.LM('openai/gpt-4o-mini', api_key='YOUR_OPENAI_API_KEY')
dspy.configure(lm=lm)

您可以通过设置GEMINI_API_KEY环境变量或在下方传递api_key来进行身份验证。

1
2
3
import dspy
lm = dspy.LM('gemini/gemini-2.5-pro-preview-03-25', api_key='GEMINI_API_KEY')
dspy.configure(lm=lm)

您可以通过设置ANTHROPIC_API_KEY环境变量或在下方传递api_key进行身份验证。

1
2
3
import dspy
lm = dspy.LM('anthropic/claude-3-opus-20240229', api_key='YOUR_ANTHROPIC_API_KEY')
dspy.configure(lm=lm)

如果您在Databricks平台上,通过他们的SDK认证是自动的。如果不是,您可以设置环境变量DATABRICKS_API_KEYDATABRICKS_API_BASE,或者在下方传入api_keyapi_base

1
2
3
import dspy
lm = dspy.LM('databricks/databricks-meta-llama-3-1-70b-instruct')
dspy.configure(lm=lm)

首先,安装 SGLang 并使用你的语言模型启动其服务器。

> pip install "sglang[all]"
> pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/ 

> CUDA_VISIBLE_DEVICES=0 python -m sglang.launch_server --port 7501 --model-path meta-llama/Meta-Llama-3-8B-Instruct

然后,从您的DSPy代码中将其作为OpenAI兼容端点进行连接。

1
2
3
4
lm = dspy.LM("openai/meta-llama/Meta-Llama-3-8B-Instruct",
                 api_base="http://localhost:7501/v1",  # ensure this points to your port
                 api_key="", model_type='chat')
dspy.configure(lm=lm)

首先,安装 Ollama 并使用你的语言模型启动其服务器。

> curl -fsSL https://ollama.ai/install.sh | sh
> ollama run llama3.2:1b

然后,从您的DSPy代码中连接到它。

1
2
3
import dspy
lm = dspy.LM('ollama_chat/llama3.2', api_base='http://localhost:11434', api_key='')
dspy.configure(lm=lm)

在DSPy中,您可以使用任何由LiteLLM支持的数十种LLM提供商。只需按照他们的说明设置{PROVIDER}_API_KEY以及如何将{provider_name}/{model_name}传递给构造函数。

一些示例:

  • anyscale/mistralai/Mistral-7B-Instruct-v0.1, 使用 ANYSCALE_API_KEY
  • together_ai/togethercomputer/llama-2-70b-chat, 使用 TOGETHERAI_API_KEY
  • sagemaker/<your-endpoint-name>, 使用 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, 和 AWS_REGION_NAME
  • azure/, 使用 AZURE_API_KEY, AZURE_API_BASE, AZURE_API_VERSION, 以及可选的 AZURE_AD_TOKENAZURE_API_TYPE 作为环境变量。如果你在未设置环境变量的情况下初始化外部模型,请使用以下方式: lm = dspy.LM('azure/', api_key = 'AZURE_API_KEY' , api_base = 'AZURE_API_BASE', api_version = 'AZURE_API_VERSION')

如果你的提供商提供OpenAI兼容的端点,只需在你的完整模型名称前添加openai/前缀。

1
2
3
import dspy
lm = dspy.LM('openai/your-model-name', api_key='PROVIDER_API_KEY', api_base='YOUR_PROVIDER_URL')
dspy.configure(lm=lm)

如果遇到错误,请参考LiteLLM Docs来确认是否使用了相同的变量名称/遵循了正确的流程。

直接调用语言模型。

直接调用您上面配置的lm非常简单。这为您提供了统一的API,并让您受益于自动缓存等实用功能。

lm("Say this is a test!", temperature=0.7)  # => ['This is a test!']
lm(messages=[{"role": "user", "content": "Say this is a test!"}])  # => ['This is a test!']

使用LM与DSPy模块。

习惯性的DSPy涉及使用模块,我们将在下一个指南中讨论。

1
2
3
4
5
6
# 定义一个模块(ChainOfThought)并为其分配一个签名(给定一个问题,返回一个答案)。
qa = dspy.ChainOfThought('question -> answer')

# 使用上面通过`dspy.configure`配置的默认语言模型运行。
response = qa(question="How many floors are in the castle David Gregory inherited?")
print(response.answer)
可能的输出:
大卫·格雷戈里继承的城堡有7层。

使用多个语言模型。

你可以通过dspy.configure全局更改默认LM,或者使用dspy.context在代码块内部更改它。

提示

使用dspy.configuredspy.context是线程安全的!

1
2
3
4
5
6
7
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini'))
response = qa(question="大卫·格雷戈里继承的城堡有多少层?")
print('GPT-4o-mini:', response.answer)

with dspy.context(lm=dspy.LM('openai/gpt-3.5-turbo')):
    response = qa(question="大卫·格雷戈里继承的城堡有多少层?")
    print('GPT-3.5-turbo:', response.answer)
可能的输出:
GPT-4o-mini: 根据提供的信息无法确定大卫·格雷戈里继承的城堡的楼层数。
GPT-3.5-turbo: 大卫·格雷戈里继承的城堡有7层。

配置语言模型生成。

对于任何语言模型,你可以在初始化时或每次后续调用中配置以下任意属性。

gpt_4o_mini = dspy.LM('openai/gpt-4o-mini', temperature=0.9, max_tokens=3000, stop=None, cache=False)

默认情况下,DSPy中的语言模型会被缓存。如果你重复相同的调用,你会得到相同的输出。但你可以通过设置cache=False来关闭缓存。

如果你想保持缓存启用但强制发起新请求(例如,为了获取多样化输出), 请在调用时传递一个唯一的rollup_id并设置非零的temperature。DSPy在查找缓存条目时会同时哈希输入 和rollup_id,因此不同的值会强制发起新的LM请求,同时 仍会缓存具有相同输入和rollup_id的未来调用。该ID也会被记录在 lm.history中,这使得在实验期间轻松追踪或比较不同的rollup。仅更改 rollup_id而保持temperature=0不会影响LM的输出。

lm("Say this is a test!", rollout_id=1, temperature=1.0)

你也可以将这些LM参数直接传递给DSPy模块。在初始化时提供它们会为每次调用设置默认值:

predict = dspy.Predict("question -> answer", rollout_id=1, temperature=1.0)

要针对单次调用覆盖它们,在调用模块时提供一个 config 字典:

predict = dspy.Predict("question -> answer")
predict(question="What is 1 + 52?", config={"rollout_id": 5, "temperature": 1.0})

在这两种情况下,rollout_id 会被转发到底层语言模型,影响其缓存行为,并与每个响应一同存储,以便您稍后可以回放或分析特定的 rollout。

检查输出和使用元数据。

每个LM对象都会维护其交互历史,包括输入、输出、令牌使用量(和$$$成本)以及元数据。

1
2
3
len(lm.history)  # e.g., 3 calls to the LM

lm.history[-1].keys()  # access the last call to the LM, with all metadata

输出:

dict_keys(['prompt', 'messages', 'kwargs', 'response', 'outputs', 'usage', 'cost', 'timestamp', 'uuid', 'model', 'response_model', 'model_type])

高级:构建自定义语言模型并编写您自己的适配器。

虽然很少需要,你可以通过继承dspy.BaseLM来编写自定义语言模型。DSPy生态系统中的另一个高级层是适配器,它位于DSPy签名和语言模型之间。本指南的未来版本将讨论这些高级功能,尽管你可能不需要它们。

优云智算