From ad5409cb9163c1f50c7f2c762902c5f6565bf3ab Mon Sep 17 00:00:00 2001 From: colegottdank Date: Tue, 24 Sep 2024 19:18:50 -0700 Subject: [PATCH 1/4] init --- .../replaying-llm-sessions/metadata.json | 10 + .../blog/blogs/replaying-llm-sessions/src.mdx | 264 ++++++++++++++++++ bifrost/app/blog/page.tsx | 5 + 3 files changed, 279 insertions(+) create mode 100644 bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json create mode 100644 bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json new file mode 100644 index 000000000..9ad1032f0 --- /dev/null +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json @@ -0,0 +1,10 @@ +{ + "title": "How to Replay LLM Sessions for Iterative Improvement with Helicone", + "title1": "Replay and Iterate on LLM Sessions Using Helicone", + "title2": "Replaying LLM Sessions for Improved Agent Workflows with Helicone", + "description": "Learn how to leverage Helicone to replay LLM sessions and iteratively improve your agent-based workflows. This guide walks through querying past sessions and replaying them with modifications to enhance performance.", + "images": "/static/blog/replaying-llm-sessions/cover.webp", + "time": "10 minute read", + "author": "Cole Gottdank", + "date": "September 24, 2024" +} diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx new file mode 100644 index 000000000..63a4e58d5 --- /dev/null +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx @@ -0,0 +1,264 @@ +Experimenting with prompts in isolation, disconnected from real workflows, offers limited benefits. To **truly understand how a prompt change impacts an entire session**, you need to apply the changes directly and replay the session. This reveals how modifications affect subsequent interactions and the entire flow, providing insights that isolated testing can't offer. + +In this guide, we'll **walk through the process** of setting up an initial session, querying Helicone for session data, and replaying the session with improvements. Along the way, we'll share insights on tailoring this approach to suit your unique use cases. + +--- + +## Replaying LLM Sessions + +Imagine running an AI agent that plans and executes tasks. Adjusting a single prompt might seem minor, but without **replaying the session**, you'd miss how that tweak alters the agent's decisions downstream. + +By replaying sessions with modified prompts, models, and parameters, you can observe the **real-world implications of your changes**. You'll see how the AI's responses evolve, how it interacts differently, and whether those changes align with your goals. This approach provides a powerful feedback loop for more informed iterations. + +### The Importance of Context + +**Testing prompts in isolation can be misleading**. A prompt that works well on its own might not integrate smoothly with the broader system. Conversely, a prompt that seems less effective in isolation could enhance the overall workflow when applied in context. + +By integrating prompt changes and replaying sessions, you capture the nuanced interplay between components. **You understand not just if a prompt works, but why it works within the system**. This leads to more effective optimizations and a deeper understanding of your AI's behavior. + +--- + +## Overview of the Replay Process With Helicone + +The process of replaying LLM sessions with Helicone involves three main steps: + +1. **Setting Up the Initial Session**: Instrument your LLM calls to include Helicone session metadata so that they can be tracked and logged. +2. **Querying Helicone for Session Data**: Use Helicone's API to retrieve the logs of past sessions that you want to replay. +3. **Replaying the Session with Modifications**: Programmatically modify the retrieved session data as needed and send requests to the LLM to observe the effects. + +Let's explore each of these steps in detail by following an example. + +--- + +# Example: Debate Session + +We'll walk through an example of a debate session between a user and an assistant. Between each argument, the assistant scores the user's argument from 1 to 10. + +## Step 1: Setting Up the Initial Session + +Before you can replay sessions, you need to log them properly in Helicone. By adding **only 3 headers** to your LLM API requests, you can tag and group them into sessions. + +_Read more about how to implement Helicone sessions [here](https://docs.helicone.ai/features/sessions)._ + +### Instrumenting Your LLM Calls + +1. **Set up the session headers** + + This session is for a debate on climate change. + + ```javascript + const sessionId = randomUUID(); + const sessionName = "AI Debate"; + const sessionPath = "/debate/climate-change"; + ``` + +2. **Initialize the conversation with the assistant** + + ```javascript + const conversation = [ + { + role: "system", + content: + "You're a debating professional. You're engaging in a structured debate with the user. Each of you will present arguments for or against the topic. Keep responses concise and to the point.", + }, + { + role: "assistant", + content: `Welcome to our debate! Today's topic is: "${topic}". I will argue in favor, and you will argue against. Please present your opening argument.`, + }, + ]; + ``` + +3. **Loop through the debate turns** + + ```javascript + while (true) { + // Get user's argument + const userArgument = await promptUser("Your argument: "); + conversation.push({ role: "user", content: userArgument }); + + // Score the user's argument + await evaluateArgument( + userArgument, + sessionId, + sessionName, + sessionPath, + "Your Argument" + ); + + // Assistant responds with a counter-argument + const assistantResponse = await generateAssistantResponse( + conversation, + sessionId, + sessionName, + sessionPath + ); + conversation.push(assistantResponse); + + // Score the assistant's argument + await evaluateArgument( + assistantResponse.content, + sessionId, + sessionName, + sessionPath, + "Assistant's Argument" + ); + + turn++; + } + ``` + + **Note:** The functions `promptUser`, `evaluateArgument`, and `generateAssistantResponse` handle user input, argument evaluation, and generating assistant responses, respectively. + +**After setting up and running your session through Helicone, you can view it in Helicone:** + +_Go fullscreen for the best experience._ + + + +## Step 2: Querying the Session Data from Helicone + +Read more about Helicone's API [here](https://docs.helicone.ai/rest/request/post-v1requestquery). + +```javascript +const response = await fetch("https://api.helicone.ai/v1/request/query", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${HELICONE_API_KEY}`, + }, + body: JSON.stringify({ + filter: { + properties: { + "Helicone-Session-Id": { + equals: SESSION_ID_TO_REPLAY, + }, + }, + }, + }), +}); +const data = await response.json(); +``` + +## Step 3: Processing and Modifying the Session Data + +Now that you have the session data, you'll need to process it. + +1. **Parse and sort the requests** + + **Sorting session data can be complex** because + each use case is unique and may require custom logic. For our debate session example, + we simply sort the requests by their `created_at` timestamp. + + ```javascript + const requests = data.data.map((request) => ({ + created_at: request.request_created_at, + session: request.request_properties["Helicone-Session-Id"], + signed_body_url: request.signed_body_url, + path: request.request_properties["Helicone-Session-Path"], + prompt_id: request.request_properties["Helicone-Prompt-Id"], + body: request.body, + })); + requests.sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); + ``` + +2. **Modify the request bodies as needed** + + For example, we can adjust the system prompts to change the assistants argument or argument evaluation response. + + ```javascript + function modifyRequestBody(request) { + if (request.prompt_id === "argument-evaluation") { + const systemMessage = request.body.messages.find( + (msg) => msg.role === "system" + ); + if (systemMessage) { + systemMessage.content += " Keep the feedback short and concise."; + } + } else if (request.prompt_id === "assistant-argument") { + const systemMessage = request.body.messages.find( + (msg) => msg.role === "system" + ); + if (systemMessage) { + systemMessage.content += + " Take the persona of a genius in this field when responding."; + } + } + return request; + } + ``` + +3. **Replay the modified session** + + ```javascript + // Create a new session for the replay + const replaySessionId = randomUUID(); + for (const request of requests) { + const modifiedRequest = modifyRequestBody(request); + + // Reuse session metadata from the original request + await handleChatCompletion(modifiedRequest); + } + + async function handleChatCompletion(request) { + const { body, path, prompt_id } = request; + + // Send the modified request to the LLM + const response = await fetch( + "https://api.openai.com/v1/chat/completions", + { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${OPENAI_API_KEY}`, + // Reuse the session metadata for logging + "Helicone-Session-Id": replaySessionId, + "Helicone-Session-Name": sessionName, + "Helicone-Session-Path": path, + "Helicone-Prompt-Id": prompt_id, + }, + body: JSON.stringify(body), + } + ); + + const responseData = await response.json(); + console.log(`Response for ${path}:`, responseData); + } + ``` + + **Note:** In the `handleChatCompletion` function, we send the modified request to the LLM. By reusing the same `session-name`, `session-path`, `prompt-id`, and `request path` from the original requests, we ensure that the replayed session is logged in Helicone under the same session metadata. This allows you to see the replayed requests in Helicone, grouped under the same session, making it easier to compare and analyze the effects of your modifications. + +## After running the replay, you can view it in Helicone: + +_Go fullscreen for the best experience._ + + + +With the replayed session now visible in Helicone, you can observe how the modifications impact the AI's responses throughout the session. This visualization shows how changes in prompts or configurations affect subsequent interactions. + +To assess the impact of your changes quantitatively, use Helicone's [evaluation features](https://docs.helicone.ai/features/evaluation) to assign scores to both the original and replayed sessions. **Comparing these scores helps you understand the effects of your modifications** and refine your prompts more effectively. + +Additionally, leverage Helicone's [prompt versioning](https://docs.helicone.ai/features/prompt-versioning) to manage and compare different versions of your prompts. Retrieve specific versions via Helicone's [Prompt API](https://docs.helicone.ai/rest/prompt/post-v1prompt-query) and replay them for side-by-side comparison. + +--- + +## Conclusion + +By replaying and modifying LLM sessions with Helicone, you gain deeper insights into how changes affect the entire workflow. This method allows for more effective optimization and understanding of your AI's behavior in context. + +You can view the full code and further details on [GitHub](#). + +--- + +Feel free to experiment with this approach and tailor it to your specific needs. By integrating Helicone into your development workflow, you enhance your ability to fine-tune and optimize AI interactions in a meaningful way. diff --git a/bifrost/app/blog/page.tsx b/bifrost/app/blog/page.tsx index 69884e792..55cec1070 100644 --- a/bifrost/app/blog/page.tsx +++ b/bifrost/app/blog/page.tsx @@ -190,6 +190,11 @@ export type BlogStructure = }; const blogContent: BlogStructure[] = [ + { + dynmaicEntry: { + folderName: "replaying-llm-sessions", + }, + }, { dynmaicEntry: { folderName: "helicone-recap", From 4fae0c0a9fea4b9eaea4994ebc92fc9df76c6a4a Mon Sep 17 00:00:00 2001 From: colegottdank Date: Thu, 26 Sep 2024 14:05:12 -0400 Subject: [PATCH 2/4] upate blog --- .../blog/blogs/replaying-llm-sessions/src.mdx | 141 +++++++++++------- 1 file changed, 83 insertions(+), 58 deletions(-) diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx index 63a4e58d5..937979592 100644 --- a/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx @@ -1,20 +1,14 @@ -Experimenting with prompts in isolation, disconnected from real workflows, offers limited benefits. To **truly understand how a prompt change impacts an entire session**, you need to apply the changes directly and replay the session. This reveals how modifications affect subsequent interactions and the entire flow, providing insights that isolated testing can't offer. +Experimenting with prompts in isolation **limits your understanding**. To truly grasp how a prompt change impacts an entire session, you need to **apply changes directly to real user interactions**. **Replaying LLM sessions with Helicone unlocks this capability**, providing insights unattainable through isolated testing. -In this guide, we'll **walk through the process** of setting up an initial session, querying Helicone for session data, and replaying the session with improvements. Along the way, we'll share insights on tailoring this approach to suit your unique use cases. +**Why is this powerful?** ---- - -## Replaying LLM Sessions - -Imagine running an AI agent that plans and executes tasks. Adjusting a single prompt might seem minor, but without **replaying the session**, you'd miss how that tweak alters the agent's decisions downstream. - -By replaying sessions with modified prompts, models, and parameters, you can observe the **real-world implications of your changes**. You'll see how the AI's responses evolve, how it interacts differently, and whether those changes align with your goals. This approach provides a powerful feedback loop for more informed iterations. - -### The Importance of Context +- **Authentic Context**: By leveraging actual production data, you see how changes affect real user experiences. +- **Unveiling Hidden Effects**: Discover unintended consequences that only emerge over full sessions. +- **Accelerated Iteration**: Automate testing with real inputs, streamlining your optimization process. -**Testing prompts in isolation can be misleading**. A prompt that works well on its own might not integrate smoothly with the broader system. Conversely, a prompt that seems less effective in isolation could enhance the overall workflow when applied in context. +**Helicone empowers you to replay any complex session**—a capability no other platform offers. Due to our adaptability, more mature product teams often build bespoke solutions atop Helicone to store, aggregate, and analyze their AI workflows, enhancing performance with genuine user data without reinventing the wheel. -By integrating prompt changes and replaying sessions, you capture the nuanced interplay between components. **You understand not just if a prompt works, but why it works within the system**. This leads to more effective optimizations and a deeper understanding of your AI's behavior. +In this guide, we'll **demonstrate how to leverage Helicone to replay LLM sessions**. You'll learn how to set up an initial session, query session data, and replay sessions with modifications. We'll also share tips on customizing this approach for your unique needs. --- @@ -28,33 +22,59 @@ The process of replaying LLM sessions with Helicone involves three main steps: Let's explore each of these steps in detail by following an example. ---- - -# Example: Debate Session +## Example: AI Debate Application -We'll walk through an example of a debate session between a user and an assistant. Between each argument, the assistant scores the user's argument from 1 to 10. +We'll walk through an example of a debate session between a user and an assistant. Between each argument, a impartial assistant scores the argument from 1 to 10. -## Step 1: Setting Up the Initial Session +### Step 1: Setting Up the Initial Session Before you can replay sessions, you need to log them properly in Helicone. By adding **only 3 headers** to your LLM API requests, you can tag and group them into sessions. -_Read more about how to implement Helicone sessions [here](https://docs.helicone.ai/features/sessions)._ - -### Instrumenting Your LLM Calls +#### Instrumenting Your LLM Calls -1. **Set up the session headers** +1. **Configure the OpenAI API client with Helicone** - This session is for a debate on climate change. + Set up the session headers, configure the OpenAI API client with Helicone, and include the necessary headers when making a request. ```javascript + const { OpenAI } = require("openai"); + const { randomUUID } = require("crypto"); + + // Generate unique session identifiers const sessionId = randomUUID(); const sessionName = "AI Debate"; const sessionPath = "/debate/climate-change"; + + // Initialize OpenAI client with Helicone baseURL and auth header + const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + baseURL: "https://oai.helicone.ai/v1", + defaultHeaders: { + "Helicone-Auth": `Bearer ${process.env.HELICONE_API_KEY}`, + }, + }); + + // Include Helicone session headers when making requests + const response = await openai.chat.completions( + { + model: "gpt-4o-mini", + messages: conversation, + }, + { + headers: { + "Helicone-Session-Id": sessionId, + "Helicone-Session-Name": sessionName, + "Helicone-Session-Path": sessionPath, + }, + } + ); ``` 2. **Initialize the conversation with the assistant** ```javascript + const topic = "The impact of climate change on global economies"; + const conversation = [ { role: "system", @@ -71,7 +91,9 @@ _Read more about how to implement Helicone sessions [here](https://docs.helicone 3. **Loop through the debate turns** ```javascript - while (true) { + let turn = 1; + + while (turn <= MAX_TURNS) { // Get user's argument const userArgument = await promptUser("Your argument: "); conversation.push({ role: "user", content: userArgument }); @@ -79,10 +101,10 @@ _Read more about how to implement Helicone sessions [here](https://docs.helicone // Score the user's argument await evaluateArgument( userArgument, + "Your Argument", sessionId, sessionName, - sessionPath, - "Your Argument" + sessionPath ); // Assistant responds with a counter-argument @@ -97,10 +119,10 @@ _Read more about how to implement Helicone sessions [here](https://docs.helicone // Score the assistant's argument await evaluateArgument( assistantResponse.content, + "Assistant's Argument", sessionId, sessionName, - sessionPath, - "Assistant's Argument" + sessionPath ); turn++; @@ -121,9 +143,9 @@ _Go fullscreen for the best experience._ Your browser does not support the video tag. -## Step 2: Querying the Session Data from Helicone +_Read more about how to implement Helicone sessions [here](https://docs.helicone.ai/features/sessions)._ -Read more about Helicone's API [here](https://docs.helicone.ai/rest/request/post-v1requestquery). +### Step 2: Querying the Session Data from Helicone ```javascript const response = await fetch("https://api.helicone.ai/v1/request/query", { @@ -145,7 +167,9 @@ const response = await fetch("https://api.helicone.ai/v1/request/query", { const data = await response.json(); ``` -## Step 3: Processing and Modifying the Session Data +Read more about Helicone's API [here](https://docs.helicone.ai/rest/request/post-v1requestquery). + +### Step 3: Processing and Modifying the Session Data Now that you have the session data, you'll need to process it. @@ -160,6 +184,7 @@ Now that you have the session data, you'll need to process it. created_at: request.request_created_at, session: request.request_properties["Helicone-Session-Id"], signed_body_url: request.signed_body_url, + request_path: request.request_path, path: request.request_properties["Helicone-Session-Path"], prompt_id: request.request_properties["Helicone-Prompt-Id"], body: request.body, @@ -205,35 +230,29 @@ Now that you have the session data, you'll need to process it. await handleChatCompletion(modifiedRequest); } - async function handleChatCompletion(request) { - const { body, path, prompt_id } = request; + async function handleChatCompletion(modifiedRequest) { + const { body, path, prompt_id, request_path } = modifiedRequest; // Send the modified request to the LLM - const response = await fetch( - "https://api.openai.com/v1/chat/completions", - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${OPENAI_API_KEY}`, - // Reuse the session metadata for logging - "Helicone-Session-Id": replaySessionId, - "Helicone-Session-Name": sessionName, - "Helicone-Session-Path": path, - "Helicone-Prompt-Id": prompt_id, - }, - body: JSON.stringify(body), - } - ); - - const responseData = await response.json(); - console.log(`Response for ${path}:`, responseData); + const response = await fetch(request_path, { + method: "POST", + headers: { + Authorization: `Bearer ${OPENAI_API_KEY}`, + "Helicone-Auth": `Bearer ${HELICONE_API_KEY}`, + // Reuse the session metadata for logging + "Helicone-Session-Id": replaySessionId, + "Helicone-Session-Name": sessionName, + "Helicone-Session-Path": path, + "Helicone-Prompt-Id": prompt_id, + }, + body: JSON.stringify(body), + }); } ``` **Note:** In the `handleChatCompletion` function, we send the modified request to the LLM. By reusing the same `session-name`, `session-path`, `prompt-id`, and `request path` from the original requests, we ensure that the replayed session is logged in Helicone under the same session metadata. This allows you to see the replayed requests in Helicone, grouped under the same session, making it easier to compare and analyze the effects of your modifications. -## After running the replay, you can view it in Helicone: +### After running the replay, you can view it in Helicone: _Go fullscreen for the best experience._ @@ -253,12 +272,18 @@ Additionally, leverage Helicone's [prompt versioning](https://docs.helicone.ai/f --- -## Conclusion +### Conclusion -By replaying and modifying LLM sessions with Helicone, you gain deeper insights into how changes affect the entire workflow. This method allows for more effective optimization and understanding of your AI's behavior in context. - -You can view the full code and further details on [GitHub](#). +By replaying and modifying LLM sessions with Helicone, you gain deeper insights into how changes affect the entire workflow. This method provides context-rich, real-world data that leads to more effective optimizations and a comprehensive understanding of your AI's behavior. --- -Feel free to experiment with this approach and tailor it to your specific needs. By integrating Helicone into your development workflow, you enhance your ability to fine-tune and optimize AI interactions in a meaningful way. +### Helicone Plug 🧊 + +Helicone is the ultimate LLM observability platform built for developers to monitor, debug and improve their LLM applications. We're fully open source and built to handle high usage use-cases seamlessly. With over **1.8 billion requests** and **1.6 trillion tokens** logged, it's proven at scale. Check out our GitHub repository [here](https://github.com/Helicone/helicone). + +**Trusted by Industry Leaders**: Companies like **Sunrun**, **Michelin**, **QAWolf**, **Slate Magazine**, and many more rely on Helicone to enhance their AI models and workflows. + +You can view the full code and further details on [GitHub](https://github.com/Helicone/helicone). + +--- From eb1ef505a041f592b5946db727a4b9d3e50deb80 Mon Sep 17 00:00:00 2001 From: colegottdank Date: Thu, 26 Sep 2024 16:17:34 -0400 Subject: [PATCH 3/4] blog final --- .../replaying-llm-sessions/metadata.json | 10 +++---- .../blog/blogs/replaying-llm-sessions/src.mdx | 28 +++++++++++++++--- .../blog/replaying-llm-sessions/sessions.webp | Bin 0 -> 96340 bytes 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 bifrost/public/static/blog/replaying-llm-sessions/sessions.webp diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json index 9ad1032f0..982c591a4 100644 --- a/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json @@ -1,9 +1,9 @@ { - "title": "How to Replay LLM Sessions for Iterative Improvement with Helicone", - "title1": "Replay and Iterate on LLM Sessions Using Helicone", - "title2": "Replaying LLM Sessions for Improved Agent Workflows with Helicone", - "description": "Learn how to leverage Helicone to replay LLM sessions and iteratively improve your agent-based workflows. This guide walks through querying past sessions and replaying them with modifications to enhance performance.", - "images": "/static/blog/replaying-llm-sessions/cover.webp", + "title": "Replaying LLM Sessions for Iterative AI Agent Improvement", + "title1": "Replaying LLM Sessions for Iterative AI Agent Improvement", + "title2": "Replaying LLM Sessions for Iterative AI Agent Improvement", + "description": "Learn how to enhance your AI agents by replaying and modifying LLM sessions using Helicone. Apply changes directly to real user interactions to gain authentic context, reveal hidden effects, and accelerate iteration.", + "images": "/static/blog/replaying-llm-sessions/sessions.webp", "time": "10 minute read", "author": "Cole Gottdank", "date": "September 24, 2024" diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx index 937979592..91268a779 100644 --- a/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/src.mdx @@ -1,3 +1,4 @@ +![sessions](/static/blog/replaying-llm-sessions/sessions.webp) Experimenting with prompts in isolation **limits your understanding**. To truly grasp how a prompt change impacts an entire session, you need to **apply changes directly to real user interactions**. **Replaying LLM sessions with Helicone unlocks this capability**, providing insights unattainable through isolated testing. **Why is this powerful?** @@ -266,11 +267,30 @@ _Go fullscreen for the best experience._ With the replayed session now visible in Helicone, you can observe how the modifications impact the AI's responses throughout the session. This visualization shows how changes in prompts or configurations affect subsequent interactions. +--- + +## Optional: Evaluations & Prompt Versioning + +### Evaluations + To assess the impact of your changes quantitatively, use Helicone's [evaluation features](https://docs.helicone.ai/features/evaluation) to assign scores to both the original and replayed sessions. **Comparing these scores helps you understand the effects of your modifications** and refine your prompts more effectively. -Additionally, leverage Helicone's [prompt versioning](https://docs.helicone.ai/features/prompt-versioning) to manage and compare different versions of your prompts. Retrieve specific versions via Helicone's [Prompt API](https://docs.helicone.ai/rest/prompt/post-v1prompt-query) and replay them for side-by-side comparison. +### Prompt Versioning ---- +Helicone's [prompt versioning](https://docs.helicone.ai/features/prompts) feature allows you to manage and compare different versions of your prompts effectively. By maintaining multiple versions, **you can test various combinations within your sessions to identify which prompts yield the best results**. To retrieve specific prompt versions, use Helicone's [Prompt API](https://docs.helicone.ai/rest/prompt/post-v1prompt-query). + +Here's how you can iterate over prompt versions to test different compositions in your sessions: + +```pseudo +Define a list of prompt versions for each prompt. +For each combination in the cartesian product of prompt versions: + Generate a new session ID. + For each prompt in the combination: + Fetch the prompt content using Helicone's Prompt API. + Run the session using the retrieved prompts. +``` + +_Alternatively, as described above, you can manually modify the prompts after retrieving the session, and Helicone will automatically log the new prompt versions for you. In this approach, you create the prompt versions first._ ### Conclusion @@ -280,10 +300,10 @@ By replaying and modifying LLM sessions with Helicone, you gain deeper insights ### Helicone Plug 🧊 -Helicone is the ultimate LLM observability platform built for developers to monitor, debug and improve their LLM applications. We're fully open source and built to handle high usage use-cases seamlessly. With over **1.8 billion requests** and **1.6 trillion tokens** logged, it's proven at scale. Check out our GitHub repository [here](https://github.com/Helicone/helicone). +**Helicone is the ultimate open-source LLM observability platform built for developers to monitor, debug and improve their LLM applications**. We're fully open source and built to handle high usage use-cases seamlessly. With over **1.8 billion requests** and **1.6 trillion tokens** logged, it's proven at scale. **Check out our open-source GitHub repository [here](https://github.com/Helicone/helicone).** **Trusted by Industry Leaders**: Companies like **Sunrun**, **Michelin**, **QAWolf**, **Slate Magazine**, and many more rely on Helicone to enhance their AI models and workflows. -You can view the full code and further details on [GitHub](https://github.com/Helicone/helicone). +You can view the full code used in this guide on [GitHub](https://github.com/colegottdank/helicone-replay-session-blog). --- diff --git a/bifrost/public/static/blog/replaying-llm-sessions/sessions.webp b/bifrost/public/static/blog/replaying-llm-sessions/sessions.webp new file mode 100644 index 0000000000000000000000000000000000000000..39fad23219cd2b3ecf793ef7a12a0027935266db GIT binary patch literal 96340 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%0A_4A=kN>I5Xu%SUc$+Wm6O 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
@MxJc1fW*p(a|irXzRb8nx2iu?L71OsLQ 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 Date: Thu, 26 Sep 2024 16:19:04 -0400 Subject: [PATCH 4/4] metadata --- bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json index 982c591a4..c14b5850b 100644 --- a/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json +++ b/bifrost/app/blog/blogs/replaying-llm-sessions/metadata.json @@ -4,7 +4,7 @@ "title2": "Replaying LLM Sessions for Iterative AI Agent Improvement", "description": "Learn how to enhance your AI agents by replaying and modifying LLM sessions using Helicone. Apply changes directly to real user interactions to gain authentic context, reveal hidden effects, and accelerate iteration.", "images": "/static/blog/replaying-llm-sessions/sessions.webp", - "time": "10 minute read", + "time": "15 minute read", "author": "Cole Gottdank", - "date": "September 24, 2024" + "date": "September 26, 2024" }