MME-4 Save summary text to db, fix queries, tweak backfill.
This commit is contained in:
parent
fa7afbaa76
commit
8018301d3c
@ -3,8 +3,10 @@ package app.mealsmadeeasy.api;
|
|||||||
import app.mealsmadeeasy.api.job.JobService;
|
import app.mealsmadeeasy.api.job.JobService;
|
||||||
import app.mealsmadeeasy.api.recipe.Recipe;
|
import app.mealsmadeeasy.api.recipe.Recipe;
|
||||||
import app.mealsmadeeasy.api.recipe.RecipeRepository;
|
import app.mealsmadeeasy.api.recipe.RecipeRepository;
|
||||||
|
import app.mealsmadeeasy.api.recipe.RecipeSummary;
|
||||||
import app.mealsmadeeasy.api.recipe.job.RecipeSummaryJobHandler;
|
import app.mealsmadeeasy.api.recipe.job.RecipeSummaryJobHandler;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.springframework.boot.ApplicationArguments;
|
import org.springframework.boot.ApplicationArguments;
|
||||||
import org.springframework.boot.ApplicationRunner;
|
import org.springframework.boot.ApplicationRunner;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
@ -22,14 +24,16 @@ public class BackfillRecipeEmbeddings implements ApplicationRunner {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) {
|
public void run(ApplicationArguments args) {
|
||||||
final List<Recipe> recipeEntities = this.recipeRepository.findAllBySummaryIsNull();
|
final List<Recipe> recipeEntities = this.recipeRepository.findAll();
|
||||||
for (final Recipe recipe : recipeEntities) {
|
for (final Recipe recipe : recipeEntities) {
|
||||||
|
final @Nullable RecipeSummary summary = recipe.getSummary();
|
||||||
|
if (summary == null || summary.getSummary() == null || summary.getEmbedding() == null) {
|
||||||
this.jobService.create(
|
this.jobService.create(
|
||||||
RecipeSummaryJobHandler.JOB_KEY,
|
RecipeSummaryJobHandler.JOB_KEY,
|
||||||
new RecipeSummaryJobHandler.RecipeSummaryJobPayload(recipe.getId())
|
new RecipeSummaryJobHandler.RecipeSummaryJobPayload(recipe.getId())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.recipeRepository.flush();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -109,7 +109,7 @@ public class DevConfiguration {
|
|||||||
.isPublic(frontMatter.isPublic)
|
.isPublic(frontMatter.isPublic)
|
||||||
.mainImage(mainImage)
|
.mainImage(mainImage)
|
||||||
.build();
|
.build();
|
||||||
final Recipe recipe = this.recipeService.create(testUser, recipeCreateSpec, false);
|
final Recipe recipe = this.recipeService.create(testUser, recipeCreateSpec, true);
|
||||||
logger.info("Created recipe {}", recipe);
|
logger.info("Created recipe {}", recipe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,12 +41,10 @@ public interface RecipeRepository extends JpaRepository<Recipe, Integer> {
|
|||||||
@Query("SELECT r FROM Recipe r WHERE r.isPublic OR r.owner = ?1 OR ?1 MEMBER OF r.viewers")
|
@Query("SELECT r FROM Recipe r WHERE r.isPublic OR r.owner = ?1 OR ?1 MEMBER OF r.viewers")
|
||||||
Slice<Recipe> findAllViewableBy(User viewer, Pageable pageable);
|
Slice<Recipe> findAllViewableBy(User viewer, Pageable pageable);
|
||||||
|
|
||||||
List<Recipe> findAllBySummaryIsNull();
|
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
nativeQuery = true,
|
nativeQuery = true,
|
||||||
value = """
|
value = """
|
||||||
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_embedding)
|
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_summary)
|
||||||
SELECT r.* FROM distances d
|
SELECT r.* FROM distances d
|
||||||
INNER JOIN recipe r ON r.id = d.recipe_id
|
INNER JOIN recipe r ON r.id = d.recipe_id
|
||||||
WHERE d.distance < ?2 AND (
|
WHERE d.distance < ?2 AND (
|
||||||
@ -62,7 +60,7 @@ public interface RecipeRepository extends JpaRepository<Recipe, Integer> {
|
|||||||
@Query(
|
@Query(
|
||||||
nativeQuery = true,
|
nativeQuery = true,
|
||||||
value = """
|
value = """
|
||||||
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_embedding)
|
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_summary)
|
||||||
SELECT r.* FROM distances d
|
SELECT r.* FROM distances d
|
||||||
INNER JOIN recipe r ON r.id = d.recipe_id
|
INNER JOIN recipe r ON r.id = d.recipe_id
|
||||||
WHERE d.distance < ?2 AND r.is_public = TRUE
|
WHERE d.distance < ?2 AND r.is_public = TRUE
|
||||||
|
|||||||
@ -61,11 +61,10 @@ public class RecipeSummaryJobHandler implements JobHandler<RecipeSummaryJobHandl
|
|||||||
}
|
}
|
||||||
logger.debug("Summary of recipe with id {}: {}", recipe.getId(), summary);
|
logger.debug("Summary of recipe with id {}: {}", recipe.getId(), summary);
|
||||||
|
|
||||||
// todo: save summary to db
|
|
||||||
|
|
||||||
final float[] summaryEmbedding = this.embeddingModel.embed(summary);
|
final float[] summaryEmbedding = this.embeddingModel.embed(summary);
|
||||||
|
|
||||||
final RecipeSummary recipeSummary = new RecipeSummary();
|
final RecipeSummary recipeSummary = recipe.getSummary() != null ? recipe.getSummary() : new RecipeSummary();
|
||||||
|
recipeSummary.setSummary(summary);
|
||||||
recipeSummary.setEmbedding(summaryEmbedding);
|
recipeSummary.setEmbedding(summaryEmbedding);
|
||||||
recipeSummary.setRecipe(recipe);
|
recipeSummary.setRecipe(recipe);
|
||||||
recipeSummary.setTimestamp(OffsetDateTime.now());
|
recipeSummary.setTimestamp(OffsetDateTime.now());
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user