文档

行为反馈

更新时间:

行为数据上报的好处

  • 通过用户对结果的反馈,方便产研侧后面评估效果,优化产品体验。

  • 通过行为数据的返回可以为用户提供效果的报表展示,更直观的查看对应报表数据。

上报行为数据

说明:建议通过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

数据类型

  • all:整个结果;

  • text_response:文本回答;

  • image_response:图片回答;

  • doc:问答召回doc;

  • question:多轮对话改写question。

必须

13

bhv_type

STRING

行为类型,例如曝光、停留、浏览、收藏、下载等

  • like:点赞;

  • dislike:点衰。

必须

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;
 }
 }
}