Как сохранить вектор в PostgresDB правильно с помощью PGVector?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как сохранить вектор в PostgresDB правильно с помощью PGVector?

Сообщение Anonymous »

Я работаю над сохранением вектора, сгенерированного моделью модели Openai, вполне эмбления-ADA-002. Модель возвращает список двойных значений, которые я преобразую в строку перед сохранением ее в своей обогащении. Тем не менее, я сталкиваюсь с проблемой правильной сохранения обогащения в базе данных. Я попытался справиться с конверсией в репозитории, но сущность не хранится в базе данных. Интересно, что никакой ошибки не брошено; Операция просто не сохраняет объект.

Код: Выделить всё

@Entity
@Table(name = "enrichments")
@SequenceGenerator(name = "enrichments_seq", sequenceName = "enrichments_seq", allocationSize = 1)
public class EnrichmentEntity {

private static final Logger logger = LoggerFactory.getLogger(EnrichmentEntity.class);

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "PROFESSION")
private String profession;

@Embedded
private DocumentEntity document;

@Column(name = "INSURANCE")
private String insurance;

@Column(name = "EMBEDDING", columnDefinition = "TEXT")
private String embedding;

public EnrichmentEntity() {}

public EnrichmentEntity(String profession, DocumentEntity document, String insurance, String embedding) {
this.profession = profession;
this.document = document;
this.insurance = insurance;
this.embedding = embedding;
}
< /code>
Сервис: < /p>
 @Override
@Transactional
public String getOpenAiResponse(String profession, String insurance) {
String userPrompt = """
Du bist ein Assistent, der mir hilft, Berufe mit Daten anzureichern,
so dass diese in einer Vektordatenbank gespeichert und für die Suche verwendet werden können.

Du sollst nun den folgenden Beruf mit Daten anreichern (JSON-String): %s

Antworte in der folgenden Form:

{
"Beruf": "",
"Synonyme": "",
"Berufsgruppen": "",
"Beschreibung": "",
"Abkürzungen": "",
"Ausgeschrieben": ""
}

Beachte die Anweisungen in den spitzen Klammern und ersetze sie durch gültige Strings.
Antworte ausschließlich mit den geforderten Daten in **korrektem JSON-Format**.
""".strip().formatted(profession);

Map requestBody = new HashMap();
requestBody.put("model", deployment);

List messages = new ArrayList();
messages.add(Map.of("role", "system", "content", "Du bist ein Assistent, der Berufe mit strukturierten Daten anreichert."));
messages.add(Map.of("role", "user", "content", userPrompt));

requestBody.put("messages", messages);
requestBody.put("max_tokens", 800);
requestBody.put("temperature", 0);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(apiKey);

HttpEntity requestEntity = new HttpEntity(requestBody, headers);

ResponseEntity response = restTemplate.exchange(apiEndpoint, HttpMethod.POST, requestEntity, String.class);
String message = ChatGPTResponseMapper.extractContent(response.getBody());
DocumentEntity documentEntity = getEnrichedDocument(message);
List embeddingDocument = getEmbedding(documentEntity.toString());
String embeddingJson = convertListToString(embeddingDocument);
EnrichmentEntity enrichmentEntity = new EnrichmentEntity(profession, documentEntity, insurance, embeddingJson);
System.out.println(enrichmentEntity);
enrichmentRepository.saveEmbeddingAsVector(enrichmentEntity);
enrichmentRepository.flush();
System.out.println(enrichmentEntity);
return ChatGPTResponseMapper.extractContent(response.getBody());
}

@Override
public List getEmbedding(String text) {
Map requestBody = new HashMap();
requestBody.put("model", "text-embedding-ada-002");
requestBody.put("input", text);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(apiKey);

HttpEntity requestEntity = new HttpEntity(requestBody, headers);

ResponseEntity response = restTemplate.exchange(embeddingEndpoint, HttpMethod.POST, requestEntity, Map.class);

if (response.getBody() != null) {
List data = (List) response.getBody().get("data");
if (!data.isEmpty()) {
List embedding = (List) data.get(0).get("embedding");
return embedding;
}
}

throw new RuntimeException("No embedding received from OpenAI");
}

@Override
public List searchProfessions(String profession, String insurance) {
List embedding = this.getEmbedding(profession);

String embeddingString = convertListToStringForSearch(embedding);

return enrichmentRepository.findTop5ProfessionsByInsuranceAndSimilarity(insurance, embeddingString);
}

public DocumentEntity getEnrichedDocument(String enrichment) {
try {
String cleanedEnrichment = cleanJsonString(enrichment);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(cleanedEnrichment);

return new DocumentEntity(
jsonNode.get("Beruf").asText(),
jsonNode.get("Synonyme").asText(),
jsonNode.get("Berufsgruppen").asText(),
jsonNode.get("Beschreibung").asText(),
jsonNode.get("Abkürzungen").asText(),
jsonNode.get("Ausgeschrieben").asText()
);
} catch (Exception e) {
throw new RuntimeException("Fehler beim Verarbeiten der OpenAI-Antwort: "  + e.getMessage(), e);
}
}

private String cleanJsonString(String json) {
return json
.replaceAll("^```json", "")
.replaceAll("```$", "")
.trim();
}

private String convertListToString(List list) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
for (int i = 0; i < list.size(); i++) {
stringBuilder.append(list.get(i));
if (i < list.size() - 1) {
stringBuilder.append(", ");
}
}
stringBuilder.append("]");
return stringBuilder.toString();
}
< /code>
Репозиторий: < /p>
    @Modifying
@Transactional
@Query(value = """
INSERT INTO enrichments (profession, insurance, embedding, profession_name, synonyms, job_groups, description, abbreviations, full_written)
VALUES (:#{#entity.profession}, :#{#entity.insurance}, CAST(:#{#entity.embedding} AS vector),
:#{#entity.document.professionName}, :#{#entity.document.synonyms},
:#{#entity.document.jobGroups}, :#{#entity.document.description},
:#{#entity.document.abbreviations}, :#{#entity.document.fullWritten})
""", nativeQuery = true)
void saveEmbeddingAsVector(@Param("entity") EnrichmentEntity entity);
this is my table definition:
CREATE TABLE enrichments (
id SERIAL PRIMARY KEY,
profession TEXT,
insurance TEXT,
embedding vector(1536),
profession_name TEXT,
synonyms TEXT,
job_groups TEXT,
description TEXT,
Текст сокращений,
full_written text
); < /p>
Заранее спасибо :) < /p>

Подробнее здесь: https://stackoverflow.com/questions/795 ... g-pgvector
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу улучшить время отклика цепочки RAG, разработанной с помощью Ollama, langchain и pgvector?
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Свяжите одного агента и два инструмента в индексе ламы с помощью pgvector
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Свяжите одного агента и два инструмента в индексе ламы с помощью pgvector
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Spring Ai Pgvector | VectorStore Bad Return Type с Джексоном
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как передать вектор и вектор> из Java в функцию С++ с помощью jna [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»