llama 博客

以下提供两种常见方式,将 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 侧配置。
Jan 6, 2026
CometAPI
LlamaIndex

以下提供两种常见方式,将 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 (该“数据框架”