以下提供两种常见方式,将 LlamaIndex 与 Comet 集成,用于记录提示词、输出、性能与工件。
一、使用 comet-llm 记录 LLM 提示与输出
- 适用场景:快速记录每次调用的 prompt、输出与相关元数据,不侵入 LlamaIndex 内部。
- 步骤:
1) 安装依赖
pip install llama-index comet-llm comet-ml openai tiktoken
2) 设置环境变量
- COMET_API_KEY=你的API密钥
- 可选:COMET_WORKSPACE=你的工作区;COMET_PROJECT_NAME=项目名
3) 在代码中接入 comet-llm 并记录调用
示例(以 OpenAI 为 LLM,LlamaIndex 最新 Settings API 为例):
```
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
import comet_llm
from comet_ml import Experiment
# 初始化 Comet 实验(用于记录参数、指标、工件)
experiment = Experiment(
project_name=os.getenv("COMET_PROJECT_NAME", "llamaindex-comet"),
workspace=os.getenv("COMET_WORKSPACE"),
)
# 配置 LLM 与 Embedding
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 记录全局参数
experiment.log_parameters({
"llm_model": "gpt-4o-mini",
"embed_model": "text-embedding-3-small",
"temperature": 0,
})
# 构建索引
docs = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(docs)
query_engine = index.as_query_engine()
question = "给我一个文档的简要摘要,并列出三条要点。"
# 使用 comet-llm 记录 prompt(可附带输入与元数据)
comet_llm.log_prompt(
prompt=question,
inputs={"task": "summarize_with_bullets"},
metadata={"llm_model": "gpt-4o-mini"},
tags=["llamaindex", "query"],
)
# 执行查询并记录输出
response = query_engine.query(question)
comet_llm.log_output(
output=str(response),
metadata={"llm_model": "gpt-4o-mini"},
tags=["llamaindex", "response"],
)
# 记录简单指标(如响应长度)
experiment.log_metric("response_length_chars", len(str(response)))
# 持久化索引并作为工件上传
storage_dir = "./storage"
index.storage_context.persist(persist_dir=storage_dir)
experiment.log_asset_folder(storage_dir, recursive=True)
```
- 说明:
- comet_llm.log_prompt/log_output 可在任意调用点使用;若你的调用链较复杂,可在每次 LLM 调用前后进行记录。
- 若采用非 OpenAI LLM,同样可以记录 prompt 与输出;模型名与参数通过 metadata 统一传入。
二、结合 LlamaIndex 回调统计与 comet-ml 指标记录
- 适用场景:需要记录令牌用量、耗时、检索行为等过程指标。
- 步骤:
1) 安装依赖同上。
2) 使用 LlamaIndex 的回调组件统计指标,再将结果写入 Comet:
```
import time
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.callbacks import CallbackManager, TokenCountingHandler, LlamaDebugHandler
from comet_ml import Experiment
experiment = Experiment(project_name="llamaindex-comet")
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 令牌统计与调试回调
token_handler = TokenCountingHandler()
debug_handler = LlamaDebugHandler()
Settings.callback_manager = CallbackManager(handlers=[token_handler, debug_handler])
docs = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(docs)
qe = index.as_query_engine()
question = "总结数据集的关键信息,并提供参考段落。"
start = time.time()
resp = qe.query(question)
latency = time.time() - start
# 记录基础指标
experiment.log_metric("latency_seconds", latency)
# 记录令牌统计(不同版本的 TokenCountingHandler 字段名可能略有差异,常见示例如下)
# 如遇属性名不一致,可选择性记录可用字段
for name in dir(token_handler):
if name.startswith("total") and isinstance(getattr(token_handler, name), (int, float)):
experiment.log_metric(name, getattr(token_handler, name))
experiment.log_other("question", question)
experiment.log_text(str(resp), metadata={"label": "response"})
```
- 拓展建议:
- 批量评估:将一组查询与参考答案循环执行,使用 experiment.log_metric/experiment.log_table 记录质量指标(如 BLEU、ROUGE、自定义评分)。
- 成本与用量:若有不同模型的价格表,可在回调或查询后自行计算成本,并通过 experiment.log_metric("cost_usd", value) 记录。
- 生产化:将 COMET_API_KEY 写入安全的环境变量或密钥管理服务;为不同环境(dev/staging/prod)设置不同的 COMET_PROJECT_NAME。
- 审计与复现:使用 experiment.log_parameters 统一记录模型版本、温度、top_p、索引构建参数与数据快照,确保可追溯。
常见问题排查
- 未看到任何日志:检查 COMET_API_KEY、workspace/project 是否正确;确认网络连通;本地防火墙或代理是否阻止上传。
- 令牌统计为空或字段不匹配:LlamaIndex 版本差异可能导致属性名不同,建议打印 token_handler.__dict__ 或 dir(token_handler) 找到可用统计字段并逐一记录。
- 模型切换:更换为其他 LLM 或 embedding 提供方时,维持 comet-llm 的 log_prompt/log_output 与 comet-ml 的指标记录逻辑即可,无需变更 Comet 侧配置。
CometAPI 提供一个与 OpenAI 兼容的单一网关,可访问众多模型(GPT-family、Anthropic/Claude、Google Gemini 等)。 LlamaIndex (该“数据框架”