Skip to main content
使用 LangChain 构建应用或 Agent 时,您最终会进行多次 API 调用来完成单个用户请求。但是,当您想分析这些请求时,它们并没有被关联在一起。使用 Portkey,来自单个用户请求的所有嵌入、补全和其他请求将被记录并追踪到一个公共 ID,使您能够完全了解用户交互情况。 本 notebook 提供了关于如何在 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 密钥

  1. Portkey 注册
  2. 在您的 仪表板 上,点击左下角的个人资料图标,然后点击”Copy API Key”
  3. 粘贴到下面
PORTKEY_API_KEY = "..."  # 在此粘贴您的 Portkey API 密钥

设置追踪 ID

  1. 在下面设置请求的追踪 ID
  2. 追踪 ID 对于来自单个请求的所有 API 调用可以是相同的
TRACE_ID = "uuid-trace-id"  # 在此设置追踪 ID

生成 Portkey Headers

portkey_headers = createHeaders(
    api_key=PORTKEY_API_KEY, provider="openai", trace_id=TRACE_ID
)
定义要使用的提示和工具
from langchain_classic import hub
from langchain.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]
像往常一样运行您的 Agent。唯一的变化是我们现在将在请求中包含上面的 headers
model = ChatOpenAI(
    base_url=PORTKEY_GATEWAY_URL, default_headers=portkey_headers, temperature=0
)

# 构建 OpenAI 工具 agent
agent = create_openai_tools_agent(model, tools, prompt)

# 通过传入 agent 和工具创建 agent 执行器
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"
    }
)
> Entering new AgentExecutor chain...

Invoking: `exponentiate` with `{'base': 3, 'exponent': 5}`


243
Invoking: `multiply` with `{'first_int': 243, 'second_int': 36}`


8748
Invoking: `exponentiate` with `{'base': 8748, 'exponent': 2}`


76527504The result of taking 3 to the fifth power, multiplying it by 36, and then squaring the result is 76,527,504.

> Finished chain.
{'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(请求 JSON)、response json(响应 JSON)以及其他 Portkey 功能
追踪
  • 追踪 ID 随每个请求一起传递,在 Portkey 仪表板的日志中可见
  • 如果需要,您也可以为每个请求设置不同的追踪 ID
  • 您还可以向追踪 ID 附加用户反馈。更多信息请参阅此处
对于上述请求,您将能够像这样查看完整的日志追踪: 在 Portkey 上查看 LangChain 追踪

高级 LLMOps 功能 - 缓存、标记、重试

除了日志记录和追踪,Portkey 还提供了更多功能,为您现有的工作流增添生产能力: 缓存 从缓存中响应之前服务过的客户查询,而不是再次发送给 OpenAI。匹配完全相同的字符串或语义相似的字符串。缓存可以节省成本并将延迟降低 20 倍。文档 重试 自动重新处理任何失败的 API 请求最多 5 次。使用指数退避策略,通过间隔重试尝试来防止网络过载。文档 标记 通过预定义标签以高度详细的方式跟踪和审计每次用户交互。文档