Documentation Index
Fetch the complete documentation index at: https://langchain-zh.cn/llms.txt
Use this file to discover all available pages before exploring further.
本教程将向您展示如何为 Agent Server 运行收集用户反馈,并自动将其关联到 LangSmith 中的 追踪记录。创建运行时,在请求体的 feedback_keys 字段中包含相应的键。响应将为每个键返回一个预签名 URL,您的客户端可以使用这些 URL 来收集 Agent Server 运行的用户反馈。
LangSmith 利用反馈持续改进您智能体的实现。要了解更多关于 LangSmith 中反馈的工作原理,请参阅 LangSmith 反馈。
工作原理
- 创建运行时,在请求体中包含
feedback_keys。例如,调用 POST /threads/{thread_id}/runs/stream 时,将请求体中的 feedback_keys 设置为:
["user_liked", "user_disliked"]
- 响应中的
feedback 对象包含每个键对应的预签名 URL。例如,feedback 对象为:
{
"user_liked": "https://api.smith.langchain.com/api/v1/feedback/tokens/ef19fedf-dcac-4cbb-a59c-00661efd6425",
"user_disliked": "https://api.smith.langchain.com/api/v1/feedback/tokens/e952734e-c0a0-417b-a04d-fc2209691ed5"
}
- 请求返回的 URL(例如
POST /api/v1/feedback/tokens/{token_id}),以将反馈键与 Agent Server 运行生成的追踪记录关联起来。更多详情,请参阅 LangSmith API 参考。
- LangSmith 使用选定的反馈键(例如
user_liked 或 user_disliked)将提交的反馈与该运行关联起来。
调用带有 feedback_keys 的流式运行 API
创建一个运行,并从响应中解析 feedback 对象。
Python SDK
JavaScript SDK
cURL
from langgraph_sdk import get_client
client = get_client(url="<DEPLOYMENT_URL>", api_key="<API_KEY>")
thread = await client.threads.create()
thread_id = thread["thread_id"]
feedback_urls = {}
async for event in client.runs.stream(
thread_id,
"agent",
input={
"messages": [
{"role": "user", "content": "Tell me a joke about databases."}
]
},
stream_mode="updates",
feedback_keys=["user_liked", "user_disliked"],
):
if event.event == "feedback":
# 示例: {"user_liked": ".../feedback/tokens/<id>", "user_disliked": "..."}
feedback_urls = event.data
print("Feedback URLs:", feedback_urls)
elif event.event == "updates":
print(event.data)
import { Client } from "@langchain/langgraph-sdk";
const client = new Client({ apiUrl: "<DEPLOYMENT_URL>", apiKey: "<API_KEY>" });
const thread = await client.threads.create();
const threadId = thread.thread_id;
let feedbackUrls = {};
const streamResponse = client.runs.stream(threadId, "agent", {
input: {
messages: [{ role: "user", content: "Tell me a joke about databases." }],
},
streamMode: "updates",
feedbackKeys: ["user_liked", "user_disliked"],
});
for await (const event of streamResponse) {
if (event.event === "feedback") {
// 示例: { user_liked: ".../feedback/tokens/<id>", user_disliked: "..." }
feedbackUrls = event.data;
console.log("Feedback URLs:", feedbackUrls);
} else if (event.event === "updates") {
console.log(event.data);
}
}
curl --request POST \
--url "<DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/stream" \
--header "Content-Type: application/json" \
--header "x-api-key: <API_KEY>" \
--data '{
"assistant_id": "agent",
"input": {
"messages": [
{
"role": "user",
"content": "Tell me a joke about databases."
}
]
},
"stream_mode": "updates",
"feedback_keys": ["user_liked", "user_disliked"]
}'
处理流式 feedback 事件
流会发出类似以下的 feedback 事件:
event: feedback
data: {"user_liked":"https://api.smith.langchain.com/api/v1/feedback/tokens/ef19fedf-dcac-4cbb-a59c-00661efd6425", "user_disliked": "https://api.smith.langchain.com/api/v1/feedback/tokens/e952734e-c0a0-417b-a04d-fc2209691ed5"}
data 中的每个键都对应您传入 feedback_keys 的一个值。每个值都是一个生成的 URL,您的客户端可以调用该 URL 来提交该运行的反馈。
使用生成的 URL 提交反馈
当用户选择一个反馈选项时,向相应的 URL 发送 POST 请求。也支持 GET 请求。更多详情,请参阅 LangSmith API 参考。
例如,如果用户点击了”踩”按钮,则调用 user_disliked URL:
curl --request POST \
--url "https://api.smith.langchain.com/api/v1/feedback/tokens/e952734e-c0a0-417b-a04d-fc2209691ed5" \
--header "Content-Type: application/json" \
--data '{
"score": 1,
"value": 0,
"comment": "I didn't like this joke because it didn't make me laugh.",
"correction": {},
"metadata": {}
}'
GET 请求不支持 metadata。curl --request GET \
--url "https://api.smith.langchain.com/api/v1/feedback/tokens/e952734e-c0a0-417b-a04d-fc2209691ed5?score=1&value=0&comment=I%20didn%27t%20like%20this%20joke%20because%20it%20didn%27t%20make%20me%20laugh.&correction=%7B%7D"
此请求成功后,LangSmith 将使用键 user_disliked 在追踪记录上记录反馈。
优化反馈数据模型
user_liked 和 user_disliked 键也可以建模在单个键下,例如 user_score。
例如:
- 对于
user_liked,使用 key="user_score" 和 score=1
- 对于
user_disliked,使用 key="user_score" 和 score=-1
这可以简化分析,因为所有用户偏好信号都分组在一个反馈键下。
反馈数据模型是灵活的,应根据您的用例进行设计。例如,某些应用程序可能更喜欢单独的布尔式键(user_liked、user_disliked),而其他应用程序可能更喜欢单个数字分数(user_score)或具有多个反馈键的更丰富的评估标准。
在客户端 UI 中实现生产化
生产化的解决方案将通过您的前端暴露生成的反馈 URL,而不是手动调用它们。
示例高级实现:
- 从您的后端或前端创建运行。
- 捕获
feedback 对象并存储返回的 URL。
- 渲染反馈控件,例如”赞/踩”按钮和反馈表单。
- 提交反馈时,根据用户的反馈意图,向相应的反馈 URL 发送
POST 或 GET 请求。
- 提交后,可选择禁用反馈控件并向用户显示确认信息。