voyageai 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac2d6a908abb5d1383cdf74f736b5aa7eae9fc9a66634ec1fd40ce8710571763
4
- data.tar.gz: 7df317f435acc60bde69219f7dc50e19952433dce8d4dee9ebda10a8a6b0ba46
3
+ metadata.gz: 651f676fcb2fa068cf44f37fda02d1185b776ca83fc0f6099362d5e4deb7a250
4
+ data.tar.gz: f3a22402be82fd02ec94628aeab067aec45cfcc6c203f7d75af13a00f95b580b
5
5
  SHA512:
6
- metadata.gz: af23bbd90f54d69d912223071a4a9ca3ba9d4128c10e7d5e60ce57632c54a244f4dc656ae6dd3a923d8b8273e1836ae670401a8de7de155350d1a1a5e2e24a1b
7
- data.tar.gz: a778faecde1b31e4c7a9c8955019af8ec618076dff925b3d26dce0bceeaae054174f24cfeb120d4c076750fcc730679338014c50c5ffdfe47ee2bad9a10700a4
6
+ metadata.gz: 0b70798b6ee15febae3f263def8f118b4177f73e553bf3463e77f2638259b62d95025dc6336049eedec71fdccdac80512e54c55bd65b70333fc3f29518d97367
7
+ data.tar.gz: 2aa09dc2ea94771f309af4e40aa4340842b1181e1e82ddc270b75bddd5120044d0dd195bf687e302cf270da12c312261dc6a523e5b69a0184bacf0aafbb10da1
data/README.md CHANGED
@@ -82,3 +82,81 @@ VoyageAI.configure do |config|
82
82
  config.logger = Logger.new(STDOUT)
83
83
  end
84
84
  ```
85
+
86
+ ## Examples
87
+
88
+ ```ruby
89
+ require "voyageai"
90
+
91
+ Entry = Data.define(:document, :embedding)
92
+
93
+ VOYAGEAI = VoyageAI::Client.new
94
+
95
+ DOCUMENTS = [
96
+ "John is a musician.",
97
+ "Paul is a plumber.",
98
+ "George is a teacher.",
99
+ "Ringo is a doctor.",
100
+ "Lisa is a lawyer.",
101
+ "Stuart is a painter.",
102
+ "Brian is a writer.",
103
+ "Jane is a chef.",
104
+ "Bill is a nurse.",
105
+ "Susan is a carpenter.",
106
+ ].freeze
107
+
108
+ embeddings = VOYAGEAI.embed(DOCUMENTS, input_type: "document").embeddings
109
+
110
+ ENTRIES = DOCUMENTS.zip(embeddings).map do |document, embedding|
111
+ Entry.new(document:, embedding:)
112
+ end
113
+
114
+ # @param src [Array<Float>]
115
+ # @param dst [Array<Float>]
116
+ #
117
+ # @return [Float]
118
+ def euclidean_distance(src, dst)
119
+ Math.sqrt(src.zip(dst).map { |a, b| (a - b)**2 }.reduce(:+))
120
+ end
121
+
122
+ # @param query [String]
123
+ # @param limit [Integer]
124
+ #
125
+ # @return [Array<String>]
126
+ def nearest_documents(query:, limit: 4)
127
+ embedding = VOYAGEAI.embed(query, input_type: "query").embedding
128
+
129
+ ENTRIES
130
+ .sort_by { |entry| euclidean_distance(entry.embedding, embedding) }
131
+ .first(limit)
132
+ .map(&:document)
133
+ end
134
+
135
+ # @param query [String]
136
+ def search(query:)
137
+ documents = nearest_documents(query:)
138
+
139
+ results = VOYAGEAI.rerank(query:, documents:, top_k: 2).results
140
+
141
+ puts "query=#{query.inspect}"
142
+ results.each do |reranking|
143
+ document = documents[reranking.index]
144
+ puts("document=#{document.inspect} relevance_score=#{reranking.relevance_score}")
145
+ end
146
+ end
147
+
148
+ search(query: "What do George and Ringo do?")
149
+ search(query: "Who works in the medical field?")
150
+ ```
151
+
152
+ ```
153
+ query="What do George and Ringo do?"
154
+ document="Ringo is a doctor." relevance_score=0.67968755
155
+ document="George is a teacher." relevance_score=0.58593755
156
+ ```
157
+
158
+ ```
159
+ query="Who works in the medical field?"
160
+ document="Bill is a nurse." relevance_score=0.55078125
161
+ document="Ringo is a doctor." relevance_score=0.50390625
162
+ ```
@@ -37,12 +37,14 @@ module VoyageAI
37
37
  "#<#{self.class.name} api_key=#{masked_api_key.inspect} host=#{@host.inspect} version=#{@version.inspect}>"
38
38
  end
39
39
 
40
- # @param model [String] optional (e.g. VoyageAI::Model::VOYAGE or "voyage-3")
41
40
  # @param input [String, Array<String>] required (e.g. "Sample" or ["Sample 1", "Sample 2", ...])
41
+ # @param model [String] optional (e.g. VoyageAI::Model::VOYAGE or "voyage-3")
42
+ # @param input_type [Symbol] optional (e.g. :query or :document)
43
+ # @param truncation [Boolean] optional
42
44
  #
43
45
  # @return [Embedding]
44
- def embed(input, model: Model::VOYAGE)
45
- payload = { input: arrayify(input), model: model }
46
+ def embed(input, model: Model::VOYAGE, input_type: nil, truncation: nil)
47
+ payload = { input: arrayify(input), model: model, truncation:, input_type: }.compact
46
48
  response = http.accept(:json).post("/#{@version}/embeddings", json: payload)
47
49
 
48
50
  raise RequestError.new(response:) unless response.status.ok?
@@ -3,6 +3,7 @@
3
3
  module VoyageAI
4
4
  module Model
5
5
  VOYAGE_3 = "voyage-3"
6
+ VOYAGE_3_LARGE = "voyage-3-large"
6
7
  VOYAGE_3_LITE = "voyage-3-lite"
7
8
  VOYAGE_FINANCE_2 = "voyage-finance-2"
8
9
  VOYAGE_MULTILINGUAL_2 = "age-multilingual-2"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VoyageAI
4
- VERSION = "1.3.0"
4
+ VERSION = "1.5.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voyageai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Sylvestre
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-22 00:00:00.000000000 Z
10
+ date: 2025-01-08 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: http
@@ -66,7 +65,6 @@ metadata:
66
65
  homepage_uri: https://github.com/ksylvest/voyageai
67
66
  changelog_uri: https://github.com/ksylvest/voyageai/releases
68
67
  rubygems_mfa_required: 'true'
69
- post_install_message:
70
68
  rdoc_options: []
71
69
  require_paths:
72
70
  - lib
@@ -81,8 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
79
  - !ruby/object:Gem::Version
82
80
  version: '0'
83
81
  requirements: []
84
- rubygems_version: 3.5.18
85
- signing_key:
82
+ rubygems_version: 3.6.2
86
83
  specification_version: 4
87
84
  summary: A client for voyageai.com.
88
85
  test_files: []