在数组上调用成员函数toArray()- predis laravel

n53p2ov0  于 8个月前  发布在  Redis
关注(0)|答案(1)|浏览(83)

我正尝试使用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中做同样的事情,但我没有找到库的文档,我尝试的东西不起作用。
在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\FTT.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;��`����寍...
  ),
)
eivgtgni

eivgtgni1#

我找到解决办法了!!!

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

相关问题