Вызов функции-члена 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;
    }
Другие вопросы по тегам