llama_index [Bug]: LlamaIndexInstrumentor在BaseEmbeddings.get_text_embedding_batch中无法正常工作,

9rnv2umw  于 23天前  发布在  其他
关注(0)|答案(3)|浏览(18)

错误描述

我想为将数据加载到VectorStoreIndex中添加可观察性。遵循文档中的仪器化和使用Arize Phoenix进行可观察性的说明,只有生成的最后一个Embeddings批次被跟踪。当我查看属性选项卡时,所有块都显示在输入字段中。如何正确跟踪在创建索引期间创建的所有Embeddings?

版本

0.10.65

重现步骤

按照设置可观察性的说明进行操作:https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex
使用SimpleDirectoryReader加载文档并从文档创建VectorStoreIndex。

相关日志/回溯

  • 无响应*
aemubtdh

aemubtdh1#

为了在使用Arize Phoenix进行可观察性时,正确跟踪使用LlamaIndexInstrumentorBaseEmbeddings.get_text_embedding_batch创建的所有嵌入,请确保EmbeddingStartEventEmbeddingEndEvent被正确分派,并且回调管理器的事件得到妥善处理。以下是相关代码片段,展示了如何实现这一点:


# 确保在生成嵌入之前为每个文本批次分派`EmbeddingStartEvent`,并在生成嵌入之后分派`EmbeddingEndEvent`

# 回调管理器的事件也得到了妥善处理,以跟踪有效载荷[[1]](https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/base/embeddings/base.py)
  • 要继续与Dosu交流,请提及@dosu。*
7gyucuyw

7gyucuyw2#

这并不能解决问题,它只是显示当前的实现,看起来似乎不起作用。

lymnna71

lymnna713#

要解决仅追踪最后一批生成的嵌入的问题,您应该确保 EmbeddingStartEventEmbeddingEndEvent 为每批正确分派,并且回调管理器已正确配置以处理这些事件。
以下是一些排查和可能解决此问题的方法:

  1. 验证调度器和回调管理器初始化:
    确保 dispatchercallback_manager 已正确初始化和配置。调度器应在模块级别设置,回调管理器应正确分配给 LLM 组件。
  2. 检查事件分派:
    确认 EmbeddingStartEventEmbeddingEndEvent 每批都分派。提供的代码片段应处理此问题,但您可能需要添加日志以验证这些事件是否按预期分派。
  3. 确保正确的事件处理:
    确保回调管理器正确处理事件。对于每个事件,应调用 on_event_starton_event_end 方法,并正确记录有效载荷。
    以下是带有额外日志的代码片段增强版本,以帮助调试问题:
@dispatcher.span
def get_text_embedding_batch(
    self,
    texts: List[str],
    show_progress: bool = False,
    **kwargs: Any,
) -> List[Embedding]:
    """Get a list of text embeddings, with batching."""
    cur_batch: List[str] = []
    result_embeddings: List[Embedding] = []

    queue_with_progress = enumerate(
        get_tqdm_iterable(texts, show_progress, "Generating embeddings")
    )
    model_dict = self.to_dict()
    model_dict.pop("api_key", None)
    for idx, text in queue_with_progress:
        cur_batch.append(text)
        if idx == len(texts) - 1 or len(cur_batch) == self.embed_batch_size:
            # flush
            print(f"Dispatching EmbeddingStartEvent for batch {cur_batch}")
            dispatcher.event(
                EmbeddingStartEvent(
                    model_dict=model_dict,
                )
            )
            with self.callback_manager.event(
                CBEventType.EMBEDDING,
                payload={EventPayload.SERIALIZED: self.to_dict()},
            ) as event:
                embeddings = self._get_text_embeddings(cur_batch)
                result_embeddings.extend(embeddings)
                event.on_end(
                    payload={
                        EventPayload.CHUNKS: cur_batch,
                        EventPayload.EMBEDDINGS: embeddings,
                    },
                )
            print(f"Dispatching EmbeddingEndEvent for batch {cur_batch}")
            dispatcher.event(
                EmbeddingEndEvent(
                    chunks=cur_batch,
                    embeddings=embeddings,
                )
            )
            cur_batch = []

    return result_embeddings

此代码在 EmbeddingStartEventEmbeddingEndEvent 分派时添加了 print 语句。这可以帮助您验证事件是否为每批分派。
此外,请确保与 Arize Phoenix 的集成已正确设置,并且事件正在捕获并发送到 Phoenix 服务器。如果问题仍然存在,您可能需要审查与 Arize Phoenix 的集成,以确保其正确配置以处理来自 LlamaIndex 1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/base/embeddings/base.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/instrumentation/dispatcher.py) 的事件。

  • 要继续与 Dosu 交谈,请提及 @dosu。*

相关问题