run text encoder functions in background thread for responsivness
This commit is contained in:
parent
a62b0aacf5
commit
7181bd5ffb
1 changed files with 22 additions and 4 deletions
24
src/query.rs
24
src/query.rs
|
@ -1,6 +1,7 @@
|
||||||
//! Query processing and document retrieval.
|
//! Query processing and document retrieval.
|
||||||
|
|
||||||
use snafu::{ResultExt, Snafu};
|
use snafu::{ResultExt, Snafu};
|
||||||
|
use tokio::task::JoinError;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
storage::{
|
storage::{
|
||||||
|
@ -18,12 +19,16 @@ pub enum AskError {
|
||||||
Encode { source: tokenize::EncodeError },
|
Encode { source: tokenize::EncodeError },
|
||||||
#[snafu(display("Failed to embed query."))]
|
#[snafu(display("Failed to embed query."))]
|
||||||
Embed { source: text_encoder::EmbedError },
|
Embed { source: text_encoder::EmbedError },
|
||||||
|
#[snafu(display("Embedding task failed to execute."))]
|
||||||
|
EmbedJoin { source: JoinError },
|
||||||
#[snafu(display("Failed to retrieve similar documents."))]
|
#[snafu(display("Failed to retrieve similar documents."))]
|
||||||
Query {
|
Query {
|
||||||
source: storage::queries::QueryError,
|
source: storage::queries::QueryError,
|
||||||
},
|
},
|
||||||
#[snafu(display("Failed to rerank documents."))]
|
#[snafu(display("Failed to rerank documents."))]
|
||||||
Rerank { source: text_encoder::RerankError },
|
Rerank { source: text_encoder::RerankError },
|
||||||
|
#[snafu(display("Reranking task failed to execute."))]
|
||||||
|
RerankJoin { source: JoinError },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Process a user query and return ranked document matches.
|
/// Process a user query and return ranked document matches.
|
||||||
|
@ -37,14 +42,27 @@ pub async fn ask(
|
||||||
limit: usize,
|
limit: usize,
|
||||||
) -> Result<Vec<DocumentMatch>, AskError> {
|
) -> Result<Vec<DocumentMatch>, AskError> {
|
||||||
let encodings = tokenizer.encode(query, chunk_size).context(EncodeSnafu)?;
|
let encodings = tokenizer.encode(query, chunk_size).context(EncodeSnafu)?;
|
||||||
let embeddings = embedder.embed(encodings[0].clone()).context(EmbedSnafu)?;
|
|
||||||
|
let embedder = embedder.clone();
|
||||||
|
let encoding = encodings[0].clone();
|
||||||
|
let embeddings = tokio::task::spawn_blocking(move || embedder.embed(encoding))
|
||||||
|
.await
|
||||||
|
.context(EmbedJoinSnafu)?
|
||||||
|
.context(EmbedSnafu)?;
|
||||||
|
|
||||||
let documents = db
|
let documents = db
|
||||||
.query(embeddings, (limit * 10) as i32)
|
.query(embeddings, (limit * 10) as i32)
|
||||||
.await
|
.await
|
||||||
.context(QuerySnafu)?;
|
.context(QuerySnafu)?;
|
||||||
|
|
||||||
let reranked_docs = reranker
|
let reranker = reranker.clone();
|
||||||
.rerank(query, documents, tokenizer, limit)
|
let tokenizer = tokenizer.clone();
|
||||||
|
let query = query.to_string();
|
||||||
|
let reranked_docs = tokio::task::spawn_blocking(move || {
|
||||||
|
reranker.rerank(&query, documents, &tokenizer, limit)
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.context(RerankJoinSnafu)?
|
||||||
.context(RerankSnafu)?;
|
.context(RerankSnafu)?;
|
||||||
|
|
||||||
Ok(reranked_docs)
|
Ok(reranked_docs)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue