llama_index [Bug]:使用Langfuse进行追踪

e4yzc0pl  于 2个月前  发布在  其他
关注(0)|答案(6)|浏览(36)

Bug描述

在进行API调用时,当使用langfuse跟踪回调时,只有在重新使用API调用初始化引擎/索引时才能正常工作。
在这种情况下可以正常工作:

def stream_generator(generator: Generator) -> Generator[str, Any, None]:
    yield from (json.dumps({"type": "content_block", "text": text}) for text in generator)

@router.post("/chat")
async def chat(request: ChatRequestBody):
    langfuse_callback_handler.set_trace_params(tags=tags)

    client = qdrant_client.QdrantClient(...)
    vector_store = QdrantVectorStore(client=client, ...)
    index = VectorStoreIndex.from_vector_store(vector_store=vector_store)

    engine = index.as_chat_engine(
        chat_mode="condense_plus_context",
        streaming=True,
        system_prompt=SYSTEM_PROMPT,
    )
    response_stream = engine.stream_chat(request.message, chat_history=request.history)
    return StreamingResponse(stream_generator(response_stream), media_type="application/x-ndjson")

版本

0.10.47

重现步骤

无法正常工作

client = qdrant_client.QdrantClient(...)
vector_store = QdrantVectorStore(client=client, ...)
index = VectorStoreIndex.from_vector_store(vector_store=vector_store)

engine = index.as_chat_engine(
    chat_mode="condense_plus_context",
    streaming=True,
    system_prompt=SYSTEM_PROMPT,
)

def stream_generator(generator: Generator) -> Generator[str, Any, None]:
    yield from (json.dumps({"type": "content_block", "text": text}) for text in generator)

@router.post("/chat")
async def chat(request: ChatRequestBody):
    langfuse_callback_handler.set_trace_params(tags=tags)

    response_stream = engine.stream_chat(request.message, chat_history=request.history)
    return StreamingResponse(stream_generator(response_stream), media_type="application/x-ndjson")

相关日志/跟踪信息

  • 无响应*
sz81bmfz

sz81bmfz1#

Langfuse跟踪回调仅在每次API调用时重新初始化引擎和索引时才能正常工作,因为Langfuse SDKs在后台将队列和批处理事件以减少网络请求并提高整体性能。为了确保捕获并将所有排队的事件发送到Langfuse服务器,回调处理器需要刷新。每次API调用时重新初始化引擎和索引可以确保回调处理器正确设置并刷新,捕获所有必要的跟踪和指标。
要解决这个问题而不在每次API调用时重新初始化引擎和索引,您可以在每个请求结束时手动刷新回调处理器。以下是如何修改代码以包含刷新操作的示例:

def stream_generator(generator: Generator) -> Generator[str, Any, None]:
    yield from (json.dumps({"type": "content_block", "text": text}) for text in generator)

client = qdrant_client.QdrantClient(...)
vector_store = QdrantVectorStore(client=client, ...)
index = VectorStoreIndex.from_vector_store(vector_store=vector_store)

engine = index.as_chat_engine(
    chat_mode="condense_plus_context",
    streaming=True,
    system_prompt=SYSTEM_PROMPT,
)

@router.post("/chat")
async def chat(request: ChatRequestBody):
    langfuse_callback_handler.set_trace_params(tags=tags)

    response_stream = engine.stream_chat(request.message, chat_history=request.history)
    
    # Ensure all events are flushed to Langfuse
    langfuse_callback_handler.flush()
    
    return StreamingResponse(stream_generator(response_stream), media_type="application/x-ndjson")

通过在请求末尾添加 langfuse_callback_handler.flush() ,您可以确保将所有排队的事件发送到Langfuse服务器,而无需每次API调用时重新初始化引擎和索引 1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/callbacks/LangfuseCallbackHandler.ipynb)。

  • 要继续与 Dosu 对话,请提及 @dosu.*
wdebmtf2

wdebmtf22#

@dosu 我已经尝试了langfuse_callback_handler.flush(),但它不起作用。

h7wcgrx3

h7wcgrx33#

要解决Langfuse跟踪回调功能未按预期工作的问题,即使在使用langfuse_callback_handler.flush()后,请确保您已正确设置并注册了LangfuseCallbackHandler。以下是基于提供的文档的检查清单:

  1. 安装所需软件包 :
%pip install llama-index llama-index-callbacks-langfuse
  1. 配置环境变量 :
import os

# Langfuse
os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-..."
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-..."
os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com"  # 🇪🇺 EU region, 🇺🇸 US region: "https://us.cloud.langfuse.com"

# OpenAI
os.environ["OPENAI_API_KEY"] = "sk-..."
  • 注册Langfuse回调处理程序 :
  • 选项1:设置全局LlamaIndex处理程序
from llama_index.core import global_handler, set_global_handler

set_global_handler("langfuse")
langfuse_callback_handler = global_handler
  • 选项2:直接使用Langfuse回调
from llama_index.core import Settings
from llama_index.core.callbacks import CallbackManager
from langfuse.llama_index import LlamaIndexCallbackHandler

langfuse_callback_handler = LlamaIndexCallbackHandler()
Settings.callback_manager = CallbackManager([langfuse_callback_handler])
  • 将事件刷新到Langfuse :
# ... your LlamaIndex calls here ...

langfuse_callback_handler.flush()

确保所有这些步骤都正确执行。如果问题仍然存在,请仔细检查您的API密钥和与Langfuse服务器的网络连接。

  • 要继续与1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/callbacks/LangfuseCallbackHandler.ipynb)进行对话,请提及@dosu。*
vmdwslir

vmdwslir4#

langfuse_callback_handler.set_trace_params(tags=tags) -- 这不能改变已经附加到内存中现有对象的回调函数
第二个流程不起作用的原因是,你已经有了内存中的对象,我们无法使用更新后的参数来改变它们附加的回调函数。

4dc9hkyq

4dc9hkyq5#

对于像为多个用户提供聊天机器人这样的用户案例,以及在项目中使用LLM的不同API。如何管理langfuse的跟踪以便根据用户ID过滤它们?

最好的方法是什么?

其次,在另一个项目中,我正在使用langfuse,这是为OpenAIAgents设计的,在那里我可以根据不同的用户ID查看跟踪信息。

尽管在这里,我也无法查看函数调用日志,我认为这是因为我没有在每次API调用时重新定义代理。

blpfk2vs

blpfk2vs6#

我们正在进行用户界面(UX)的工作,但是为多个用户设置并不可行,除非每次都设置好所有内容。
不确定第二件事。

相关问题