在人工智能和自然语言处理领域,大型语言模型(LLM)的兴起为各行各业带来了巨大变革。然而,如何有效地评估和优化这些模型的输出一直是一个挑战。为了解决这个问题,来自哈佛大学人机交互实验室的研究人员开发了ChainForge - 一个开源的可视化工具包,旨在简化提示词工程及评估测试的过程。

核心功能

ChainForge 的设计理念是提升提示工程和 LLM 评估的直观性和效率。其主要功能包括:

  • 多模型同时查询:用户可以同时向多个大模型发送请求,快速对比不同模型的效果。

  • 跨模型比较:支持在不同提示排列、模型和模型设置之间比较响应质量,帮助用户为特定用例选择最佳提示词和模型。

  • 评估指标设置:用户可以设置评估的函数,并支持可视化展示评估结果。

  • 多会话管理:支持跨模板参数和聊天模型进行多个对话,用户不仅可以模板化提示,还可以模板化后续的聊天消息。

  • 可视化分析:提供直观的可视化工具,如用于数值指标的分组箱线图和用于布尔指标的直方图,帮助用户更好地理解评估结果。

安装方法

推荐在python venv虚拟环境中安装.

pip install chainforge

启动方式:

执行 chainforge serve
Serving Flask server on localhost on port 8000...
* Serving Flask app 'chainforge.flask_app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://localhost:8000

然后在 Chrome、Firefox或Edge 浏览器中打开 http://localhost:8000

添加千帆大模型

import os
import qianfan
import json
from chainforge.providers import provider

os.environ["QIANFAN_ACCESS_KEY"] = ""
os.environ["QIANFAN_SECRET_KEY"] = ""

COHERE_SETTINGS_SCHEMA = {
    "settings": {
        "temperature": {
            "type": "number",
            "title": "temperature",
            "description": "温度.",
            "default": 0.80,
            "minimum": 0,
            "maximum": 1.0,
            "multipleOf": 0.01,
        },
        "system": {
            "type": "string",
            "title": "system",
            "description": "系统人设.",
            "default": "",
        },
        "disable_search": {
            "type": "boolean",
            "title": "disable_search",
            "description": "是否强制关闭实时搜索功能.",
            "default": True,
        },
    },
    "ui": {
        "temperature": {
            "ui:help": "Defaults to 0.80. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定",
            "ui:widget": "range"
        },
        "system": {
            "ui:widget": "textarea"
        },
        "disable_search": {
            "ui:widget": "radio"
        }
    }
}

@provider(name="QIANFAN",
          emoji="🖇", 
          models=list(qianfan.ChatCompletion().models()),
          settings_schema=COHERE_SETTINGS_SCHEMA,
          )
def QianfanCompletion(prompt: str, model: str, chat_history=None, temperature: float = 0.80, **kwargs) -> str:
    chat_comp = qianfan.ChatCompletion()
    print(f"Calling qianfan model {model} with prompt '{prompt}'...")
    messages = []
    if chat_history:    
        for item in chat_history:
            role = item['role']
            content = item['content']
            if role != 'user':
                content = json.loads(content.lstrip('\\').replace('\\{', '{').replace('\\}', '}')).get('result')
            messages.append({"role": role, "content": content})
    messages.append({"role": "user", "content": prompt})
    print(f"messages: {messages}")
    resp = chat_comp.do(model=model, messages=messages, temperature=temperature, **kwargs)
    result = resp['body']
    # 格式化历史消息,一并输出到结果中
    last_text = [f"{'user' if item['role'] == 'user' else model}: {item['content']}" for item in messages]
    result['history'] = '\n\n'.join(last_text) + f"\n\n{model}: {resp['body']['result']}"
    return json.dumps(result, ensure_ascii=False)

上述python内容保存为文件拖入即可

快速使用

Chainforge可以很方便的通过可视化的方法编辑工作流

示例:对比ERNIE3.5和ERNIE 4.0在同一提示词场景下的效果

主要支持的节点如下:

  • Tabular Data Node

支持导入excel文件进行批量测试,选择对应的列作为参数传入到prompt中

  • TextFields Node

文本输入,支持同时输入多个文本内容传入到prompt

  • Prompt Node

提示词节点,提示词支持变量,变量使用{}表示,如果提示词中{}需要转义,使用 \ 即可

可以选择多个模板同时执行

运行完成后,点击Inspect responses 即可查看结果

  • Inspect Node

查看结果,支持手动标注结果及导出execl

Processor Node

代码处理节点,支持编写代码对输入输出进行处理,例如对response提取指定参数等

示例:对响应内容的格式进行处理,只提取结果等。

Evaluator Node

评估节点,支持编写JS、Python代码执行对比评估,可以根据自身需求定制评估函数,例如相似度计算、格式校验等等,代码也是本地环境中执行,可以按需在自己的环境中安装第三方库。

示例:对输出的文本长度进行比较,可以很直观的对比不同模型的表现。

更多使用方法可以参考https://chainforge.ai/docs/

如果您有大模型相关的培训/调优需求,欢迎随时私信联系。