promptfoo安装和demo使用

Promptfoo Hello World 快速入门指南

什么是 Promptfoo

Promptfoo 是一个强大的 LLM(大型语言模型)评测工具,可以帮助你:

  • 对比不同 prompt 的效果
  • 自动测试 prompt 质量
  • 支持多种 LLM 提供商(OpenAI、Anthropic、自定义 API 等)

环境要求

  • Node.js 18+
  • npm 或 yarn

安装步骤

1. 创建项目目录

bash 复制代码
mkdir promptfoo-demo && cd promptfoo-demo
npm init -y

2. 安装 promptfoo

bash 复制代码
npm install promptfoo --save-dev

提示: 如果使用私有 npm 仓库,确保仓库中已同步 promptfoo 包。

3. 验证安装

bash 复制代码
npx promptfoo --version

Hello World 搭建

1. 创建配置文件

在项目根目录创建 promptfooconfig.yaml

yaml 复制代码
prompts:
  - id: prompt_v1
    label: Prompt v1 (简洁版)
    raw: "{{input}}"

  - id: prompt_v2
    label: Prompt v2 (详细版)
    raw: |
      You are a helpful AI assistant. Please respond to the following request:
      {{input}}
      Follow the instructions above and provide a helpful response.

providers:
  # 使用 Python 自定义 Provider
  - id: python:./providers/custom_llm.py
    label: Custom LLM

tests:
  - name: greeting
    description: 测试问候功能
    providers:
      - python:./providers/custom_llm.py
    prompts:
      - prompt_v1
      - prompt_v2
    vars:
      input: Say hello to someone named Alice
    assert:
      - type: icontains
        value: hello
      - type: icontains
        value: alice

output:
  - type: table
    filename: results/table.html
  - type: json
    filename: results/output.json

2. 创建 Python 自定义 Provider

创建 providers/custom_llm.py

python 复制代码
"""
自定义 LLM Provider 示例
对接公司内部 LLM 服务
"""
import os
import requests

# 设置 NO_PROXY 避免代理问题
os.environ["NO_PROXY"] = "内部服务地址"
os.environ["no_proxy"] = "内部服务地址"

def call_api(prompt, options=None, context=None):
    """
    promptfoo Python Provider 入口函数

    Args:
        prompt: 渲染后的完整 prompt
        options: promptfoo 选项(如 temperature 等)
        context: 包含 vars 等的上下文

    Returns:
        包含 output 字段的字典
    """
    # 从环境变量或配置获取 LLM 服务地址
    endpoint = os.environ.get("LLM_ENDPOINT", "http://your-llm-service")
    timeout = int(os.environ.get("LLM_TIMEOUT", "300"))
    api_key = os.environ.get("LLM_API_KEY", "")

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {api_key}"
    }

    request_body = {
        "user": "promptfoo-user",
        "query": prompt,
        "response_mode": "blocking"
    }

    response = requests.post(
        endpoint,
        headers=headers,
        json=request_body,
        timeout=timeout
    )
    response.raise_for_status()

    # 返回包含 output 字段的字典(promptfoo 要求格式)
    return {"output": response.json().get("answer", "")}

3. 创建目录结构

bash 复制代码
mkdir -p providers results

4. 运行评测

bash 复制代码
npx promptfoo eval

5. 查看结果

bash 复制代码
npx promptfoo view

核心概念

Provider(提供商)

对接 LLM 服务的接口,可以是:

  • OpenAI、Anthropic 等云服务
  • 本地模型
  • 自定义 API(Python/JS 实现)

Prompt(提示词模板)

定义输入给 LLM 的模板,使用 {``{变量名}} 语法注入变量。

Tests(测试用例)

定义具体的测试场景,包含:

  • vars: 变量值
  • assert: 断言规则

断言类型

类型 说明
contains 包含指定文本(大小写敏感)
icontains 包含指定文本(大小写不敏感)
equals 完全相等
containsAny 包含任一关键词
regex 正则匹配

常见问题

1. Python Provider 加载失败

问题 : Cannot load module from xxx

解决: 确保配置使用文件路径:

yaml 复制代码
- id: python:./providers/custom_llm.py  # 使用相对路径

2. 返回格式错误

问题 : Cannot use 'in' operator to search for 'output'

解决 : Provider 必须返回包含 output 字段的字典:

python 复制代码
return {"output": "生成的文本"}

3. 断言匹配失败

问题: 测试状态为 FAIL

解决:

  • 使用 icontains 替代 contains(大小写不敏感)
  • 检查断言的 value 是否与 LLM 输出匹配
  • 注意 prompt 中的变量是否正确渲染

4. 内网访问 403 错误

问题: 访问内网服务时被代理拦截

解决: 在 Python 代码中设置 NO_PROXY:

python 复制代码
os.environ["NO_PROXY"] = "内部服务地址"
os.environ["no_proxy"] = "内部服务地址"

完整项目结构

复制代码
promptfoo-demo/
├── promptfooconfig.yaml    # 主配置文件
├── providers/
│   └── custom_llm.py       # 自定义 Provider
├── results/                # 测试结果输出目录
└── node_modules/

下一步

  • 添加更多测试用例
  • 尝试不同的断言规则
  • 对比多个 prompt 版本的效果
  • 集成 CI/CD 自动化测试

祝你在 Prompt Engineering 的道路上越走越远!

相关推荐
wang_yb9 小时前
用相关性分析消除“冗余特征”
ai·databook
阿文和她的Key10 小时前
GPT-5.6 降价后, API 账单的三层漏斗该怎么拆
人工智能·gpt·ai·chatgpt
thesky12345611 小时前
27届大模型岗面试准备(十四):多模态大模型 VLM——从视觉编码器到多模态推理的完整链路
人工智能·ai·大模型
一根数据线11 小时前
BIM建模效率低?试试和AI工具配合使用
人工智能·ai·3d建模·3d模型·bim·ai建模·造形家
lianboxinwen11 小时前
金融家装AI外呼自定义话术有哪些限制?
ai
ajassi200012 小时前
AI语音智能体开发日记(三)解决小程序配网中的蓝牙命名与MAC地址获取问题
ai·apache·ai编程
张永伟营销13 小时前
从SEO到GEO:技术人视角下的生成式引擎优化架构与实践
搜索引擎·ai·架构
烂蜻蜓13 小时前
AI入门教程(十):AI API开发:从“会用AI聊天”到“让AI在你的代码里干活”的完整指南
人工智能·ai
Elastic 中国社区官方博客13 小时前
Elastic 和 OpenAI 合作,将前沿智能引入非结构化企业数据
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
VIP_CQCRE14 小时前
用 Ace Data Cloud 快速接入 Suno 声音克隆 API:让 AI 音乐拥有专属声线
人工智能·ai·aigc·api·音乐生成