Вызов функции-члена toArray() в массиве – predis laravel
Я пытаюсь использовать Redis с Laravel, чтобы найти похожие векторы, используя вложения OpenAI.
У меня есть пример на Python, который выглядит так:
def search_similar_documents(self, entity_id, vector, topK=5):
query = Query("*=>[KNN 2 @embedding $vec as score]")
query.sort_by("score")
query.return_fields("score")
query.paging(0, 2)
query.dialect(2)
query_params = {"vec": vector}
return self.r.ft(self.index_name).search(query, query_params)
и я пытаюсь сделать то же самое в laravel, но документации библиотеки не нашел и то, что я пытаюсь сделать, не работает.
В ларавеле у меня есть это
public function searchSimilarityDocuments(int $entityId, array $vector, int $topK=2){
$filter = '*=>[KNN '.$topK.' @embedding $vec as score]';
// $filter = ["vec" => json_encode($vector)];
$arguments = new SearchArguments();
$arguments->withScores();
$arguments->withPayloads();
$arguments->filter($filter);
$vector = pack('f*', ...$vector);
$result = $this->r->ftSearch($this->indexName, $arguments, ['vec' => $vector]);
return $result;
}
При выполнении получаю следующую ошибкуCall to a member function toArray() on array
В этой строке:vendor\predis\predis\src\Command\Redis\Search\FTSEARCH.php:34
Я добавил в функцию журнал, чтобы увидеть, как поступают данные, но не понимаю, что происходит :/ Я думаю, что вместо передачи разных массивов каким-то образом это должен быть массив строк, но я не уверен.
public function setArguments(array $arguments)
{
[$index, $query] = $arguments;
Log::info($arguments);
$commandArguments = (!empty($arguments[2])) ? $arguments[2]->toArray() : [];
parent::setArguments(array_merge(
[$index, $query],
$commandArguments
));
}
и часть журнала
[2023-08-25 04:58:14] local.INFO: array (
0 => 'conversations',
1 =>
Predis\Command\Argument\Search\SearchArguments::__set_state(array(
'sortingEnum' =>
array (
'asc' => 'ASC',
'desc' => 'DESC',
),
'arguments' =>
array (
0 => 'WITHSCORES',
1 => 'WITHPAYLOADS',
2 => 'FILTER',
3 => '*=>[KNN 2 @embedding $vec as score]',
),
)),
2 =>
array (
'vec' => '$���E�;ǻ���h���켩ǫ<�vX;��`����寍...
),
)
1 ответ
Я нашел решение!!!
public function searchSimilarityDocuments(int $entityId, array $vector, int $topK=2){
$filter = '*=>[KNN '.$topK.' @embedding $vec as score]';
// $filter = ["vec" => json_encode($vector)];
$arguments = new SearchArguments();
$arguments->addReturn(1, 'score');
$arguments->sortBy('score');
$arguments->dialect(2);
$arguments->limit(0, 2);
$vector = pack('f*', ...$vector);
// $vector = base64_encode($vector);
$query_params = [
'vec', $vector
];
$arguments->params($query_params);
$result = $this->r->ftSearch($this->indexName, $filter, $arguments);
return $result;
}