use std::sync::Arc;
use anyhow::Result;
use crate::DatabendLLM;
use crate::Documents;
use crate::Embedding;
use crate::LLM;
pub struct DatabendEmbedding {
llm: Arc<DatabendLLM>,
}
impl DatabendEmbedding {
pub fn create(dsn: &str) -> Self {
DatabendEmbedding {
llm: DatabendLLM::create(dsn),
}
}
}
#[async_trait::async_trait]
impl Embedding for DatabendEmbedding {
async fn embed_query(&self, input: &str) -> Result<Vec<f32>> {
let inputs = vec![input.to_string()];
let result = self.llm.embedding(inputs).await?;
if result.embeddings.is_empty() {
Ok(vec![])
} else {
Ok(result.embeddings[0].clone())
}
}
async fn embed_documents(&self, inputs: &Documents) -> Result<Vec<Vec<f32>>> {
let inputs = inputs.iter().map(|x| x.content).collect::<Vec<_>>();
let result = self.llm.embedding(inputs).await?;
Ok(result.embeddings)
}
}