diff --git a/backend/rag_1/notebook.ipynb b/backend/rag_1/notebook.ipynb index d32ccc4..a45ad21 100644 --- a/backend/rag_1/notebook.ipynb +++ b/backend/rag_1/notebook.ipynb @@ -69,6 +69,7 @@ "from pathlib import Path\n", "\n", "from hydra import compose, initialize\n", + "from langfuse.callback import CallbackHandler\n", "\n", "from backend.rag_1.chain import get_chain\n", "from backend.rag_1.config import validate_config\n", @@ -96,7 +97,15 @@ "outputs": [], "source": [ "N_DISPLAY = 5\n", - "TAGS = [\"multimodal-1\"]" + "TAGS = [\"multimodal-1\"]\n", + "\n", + "# Initialize Langfuse handler\n", + "lf_handler = CallbackHandler(\n", + " secret_key=os.getenv(\"LANGFUSE_SECRET_KEY\"),\n", + " public_key=os.getenv(\"LANGFUSE_PUBLIC_KEY\"),\n", + " host=os.getenv(\"LANGFUSE_HOST\"),\n", + " tags=[\"multimodal-1\"],\n", + ")" ] }, { @@ -389,7 +398,7 @@ " \"\"\"\n", " for chunk in chain.stream(\n", " question,\n", - " config={\"run_name\": \"RAG\", \"tags\": TAGS},\n", + " config={\"run_name\": \"RAG\", \"callbacks\": [lf_handler]},\n", " ):\n", " print(chunk, end=\"\", flush=True)\n", "\n", diff --git a/backend/rag_2/notebook.ipynb b/backend/rag_2/notebook.ipynb index 8433d66..cc9c07c 100644 --- a/backend/rag_2/notebook.ipynb +++ b/backend/rag_2/notebook.ipynb @@ -70,6 +70,7 @@ "from pathlib import Path\n", "\n", "from hydra import compose, initialize\n", + "from langfuse.callback import CallbackHandler\n", "\n", "from backend.rag_2 import prompts\n", "from backend.rag_2.chain import get_chain\n", @@ -103,7 +104,15 @@ "outputs": [], "source": [ "N_DISPLAY = 5\n", - "TAGS = [\"multimodal-2\"]" + "TAGS = [\"multimodal-2\"]\n", + "\n", + "# Initialize Langfuse handler\n", + "lf_handler = CallbackHandler(\n", + " secret_key=os.getenv(\"LANGFUSE_SECRET_KEY\"),\n", + " public_key=os.getenv(\"LANGFUSE_PUBLIC_KEY\"),\n", + " host=os.getenv(\"LANGFUSE_HOST\"),\n", + " tags=[\"multimodal-1\"],\n", + ")" ] }, { @@ -297,7 +306,7 @@ " text_list=texts,\n", " config=config,\n", " prompt_template=prompts.TEXT_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for text in texts[:N_DISPLAY]:\n", " display(text)" @@ -314,7 +323,7 @@ " table_list=tables,\n", " config=config,\n", " prompt_template=prompts.TABLE_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for table in tables[:N_DISPLAY]:\n", " display(table)" @@ -331,7 +340,7 @@ " image_list=images,\n", " config=config,\n", " prompt_template=prompts.IMAGE_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for image in images[:N_DISPLAY]:\n", " display(image)" @@ -460,7 +469,7 @@ " \"\"\"\n", " for chunk in chain.stream(\n", " question,\n", - " config={\"run_name\": \"RAG\", \"tags\": TAGS},\n", + " config={\"run_name\": \"RAG\", \"tags\": TAGS, \"callbacks\": [lf_handler]},\n", " ):\n", " print(chunk, end=\"\", flush=True)\n", "\n", diff --git a/backend/rag_3/notebook.ipynb b/backend/rag_3/notebook.ipynb index 32dcf35..7317f98 100644 --- a/backend/rag_3/notebook.ipynb +++ b/backend/rag_3/notebook.ipynb @@ -70,6 +70,7 @@ "from pathlib import Path\n", "\n", "from hydra import compose, initialize\n", + "from langfuse.callback import CallbackHandler\n", "\n", "from backend.rag_3 import prompts\n", "from backend.rag_3.chain import get_chain\n", @@ -103,7 +104,15 @@ "outputs": [], "source": [ "N_DISPLAY = 5\n", - "TAGS = [\"multimodal-3\"]" + "TAGS = [\"multimodal-3\"]\n", + "\n", + "# Initialize Langfuse handler\n", + "lf_handler = CallbackHandler(\n", + " secret_key=os.getenv(\"LANGFUSE_SECRET_KEY\"),\n", + " public_key=os.getenv(\"LANGFUSE_PUBLIC_KEY\"),\n", + " host=os.getenv(\"LANGFUSE_HOST\"),\n", + " tags=[\"multimodal-1\"],\n", + ")" ] }, { @@ -300,7 +309,7 @@ " text_list=texts,\n", " config=config,\n", " prompt_template=prompts.TEXT_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for text in texts[:N_DISPLAY]:\n", " display(text)" @@ -317,7 +326,7 @@ " table_list=tables,\n", " config=config,\n", " prompt_template=prompts.TABLE_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for table in tables[:N_DISPLAY]:\n", " display(table)" @@ -334,7 +343,7 @@ " image_list=images,\n", " config=config,\n", " prompt_template=prompts.IMAGE_SUMMARIZATION_PROMPT,\n", - " chain_config={\"tags\": TAGS},\n", + " chain_config={\"tags\": TAGS, \"callbacks\": [lf_handler]},\n", ")\n", "for image in images[:N_DISPLAY]:\n", " display(image)" @@ -463,7 +472,7 @@ " \"\"\"\n", " for chunk in chain.stream(\n", " question,\n", - " config={\"run_name\": \"RAG\", \"tags\": TAGS},\n", + " config={\"run_name\": \"RAG\", \"tags\": TAGS, \"callbacks\": [lf_handler]},\n", " ):\n", " print(chunk, end=\"\", flush=True)\n", "\n", diff --git a/poetry.lock b/poetry.lock index 96e11de..61d72c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1831,13 +1831,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -2438,6 +2438,30 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "langfuse" +version = "2.28.1" +description = "A client library for accessing langfuse" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langfuse-2.28.1-py3-none-any.whl", hash = "sha256:7a2012569b933cb6fa3c9f6f1d5cb84405baf977f3e8a940e4e65a13d24c20b3"}, + {file = "langfuse-2.28.1.tar.gz", hash = "sha256:269605e1310c85d4facce8fea76e60f84a638c3607db66dfc8c089199de67202"}, +] + +[package.dependencies] +backoff = ">=1.10.0" +httpx = ">=0.15.4,<1.0" +idna = ">=3.7,<4.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1.10.7,<3.0" +wrapt = ">=1.14,<2.0" + +[package.extras] +langchain = ["langchain (>=0.0.309)"] +llama-index = ["llama-index (>=0.10.12,<2.0.0)"] +openai = ["openai (>=0.27.8)"] + [[package]] name = "langserve" version = "0.0.46" @@ -7264,4 +7288,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "4dc358249cd65e9ff35e4b0c406b2ecec4a80b6435d39dd88d985fb725923b65" +content-hash = "a1a625c3d49968bdf26eca8d4511d9f20e9550f8cd4be17b9c047845852d8850" diff --git a/pyproject.toml b/pyproject.toml index dbc19a6..f833249 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ ipython = "^8.22.2" langchain = "^0.1.11" langchain-experimental = "^0.0.53" langchain-openai = "^0.0.8" +langfuse = "^2.28.1" langserve = "^0.0.46" open-clip-torch = "^2.24.0" openai = "^1.13.3" diff --git a/template.env b/template.env index 129efc5..3e7cccd 100644 --- a/template.env +++ b/template.env @@ -4,9 +4,9 @@ VISION_OPENAI_API_KEY="" TEXT_OPENAI_ENDPOINT="https://genai-ds.openai.azure.com/" TEXT_OPENAI_API_KEY="" -LANGCHAIN_TRACING_V2=true -LANGCHAIN_API_KEY="" -LANGCHAIN_PROJECT="rag-multimodal-demo" +LANGFUSE_SECRET_KEY="" +LANGFUSE_PUBLIC_KEY="" +LANGFUSE_HOST="" EMBEDDING_OPENAI_ENDPOINT="https://genai-ds.openai.azure.com/" EMBEDDING_OPENAI_API_KEY=""