行为数据上报的好处
通过用户对结果的反馈,方便产研侧后面评估效果,优化产品体验。
通过行为数据的返回可以为用户提供效果的报表展示,更直观的查看对应报表数据。
上报行为数据
说明:建议通过SDK手动上传行为数据。下文详细介绍了行为数据包含的字段类型与含义。
SDK上报有8个必须字段:user_id、biz_id、trace_id、rn、item_type、bhv_type、bhv_time、reach_time。
ID | 字段名 | 字段类型 | 字段含义 | 字段值 | 是否必须 |
1 | app_version | STRING | 业务侧网站或移动APP的版本号 | 非必须 | |
2 | sdk_type | STRING | 数据上报使用的SDK类型。该字段是开放搜索为了区分服务端上报和移动端采集的SDK而设置的 | 非必须如果是通过开放搜索SDK做上报,会默认设置该值为”opensearch_sdk” | |
3 | sdk_version | STRING | 数据上报使用的SDK版本号 | 非必须如果是通过开放搜索SDK做上报,会默认设置该值 | |
4 | login | STRING | 终端用户在业务侧网站或移动APP上是否是登录状态 | 取值为0或1。含义为:0(未登录), 1(登录) | 非必须 |
5 | user_id | STRING | 用于唯一标识终端用户的一个ID。 | 非必须但imei,user_id不能同时为空 | |
6 | imei | STRING | 终端用户设备ID(值可以为:imei,device_id,idfa) | 非必须但imei,user_id不能同时为空 | |
7 | biz_id | BIGINT | 业务侧用于区分不同业务的一个数值ID。一般,业务侧的一个biz_id对应一个开放搜索应用,如:应用id | 必须 | |
8 | trace_id | STRING | 用于区分行为针对的doc是来自哪个搜索服务商输出的结果 | 如果是来自开放搜索的结果,该字段值设置为Alibaba,如果是来自其他服务商的结果,业务侧可以自己取名字 | 必须 |
9 | trace_info | STRING | 该值来自开放搜索在搜索结果中返回ops_request_misc的值,原样回传即可 | 非必须 注:trace_id为Alibaba时必须要回传,内部用于核对是由开放搜索输出的结果 | |
10 | rn | STRING | 用于标识一个搜索pv。 该值来自开放搜索在搜索结果中返回的request_id的值,原样回传即可。 | 必须 | |
11 | item_id | STRING | 行为的发生的数据下标 | 非必须,默认为0 | |
12 | item_type | STRING | 数据类型 |
| 必须 |
13 | bhv_type | STRING | 行为类型,例如曝光、停留、浏览、收藏、下载等 |
| 必须 |
14 | bhv_value | STRING | 具体行为描述 | 格式为JSON格式:可参考下面常见行为取值 | 非必须 |
15 | bhv_time | STRING | 行为发生的时间戳,单位s | 必须 | |
16 | bhv_detail | STRING | 对行为的一些描述详情。 | 格式:key=value{,key=value} 表示可以是1个或多个key=value对 | 非必须 |
17 | ip | STRING | 行为发生的手机或终端的ip | 非必须建议设置 | |
18 | longitude | STRING | 行为发生位置的经度 | 非必须建议设置 | |
19 | latitude | STRING | 行为发生位置的纬度 | 非必须建议设置 | |
20 | session_id | STRING | 用户的一次会话id | 非必须建议设置 | |
21 | spm | STRING | 提供给业务用来跟踪行为所在的页面模块的位置 | 编码格式为a.b.c.d, 分别代表站点ID,页面ID, 模块ID, 位置ID。 | 非必须 |
22 | report_src | STRING | 用于区分上报来源 | 取值为1,2,3。含义:1(通过开放搜索SDK上报),2(通过移动端SDK采集),3(通过开放搜索API上报) | 非必须 |
23 | mac | STRING | 手机或终端设备的网卡MAC地址 | 非必须 | |
24 | brand | STRING | 手机或终端的品牌 | 非必须建议设置 | |
25 | device_model | STRING | 手机或终端的机型 | 非必须 | |
26 | resolution | STRING | 手机或终端的屏幕分辨率 | 非必须 | |
27 | carrier | STRING | 手机或终端的移动运营商 | 非必须 | |
28 | access | STRING | 手机或终端连接的网络 | 非必须 | |
29 | access_subtype | STRING | 手机或终端连接的网络类型 | 非必须 | |
30 | os | STRING | 手机或终端的操作系统 | 非必须 | |
31 | os_version | STRING | 手机或终端操作系统的版本 | 非必须 | |
32 | language | STRING | 手机或终端设置的语言类型 | 非必须 | |
33 | phone_md5 | STRING | 用户手机号的md5值 | 非必须 | |
34 | reserve1 | STRING | 预留字段 | 非必须 | |
35 | reserve2 | STRING | 预留字段 | 非必须 | |
36 | reach_time | BIGINT | 该数据到达服务端的时间,格式:时间戳,单位:秒。 | 必须,如果是通过开放搜索SDK做上报,SDK会自动设置, 如果是通过开放搜索API做上报,需要设置 |
常见行为取值
bhv_value格式
{
"code":[2.3,2.5], # 用来设置具体的问题类型,具体code值及含义见下表
"expect" : "期望答复的内容"
}
ID | code | 含义 |
1 | 1.1 | 问题理解-没有可用于回答问题的检索结果/参考链接 |
2 | 2.1 | 回答质量-存在编造内容 |
3 | 2.2 | 回答质量-存在概念混淆 |
4 | 2.3 | 回答质量-存在重复 |
5 | 2.4 | 回答质量-存在与问题无关的内容 |
6 | 2.5 | 回答质量-回答不全面 |
7 | 2.6 | 回答质量-表达不清晰 |
8 | 3.1 | 有害信息-敏感 |
9 | 3.2 | 有害信息-歧视 |
10 | 3.3 | 有害信息-有害 |
其他问题 |
Push 推送采集数据
参数描述
参数名称 | 类型 | 描述 |
$docJson | string | 文档 list,为 JSON 格式 |
$searchAppName | string | 关联的搜索应用名 |
$dataCollectionName | string | 数据采集名称,开通时控制台会返回该名称 |
$dataCollectionType | string | 数据采集类型:BEHAVIOR |
引入依赖:
<dependency>
<groupId>com.aliyun.opensearch</groupId>
<artifactId>aliyun-sdk-opensearch</artifactId>
<version>4.0.0</version>
</dependency>
pip install alibabacloud_tea_util
pip install alibabacloud_opensearch_util
pip install alibabacloud_credentials
push 代码示例:
import com.aliyun.opensearch.DataCollectionClient;
import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchResult;
import static org.junit.Assert.assertTrue;
public class PushLLMBehavioralData {
private static String accesskey = "your ak";
private static String secret = "your secret";
private static String host = "your host";
private static String searchAppName = "app_name";
private static String dataCollectionName = "app_name";
private static String dataCollectionType = "DATA_COLLECTION_TYPE_BEHAVIOR";
public static void main(String[] args) throws Exception {
//创建并构造OpenSearch对象
OpenSearch opensearch = new OpenSearch(accesskey, secret, host);
//创建OpenSearchClient对象,并以OpenSearch对象作为构造参数
OpenSearchClient client = new OpenSearchClient(opensearch);
//创建DataCollectionClient对象,并以OpenSearchClient对象作为构造参数
DataCollectionClient dataCollectionClient = new DataCollectionClient(client);
// 直接推送文档
String docJson = "[{\"cmd\": \"ADD\",\"fields\": {"\user_id"\:"\1120021255"\,\"biz_id\": 1365378,\"rn\": \"170107366216796189819166\",\"trace_id\": \"Alibaba\",\"item_id\": \"id\",\"item_type\": \"goods\",\"bhv_type\": \"click\",\"bhv_time\": \"1701074578\"}}]";
try {
OpenSearchResult openSearchResult = dataCollectionClient.push(docJson,
searchAppName, dataCollectionName,
dataCollectionType);
System.out.println(openSearchResult);
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
return;
}
}
}
# -*- coding: utf-8 -*-
import time, os
from typing import Dict, Any
from Tea.exceptions import TeaException
from Tea.request import TeaRequest
from alibabacloud_tea_util import models as util_models
from BaseRequest import Config, Client
class opensearch:
def __init__(self, config: Config):
self.Clients = Client(config=config)
self.runtime = util_models.RuntimeOptions(
connect_timeout=10000,
read_timeout=10000,
autoretry=False,
ignore_ssl=False,
max_idle_conns=50,
max_attempts=3
)
self.header = {}
def behaviorBulk(self, app_name: str, collections_name: str, doc_content: list) -> Dict[str, Any]:
try:
response = self.Clients._request(method="POST",
pathname=f'/v3/openapi/app-groups/{app_name}/data-collections/{app_name}/data-collection-type/DATA_COLLECTION_TYPE_BEHAVIOR/actions/bulk',query={},headers = self.header,
body=doc_content, runtime=self.runtime)
return response
except Exception as e:
print(e)
if __name__ == "__main__":
# 配置统一的请求入口和
endpoint = "<endpoint>"
# 支持 protocol 配置 HTTPS/HTTP
endpoint_protocol = "HTTP"
# 用户识别信息
# 从环境变量读取配置的AccessKey ID和AccessKey Secret,
# 运行代码示例前必须先配置环境变量,参考文档上面“配置环境变量”步骤
access_key_id = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID")
access_key_secret = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
# 支持 type 配置 sts/access_key 鉴权. 其中 type 默认为 access_key 鉴权. 使用 sts 可配置 RAM-STS 鉴权.
# 备选参数为: sts 或者 access_key
auth_type = "sts"
# 如果使用 RAM-STS 鉴权, 请配置 security_token, 可使用 阿里云 AssumeRole 获取 相关 STS 鉴权结构.
security_token = "<security_token>"
# 配置请求使用的通用信息.
Configs = Config(endpoint=endpoint, access_key_id=access_key_id, access_key_secret=access_key_secret,
security_token=security_token, type=auth_type, protocol=endpoint_protocol)
# 创建 opensearch 实例
ops = opensearch(Configs)
app_name = "app_name"
# --------------- 行为日志 ---------------
# item_id 信息 为 搜索结果返回的主键信息. 特定 为主键 id.
item_id = "358713"
# ops_request_misc 为搜索请求返回的 ops_request_misc 信息.
ops_request_misc = "%7B%22request%5Fid%22%3A%22161777635816780357273903%22%2C%22scm%22%3A%2220140713.130149759..%22%7D"
# bhv_type 为 行为事件的特征信息, 备选信息如下为类别:
# expose(曝光)
# cart(加购物车)
# collect(收藏)
# like(点赞)
# comment(评论)
# buy(购买)
# like(点赞)
# dislike(点衰)
bhv_type = "like"
# request_id 为搜索请求返回的 request_id 信息.
request_id = "161777635816780357273903"
# 该数据到达服务端的时间,格式:时间戳,单位:秒
reach_time = "1709708439"
# 用于唯一标识终端应用上的用户的ID。
# *一般为登录用户ID。
# *对于PC端,如果是未登录用户,也可以设置为cookieid
user_id = "a7a0d37c824b659f36a5b9e3b819fcdd"
behavior_fields1 = behavior_fields2 = {
"item_id": item_id,
"sdk_type": "opensearch_sdk",
"sdk_version": "<sdk_version>", # 当前使用的 opensearch sdk 的版本号.(当前pythonsdk版本号:3.2.0)
"trace_id": "ALIBABA", # 用于区分调用了哪个服务商的服务
"trace_info": ops_request_misc,
"bhv_type": bhv_type,
"item_type": "item",
"rn": request_id,
"biz_id": "<biz_id>", # 手机或终端应用用于区分业务的一个数值ID,该字段可用来和OpenSearch上的应用或和AIRec上的实例做关联
"reach_time": reach_time,
"user_id": user_id,
}
behavior_documents = [{"cmd": "add", "fields": behavior_fields1}, {"cmd": "add", "fields": behavior_fields2}]
res6 = ops.behaviorBulk(app_name=app_name, collections_name=app_name, doc_content=behavior_documents)
print(res6)
commit 代码示例:
package com.aliyun.opensearch.demo;
import com.aliyun.opensearch.DataCollectionClient;
import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchResult;
import java.util.HashMap;
import java.util.Map;
public class PushDataCollectionDoc {
private static String accesskey = "your ak";
private static String secret = "your secret";
private static String host = "your host";
private static String searchAppName = "opensearch_app_name";
private static String dataCollectionName = "opensearch_app_name";
private static String dataCollectionType = " DATA_COLLECTION_TYPE_BEHAVIOR";
public static void main(String[] args) {
//创建并构造OpenSearch对象
OpenSearch opensearch = new OpenSearch(accesskey, secret, host);
//创建OpenSearchClient对象,并以OpenSearch对象作为构造参数
OpenSearchClient client = new OpenSearchClient(opensearch);
//创建DataCollectionClient对象,并以OpenSearchClient对象作为构造参数
DataCollectionClient dataCollectionClient = new DataCollectionClient(client);
Map<String, Object> fields = new HashMap<String, Object>();
// 用户唯一标识
fields.put("user_id", "1120021255");
// 业务侧用于区分不同业务的数值ID 对应一个开放搜索应用
fields.put("biz_id", 1365378);
// 搜索结果中返回的request_id的值,原样回传即可
fields.put("rn", "1564455556323223680397827");
// 如果是来自开放搜索的结果,该字段值设置为Alibaba
fields.put("trace_id", "Alibaba");
// 开放搜索应用中主表主键值
fields.put("item_id", "2223");
// item类型为 物品、商品
fields.put("item_type", "goods");
// 点击类行为数据
fields.put("bhv_type", "like");
// 行为发生的秒级时间戳
fields.put("bhv_time", "1566475047");
//增加一条文档
//这条文档只是增加到 SDK Client buffer中,没有正式提交到服务端;只有调用了 commit 方法才会被提交到服务端。
//可以多次调用 add,然后调用commit() 统一提交。
dataCollectionClient.add(fields);
try {
OpenSearchResult openSearchResult = dataCollectionClient.commit(searchAppName, dataCollectionName, dataCollectionType);
System.out.println(openSearchResult);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}