日志、跟踪和监控
在使用Langchain构建应用程序或代理时,您最终会进行多次API调用来完成单个用户请求。然而,当您想要分析这些请求时,它们并没有被链接起来。使用Portkey,来自单个用户请求的所有嵌入、完成和其他请求都将被记录并追踪到一个共同的ID,使您能够全面了解用户交互。
本笔记本作为逐步指南,介绍如何在您的Langchain应用中使用Portkey
记录、跟踪和监控Langchain LLM调用。
首先,让我们导入Portkey、OpenAI和Agent工具
import os
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders
在下面粘贴您的OpenAI API密钥。(您可以在这里找到它)
os.environ["OPENAI_API_KEY"] = "..."
获取 Portkey API 密钥
- 注册 Portkey here
- 在您的仪表板上,点击左下角的个人资料图标,然后点击“复制API密钥”
- 粘贴到下面
PORTKEY_API_KEY = "..." # Paste your Portkey API Key here
设置追踪ID
- 在下方设置您的请求的跟踪ID
- 对于源自单个请求的所有API调用,Trace ID可以是相同的
TRACE_ID = "uuid-trace-id" # Set trace id here
生成Portkey头信息
portkey_headers = createHeaders(
api_key=PORTKEY_API_KEY, provider="openai", trace_id=TRACE_ID
)
定义提示和要使用的工具
from langchain import hub
from langchain_core.tools import tool
prompt = hub.pull("hwchase17/openai-tools-agent")
@tool
def multiply(first_int: int, second_int: int) -> int:
"""Multiply two integers together."""
return first_int * second_int
@tool
def exponentiate(base: int, exponent: int) -> int:
"Exponentiate the base to the exponent power."
return base**exponent
tools = [multiply, exponentiate]
像往常一样运行你的代理。唯一的改变是现在我们将在请求中包含上述头信息。
model = ChatOpenAI(
base_url=PORTKEY_GATEWAY_URL, default_headers=portkey_headers, temperature=0
)
# Construct the OpenAI Tools agent
agent = create_openai_tools_agent(model, tools, prompt)
# Create an agent executor by passing in the agent and tools
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke(
{
"input": "Take 3 to the fifth power and multiply that by thirty six, then square the result"
}
)
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `exponentiate` with `{'base': 3, 'exponent': 5}`
[0m[33;1m[1;3m243[0m[32;1m[1;3m
Invoking: `multiply` with `{'first_int': 243, 'second_int': 36}`
[0m[36;1m[1;3m8748[0m[32;1m[1;3m
Invoking: `exponentiate` with `{'base': 8748, 'exponent': 2}`
[0m[33;1m[1;3m76527504[0m[32;1m[1;3mThe result of taking 3 to the fifth power, multiplying it by 36, and then squaring the result is 76,527,504.[0m
[1m> Finished chain.[0m
{'input': 'Take 3 to the fifth power and multiply that by thirty six, then square the result',
'output': 'The result of taking 3 to the fifth power, multiplying it by 36, and then squaring the result is 76,527,504.'}
日志记录和追踪在Portkey上的工作原理
日志记录
- 通过Portkey发送您的请求,确保默认情况下所有请求都被记录
- 每个请求日志包含
timestamp
、model name
、total cost
、request time
、request json
、response json
以及额外的Portkey功能
- 跟踪ID随每个请求传递,并在Portkey仪表板的日志中可见
- 你也可以为每个请求设置一个独特的追踪ID,如果你愿意的话
- 您也可以将用户反馈附加到跟踪ID上。更多信息请点击这里
对于上述请求,您将能够查看整个日志跟踪,如下所示
高级LLMOps功能 - 缓存、标记、重试
除了日志记录和跟踪,Portkey 还提供了更多功能,为您的现有工作流程增加生产能力:
缓存
响应之前服务过的客户查询,从缓存中获取而不是再次发送到OpenAI。匹配完全相同的字符串或语义相似的字符串。缓存可以节省成本并将延迟减少20倍。Docs
重试
自动重新处理任何不成功的API请求,最多5
次。使用指数退避
策略,该策略将重试尝试间隔开,以防止网络过载。Docs
标签
使用预定义标签详细跟踪和审核每个用户交互。Docs