@@ -21,7 +21,7 @@ pub struct EmbeddingParameters {
21
21
22
22
#[ tracing:: instrument]
23
23
pub async fn create_embeddings (
24
- message : Vec < String > ,
24
+ messages : Vec < String > ,
25
25
embed_type : & str ,
26
26
dataset_config : ServerDatasetConfiguration ,
27
27
) -> Result < Vec < Vec < f32 > > , ServiceError > {
@@ -68,63 +68,67 @@ pub async fn create_embeddings(
68
68
organization : None ,
69
69
} ;
70
70
71
- let clipped_messages = message
72
- . iter ( )
73
- . map ( |msg| {
74
- if msg. len ( ) > 7000 {
75
- msg. chars ( ) . take ( 20000 ) . collect ( )
76
- } else {
77
- msg. clone ( )
78
- }
79
- } )
80
- . collect :: < Vec < String > > ( ) ;
81
-
82
- let input = match embed_type {
83
- "doc" => EmbeddingInput :: StringArray ( clipped_messages) ,
84
- "query" => EmbeddingInput :: String (
85
- format ! (
86
- "{}{}" ,
87
- dataset_config. EMBEDDING_QUERY_PREFIX ,
88
- clipped_messages
89
- . first( )
90
- . unwrap_or( & "Arbitrary because query is empty" . to_string( ) )
91
- )
92
- . to_string ( ) ,
93
- ) ,
94
- _ => EmbeddingInput :: StringArray ( clipped_messages) ,
95
- } ;
96
-
97
- // Vectorize
98
- let parameters = EmbeddingParameters {
99
- model : dataset_config. EMBEDDING_MODEL_NAME . to_string ( ) ,
100
- input,
101
- } ;
102
-
103
- let embeddings_resp = ureq:: post ( & format ! (
104
- "{}/embeddings?api-version=2023-05-15" ,
105
- client. base_url
106
- ) )
107
- . set ( "Authorization" , & format ! ( "Bearer {}" , client. api_key) )
108
- . set ( "api-key" , & client. api_key )
109
- . set ( "Content-Type" , "application/json" )
110
- . send_json ( serde_json:: to_value ( parameters) . unwrap ( ) )
111
- . map_err ( |e| {
112
- ServiceError :: InternalServerError ( format ! (
113
- "Could not get embeddings from server: {:?}, {:?}" ,
114
- e,
115
- e. to_string( )
71
+ let mut all_vectors = vec ! [ ] ;
72
+ let thirty_message_groups = messages. chunks ( 30 ) . collect :: < Vec < _ > > ( ) ;
73
+
74
+ for thirty_messages in thirty_message_groups {
75
+ let clipped_messages = thirty_messages
76
+ . iter ( )
77
+ . map ( |msg| {
78
+ if msg. len ( ) > 7000 {
79
+ msg. chars ( ) . take ( 20000 ) . collect ( )
80
+ } else {
81
+ msg. clone ( )
82
+ }
83
+ } )
84
+ . collect :: < Vec < String > > ( ) ;
85
+
86
+ let input = match embed_type {
87
+ "doc" => EmbeddingInput :: StringArray ( clipped_messages) ,
88
+ "query" => EmbeddingInput :: String (
89
+ format ! (
90
+ "{}{}" ,
91
+ dataset_config. EMBEDDING_QUERY_PREFIX ,
92
+ clipped_messages
93
+ . first( )
94
+ . unwrap_or( & "Arbitrary because query is empty" . to_string( ) )
95
+ )
96
+ . to_string ( ) ,
97
+ ) ,
98
+ _ => EmbeddingInput :: StringArray ( clipped_messages) ,
99
+ } ;
100
+
101
+ // Vectorize
102
+ let parameters = EmbeddingParameters {
103
+ model : dataset_config. EMBEDDING_MODEL_NAME . to_string ( ) ,
104
+ input,
105
+ } ;
106
+
107
+ let embeddings_resp = ureq:: post ( & format ! (
108
+ "{}/embeddings?api-version=2023-05-15" ,
109
+ client. base_url
116
110
) )
117
- } ) ?;
118
-
119
- let embeddings: EmbeddingResponse = format_response ( embeddings_resp. into_string ( ) . unwrap ( ) )
111
+ . set ( "Authorization" , & format ! ( "Bearer {}" , client. api_key) )
112
+ . set ( "api-key" , & client. api_key )
113
+ . set ( "Content-Type" , "application/json" )
114
+ . send_json ( serde_json:: to_value ( parameters) . unwrap ( ) )
120
115
. map_err ( |e| {
121
- log:: error!( "Failed to format response from embeddings server {:?}" , e) ;
122
- ServiceError :: InternalServerError (
123
- "Failed to format response from embeddings server" . to_owned ( ) ,
124
- )
116
+ ServiceError :: InternalServerError ( format ! (
117
+ "Could not get embeddings from server: {:?}, {:?}" ,
118
+ e,
119
+ e. to_string( )
120
+ ) )
125
121
} ) ?;
126
122
127
- let vectors: Vec < Vec < f32 > > = embeddings
123
+ let embeddings: EmbeddingResponse = format_response ( embeddings_resp. into_string ( ) . unwrap ( ) )
124
+ . map_err ( |e| {
125
+ log:: error!( "Failed to format response from embeddings server {:?}" , e) ;
126
+ ServiceError :: InternalServerError (
127
+ "Failed to format response from embeddings server" . to_owned ( ) ,
128
+ )
129
+ } ) ?;
130
+
131
+ let vectors: Vec < Vec < f32 > > = embeddings
128
132
. data
129
133
. into_iter ( )
130
134
. map ( |x| match x. embedding {
@@ -136,14 +140,17 @@ pub async fn create_embeddings(
136
140
} )
137
141
. collect ( ) ;
138
142
139
- if vectors. iter ( ) . any ( |x| x. is_empty ( ) ) {
140
- return Err ( ServiceError :: InternalServerError (
141
- "Embedding server responded with Base64 and that is not currently supported for embeddings" . to_owned ( ) ,
142
- ) ) ;
143
+ if vectors. iter ( ) . any ( |x| x. is_empty ( ) ) {
144
+ return Err ( ServiceError :: InternalServerError (
145
+ "Embedding server responded with Base64 and that is not currently supported for embeddings" . to_owned ( ) ,
146
+ ) ) ;
147
+ }
148
+
149
+ all_vectors. extend ( vectors) ;
143
150
}
144
151
145
152
transaction. finish ( ) ;
146
- Ok ( vectors )
153
+ Ok ( all_vectors )
147
154
}
148
155
149
156
#[ derive( Debug , Serialize , Deserialize ) ]
0 commit comments