Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Documentation/Classes/Reranker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Reranker

The `Reranker` class provides a client for accessing the proprietary `/rerank` endpoint available in some providers and inference servers (not OpenAI).

## Configuration Properties

| Property Name | Type | Description | Optional |
|-------------------|-------|-----------------------------------|----------|
| `apiKey` | Text | Your API Key. | Can be required by the provider |
| `baseURL` | Text | Base URL for API requests. | No |
33 changes: 33 additions & 0 deletions Documentation/Classes/RerankerAPI.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# RerankerAPI

The `RerankerAPI` class provides functionalities for reranking using the proprietary `/rerank` API.

## Functions

### create()

**create**(*query* : [RerankerQuery](RerankerQuery.md) ; *parameters* : [RerankerParameters](RerankerParameters.md)) : RerankerResult

| Parameter | Type | Description |
|-------------------|-------------------------------------------|-------------------------------------------|
| *query* | [RerankerQuery](RerankerQuery.md) | The search query and a collection of texts that will be compared to the query. |
| *parameters* | [RerankerParameters](RerankerParameters.md) | The model name and maximum number of rerank results to return. |

#### Example Usages

##### Rerank a collection of documents for a query and get the top `3` results

```4d
var $client:=cs.AIKit.Reranker.new({baseURL: "http://127.0.0.1:8080/v1"})

var $query:=cs.AIKit.RerankerQuery.new({query: "What is deep learning?"; documents: [\
"Deep learning is a subset of machine learning based on artificial neural networks."; \
"Apples are red and sweet fruits that grow on trees."; \
"The theory of relativity was developed by Albert Einstein."; \
"Neural networks simulate the human brain to solve complex problems."\
]})

var $parameters:=cs.AIKit.RerankerParameters.new({top_n: 3})

var $result:=$client.rerank.create($query; $parameters)
```
10 changes: 10 additions & 0 deletions Documentation/Classes/RerankerParameters.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# RerankerParameters

The `RerankerParameters` class is designed to configure and manage the parameters used for reranking through the proprietary `/rerank` API.

## Properties

| Property Name | Type | Description |
|--------------------|---------|--------------------------------------------------------------------------------------------------|
| `model` | Text | The model used to rerank documents against a query. |
| `top_n` | Integer | The maximum number of rerank results to return. (default: `3`) |
10 changes: 10 additions & 0 deletions Documentation/Classes/RerankerQuery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# RerankerQuery

The `RerankerQuery` class represents a query object to be sent to the proprietary `/rerank` API.

## Properties

| Property Name | Type | Description |
|------------------|----------|------------------------------------------------------------------|
| `query` | Text | The search query. |
| `documents` | Collection | A collection of texts that will be compared to the `query`. |
22 changes: 22 additions & 0 deletions Documentation/Classes/RerankerResult.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# RerankerResult

The `RerankerResult` class is designed to handle the response from HTTP requests and provides functions to evaluate the success of the rerank request.

## Computed properties

| Property | Type | Description |
|-------------|------------|-----------------------------------------------------------------------------|
| `results` | Collecion | Returns a collection of `result` objects. |

### result

Each element of the `results` property is an object with the following properties:

| Field | Type | Description |
|-------------|--------|--------------------------------------------------|
|`index`|Integer|The `0`-based position index in the original list of documents submitted for reranking.
|`relevance_score`|Real|A score between `0` and `1` inclusive. A score closer to `1` indicates a high relevance to the query. A score closer to `0` indicates a low relevance to the query.

### Normalization

The `/rerank` endpoint of some inference engines (e.g. `llama-server`) are designed to return raw logits whereas most servers return sigmoid normalized values in `relevance_score`. The `results` computed property applies sigmoid normalization to all scores if at least one of them is greater than `1` or a negative value.
27 changes: 27 additions & 0 deletions Project/Sources/Classes/Reranker.4dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
property rerank : cs:C1710.RerankerAPI
property _client : cs:C1710.OpenAI

Function _isObjectDelegate($object : Variant) : Boolean

return (Value type:C1509($object)=Is object:K8:27) && ($object#Null:C1517) && (OB Instance of:C1731($object; cs:C1710.OpenAI))

Class constructor( ... : Variant)
var $parameters:=Copy parameters:C1790()

Case of
: ($parameters.length=0)
This:C1470._client:=cs:C1710.OpenAI.new()
: (This:C1470._isObjectDelegate($parameters[0]))
If ($parameters.length=2) && (Value type:C1509($parameters[1])=Is object:K8:27)
This:C1470._client:=OB Copy:C1225($parameters[0])
This:C1470._client._configureParameters($parameters[1]) //override
Else
This:C1470._client:=$parameters[0] //shallow copy
End if
: ($parameters.length=2)
This:C1470._client:=cs:C1710.OpenAI.new($parameters[0]; $parameters[1])
: ($parameters.length=1)
This:C1470._client:=cs:C1710.OpenAI.new($parameters[0])
End case

This:C1470.rerank:=cs:C1710.RerankerAPI.new(This:C1470._client)
16 changes: 16 additions & 0 deletions Project/Sources/Classes/RerankerAPI.4dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Class extends OpenAIAPIResource

Class constructor($client : cs:C1710.OpenAI)
Super:C1705($client)


Function create($query : cs:C1710.RerankerQuery; $parameters : cs:C1710.RerankerParameters) : cs:C1710.RerankerResult
If (Not:C34(OB Instance of:C1731($parameters; cs:C1710.RerankerParameters)))
$parameters:=cs:C1710.RerankerParameters.new($parameters)
End if

var $body:=$parameters.body()
$body.query:=$query.query
$body.documents:=$query.documents

return This:C1470._client._post("/rerank"; $body; $parameters; cs:C1710.RerankerResult)
19 changes: 19 additions & 0 deletions Project/Sources/Classes/RerankerParameters.4dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
property model : Text
property top_n : Integer:=3

Class extends OpenAIParameters

Class constructor($object : Object)
Super:C1705($object)

Function body() : Object
var $body:=Super:C1706.body()

If (Length:C16(This:C1470.model)>0)
$body.model:=This:C1470.model
End if
If (This:C1470.top_n>0)
$body.top_n:=This:C1470.top_n
End if

return $body
16 changes: 16 additions & 0 deletions Project/Sources/Classes/RerankerQuery.4dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
property query : Text:=""
property documents : Collection:=[]

Class constructor($query : Object)

If ($query=Null:C1517)
return
End if

If (Value type:C1509($query.query)=Is text:K8:3)
This:C1470.query:=$query.query
End if

If (Value type:C1509($query.documents)=Is collection:K8:32)
This:C1470.documents:=$query.documents
End if
28 changes: 28 additions & 0 deletions Project/Sources/Classes/RerankerResult.4dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Class extends OpenAIResult

Class constructor

Super:C1705()

Function _sigmoid($element : Object)

$element.result:={index: $element.value.index; relevance_score: 1/(1+Exp:C21(-$element.value.relevance_score))}

Function get results : Collection
var $body:=This:C1470._objectBody()
var $results : Collection

Case of
: (Value type:C1509($body.results)=Is collection:K8:32)
$results:=$body.results
: (Value type:C1509($body.data)=Is collection:K8:32)
$results:=$body.data
Else
$results:=[]
End case

If ($results.some(Formula:C1597($1.result:=($1.value.relevance_score>1) || ($1.value.relevance_score<0))))
$results:=$results.map(This:C1470._sigmoid)
End if

return $results
9 changes: 9 additions & 0 deletions Project/Sources/folders.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@
"OpenAIProviders"
]
},
"Reranker": {
"classes": [
"Reranker",
"RerankerAPI",
"RerankerParameters",
"RerankerQuery",
"RerankerResult"
]
},
"Tests": {
"groups": [
"FormDemo"
Expand Down
Loading