> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 使用DSPy改进 AI 代理
- URL: https://www.hubwiz.com/blog/improve-ai-gents-using-dspy/
- Published: 2024-11-06T03:29:55.000Z
- Updated: 2024-11-06T03:29:55.000Z
- Description: DSPy 是一个 LLM 框架，专门设计用于以编程方式改进你的 LLM 的提示和签名。本文将探讨如何使用 DSPy 提高一个AI代理的性能。
- Author: admin
- Tags: LIBRARY, AGENT, DSPY, AUTO-ANALYST, LLM, #Import 2026-10-14 14:41

我一直在研究一种叫做[Auto-Analyst](https://firebirdtech.substack.com/p/auto-analyst-20-the-ai-data-analytics?source=post%5Fpage-----b9e5e15c9d3c--------------------------------)的东西，这是一个包含4个活动代理的数据分析系统。我给了他们一个开始的初始提示，但他们的表现可能时好时坏——有时他们做得很好，有时则不然。

在这篇文章中，我将探讨如何使用 DSPy 提高其中一个代理的性能。DSPy 是一个 LLM 框架，专门设计用于以编程方式改进你的 LLM 的提示和签名。因此，你可以在不更改 LLM 的情况下获得更好的性能。

## 1、Auto-Analyst代理概述

在 Auto-Analyst 系统中，有四个代理，每个代理都有特定的角色：

- 数据预处理代理
- 统计分析代理
- 机器学习代理。
- 数据可视化代理。

在这篇文章中，我将分享我如何提高第二个代理（即“统计分析代理”）的性能。顾名思义，这个代理接受用户查询并将其转换为 Python 代码以进行统计分析。它专为与 statsmodels 库配合使用而构建，该库是 Python 中最受欢迎的统计编程库之一。

注意：此过程可以推广到使用 DSPy 构建的任何 LLM 程序！

## 1、初始签名和提示

你可以在下面看到代理的 DSPy 签名和提示。

```
class statistical_analytics_agent(dspy.Signature):
    # Statistical Analysis Agent, builds statistical models using StatsModel Package
    """ 
You are a statistical analytics agent. Your task is to take a dataset and a user-defined goal and output Python code that performs the appropriate statistical analysis to achieve that goal. Follow these guidelines:

Data Handling:

    Always handle strings as categorical variables in a regression using statsmodels C(string_column).
    Do not change the index of the DataFrame.
    Convert X and y into float when fitting a model.
    Like this X.astype(float), y.astype(float)
Error Handling:

    Always check for missing values and handle them appropriately.
    Ensure that categorical variables are correctly processed.
    Provide clear error messages if the model fitting fails.
Regression:

    For regression, use statsmodels and ensure that a constant term is added to the predictor using sm.add_constant(X).

Seasonal Decomposition:

    Ensure the period is set correctly when performing seasonal decomposition.
    Verify the number of observations works for the decomposition.
Output:

    Ensure the code is executable and as intended.
    Also choose the correct type of model for the problem
    Avoid adding data visualization code.

    """
    dataset = dspy.InputField(desc="Available datasets loaded in the system, use this df,columns  set df as copy of df")
    goal = dspy.InputField(desc="The user defined goal for the analysis to be performed")
    code = dspy.OutputField(desc ="The code that does the statistical analysis using statsmodel")
    commentary = dspy.OutputField(desc="The comments about what analysis is being performed")
```

它接收用户查询（目标）和数据集信息，输出代码和注释（关于代码功能的文本信息）。

上述提示大部分是我手动创建的，稍后我将在文章中展示 DSPy 生成的改进提示。

## 2、创建评估数据集

DSPy 优化的一个重要组成部分是拥有一组查询，你可以使用它们来构建训练和验证管道。

第一步是让 LLM 向你提出用于评估的代理问题。你需要告诉 LLM 代理做什么、它需要什么输入以及你希望代理收到什么样的查询。最好在代码中简化这一点，但使用 ChatGPT 界面很容易展示。

![](https://www.hubwiz.com/blog/content/images/2024/11/image-418.png)

为了有效地评估你的 AI 系统，你的测试数据集应该包括用户可能问的大多数问题。由于代理使用 CSV 文件（这将与你的评估数据集不同），因此为各种 CSV 文件创建评估问题是个好主意。

如果你的 AI 代理是实时的并且具有聊天界面，那么跟踪它正确回答了哪些问题以及没有回答哪些问题会很有帮助。然后，你可以围绕这些查询构建评估流程。要扩展你的评估数据，你可以使用语言模型 (LLM) 来生成同一问题的不同变体。这有助于创建一组更广泛的评估测试用例。

![](https://www.hubwiz.com/blog/content/images/2024/11/image-419.png)

创建的评估数据框的图像

构建评估数据集的最后一步是添加正确或预期的响应列。你可能需要一个人参与才能获得正确或预期的答案。对于这个代理，我检查了生成的响应，修复了所有错误，并亲自检查了代码是否正确回答了查询；如果没有，我添加了正确的版本。

## 3、设计指标

我们如何判断代理的响应是否良好？要弄清楚这一点，我们需要一种方法来衡量其性能。你可以根据需要创建特定指标，也可以使用现有指标，如余弦相似度（可以测量生成的响应和预期响应之间的语义相似性）。对于统计分析代理，指标应该能够执行以下操作：

- 检查代码是否运行
- 检查代码是否按照用户意图执行

第一个很容易测量，只需运行代理生成的代码即可。第二个比较棘手，因为用户查询可能不明确。无论我们如何测量第二部分，它都会不完美或有偏差。在这种情况下，我们应该寻找大多数用户的喜好或他们如何编写查询。

![](https://www.hubwiz.com/blog/content/images/2024/11/image-420.png)

设计指标的逻辑

此指标的分数可以是 0、50、75 或 100。使用语言模型 (LLM) 测试“数据处理”和“相关性”分数，以查看它是否正确检查了响应中的数据类型。这包括确保正确完成任何必要的数据类型转换。

通常 DSPy 示例的指标小于 1，因此在指标的最后将分数除以 100。

## 4、提示优化如何工作？

在本节中，我将解释提示优化背后的高级思想。

如需更多资源，可以查看[ Michael Ryan](https://x.com/michaelryan207/media?ref=hubwiz.com)（他是 DSPy 的研究生之一）的作品。

首先，将评估训练数据（包括查询和其他输入）输入到学生语言模型 (LM) 程序中。学生会获得你设置的起始提示和说明。模型会处理查询，并使用指标对其性能进行评分。根据学生的表现，教师/讲师 LM 程序会为学生创建新的说明。然后，学生使用这些更新的说明，这个过程会重复几次。最后，您会得到一组根据你的指标表现最佳的说明。

只要指标和训练数据能够准确地建模和表示你希望 LM 程序解决的问题，这将比简单的反复试验或随机猜测产生更好的提示。

这是对优化算法工作原理的广泛概述。以下是 DSPy 中可用的关键算法的细分：

- LabeledFewShot：此方法从标记的输入和输出数据创建一些示例（称为演示）。您只需指定所需的示例数量 (k)，它就会从训练集中随机挑选 k 个示例。
- BootstrapFewShot：它使用“教师”模块（可以是您的程序）为程序的每个阶段创建完整的演示，以及来自训练集的标记示例。您可以控制从训练集中挑选多少个演示（max\_labeled\_demos）以及教师应创建多少个新演示（max\_bootstrapped\_demos）。只有满足特定性能指标的演示才会包含在最终集合中。高级用户还可以使用不同的 DSPy 程序作为教师来完成更复杂的任务。
- BootstrapFewShotWithRandomSearch：此方法多次运行 BootstrapFewShot，尝试不同的随机演示组合并根据优化选择最佳程序。它使用与 BootstrapFewShot 相同的设置，并带有一个额外的参数（num\_candidate\_programs），该参数定义将评估多少个随机程序。
- BootstrapFewShotWithOptuna：此版本的 BootstrapFewShot 使用 Optuna 优化工具来测试不同的演示集，运行试验以最大化性能指标并选择最佳的演示集。
- KNNFewShot：此方法使用 k-Nearest Neighbors 算法来查找给定输入的最接近匹配的训练示例。然后将这些类似的示例用作 BootstrapFewShot 优化的训练集。
- COPRO：此方法使用称为坐标上升（类似于爬山）的优化技术为流程的每个步骤创建和改进指令。它根据度量函数和训练集不断调整指令。参数“深度”控制优化器将运行多少轮改进。
- MIPRO/MIPROv2：此方法在每个步骤生成指令和示例。使用已有的数据和示例是明智的。它使用贝叶斯优化来有效地搜索程序不同部分中的可能指令和示例。MIPROv2 更高效，因为它执行速度更快，成本更低。

## 5、结束语

本节将显示“statistical\_analytics\_agent”的得分和优化指令的结果。用于此的优化器是 BootstrapFewShotWithRandomSearch 和 COPRO。第一个会找到优化的少样本示例以添加到提示中。COPRO 会找到效果最佳的优化指令字符串。用于教学的 LM 是 gpt-4o-mini。

之所以选择这些而不是 MIPRO，是因为有人建议你应该有 100-200 个训练集来使用 MIPRO，而在这个例子中，我只使用了 30-40 个示例训练集。

未编译版本在指标上的表现为 66.7。以下是由于 BootstrapFewShotWithRandomSearch (BFSRS) 带来的性能改进：

![](https://www.hubwiz.com/blog/content/images/2024/11/image-421.png)

BFSRS 的 4 个步骤的 LangWatch 图，最高得分为 79.17（性能提高了 20%）

BFSRS 优化使训练数据增加了 20%。这些是它为提示生成的几个镜头示例：

![](https://www.hubwiz.com/blog/content/images/2024/11/image-422.png)

BFSRS 添加到提示中的几个 FewShot 演示示例

![](https://www.hubwiz.com/blog/content/images/2024/11/image-423.png)

另一个添加到提示中的示例

现在让我们分析 COPRO，它将使用优化的指令字符串，而不是示例。

![](https://www.hubwiz.com/blog/content/images/2024/11/image-424.png)

这是 COPRO 的指标评分，最高分为 75.83 或 16% 的改进‌‌这是 COPRO 建议的指令字符串

![](https://www.hubwiz.com/blog/content/images/2024/11/image-426.png)

这些是建议的指令字符串：

![](https://www.hubwiz.com/blog/content/images/2024/11/image-427.png)

这些是 COPRO 提出的优化签名

---

原文链接：[How to improve AI agent(s) using DSPy](https://medium.com/firebird-technologies/how-to-improve-ai-agent-s-using-dspy-b9e5e15c9d3c?ref=hubwiz.com)

汇智网翻译整理，转载请标明出处