Учебник: Использование Cohere с Elasticsearch
Инструкции в этом учебнике показывают, как вычислять вложения с помощью Cohere с использованием API вывода и сохранять их для эффективного векторного или гибридного поиска в Elasticsearch. В этом учебнике будет использоваться Python Elasticsearch клиент для выполнения операций.
Вы узнаете, как:
- создать конечную точку вывода для вложения текста с использованием сервиса Cohere,
- создать необходимую карту индекса для индекса Elasticsearch,
- создать конвейер вывода для обработки документов в индекс вместе с вложениями,
- выполнить гибридный поиск по данным,
- переупорядочить результаты поиска, используя модель переупорядочения Cohere,
- разработать систему RAG с помощью API чата Cohere.
В учебнике используется набор данных SciFact.
Обратитесь к учебнику Cohere для примера использования другого набора данных.
Вы также можете просмотреть вариант этого учебника в Colab.
Требования
- Для использования API вывода с сервисом Cohere требуется платный аккаунт Cohere, так как использование бесплатной пробной версии API Cohere ограничено,
- учетная запись Elastic Cloud,
- Python 3.7 или выше.
Установить необходимые пакеты
Установите Elasticsearch и Cohere:
!pip install elasticsearch !pip install cohere
Импортируйте необходимые пакеты:
from elasticsearch import Elasticsearch, helpers import cohere import json import requests
Создать клиент Elasticsearch
Для создания клиента Elasticsearch вам потребуются:
ELASTICSEARCH_ENDPOINT = "elastic_endpoint" ELASTIC_API_KEY = "elastic_api_key" client = Elasticsearch( cloud_id=ELASTICSEARCH_ENDPOINT, api_key=ELASTIC_API_KEY ) # Confirm the client has connected print(client.info())
Создать конечную точку вывода
Создайте конечную точку вывода сначала. В этом примере конечная точка вывода использует модель Cohere's embed-english-v3.0 и embedding_type установлено на byte.
COHERE_API_KEY = "cohere_api_key"
client.inference.put_model(
task_type="text_embedding",
inference_id="cohere_embeddings",
body={
"service": "cohere",
"service_settings": {
"api_key": COHERE_API_KEY,
"model_id": "embed-english-v3.0",
"embedding_type": "byte"
}
},
) Вы можете найти свои API ключи в панели Cohere в разделе API ключи.
Создать карту индекса
Создайте карту индекса для индекса, который будет содержать вложения.
client.indices.create(
index="cohere-embeddings",
settings={"index": {"default_pipeline": "cohere_embeddings"}},
mappings={
"properties": {
"text_embedding": {
"type": "dense_vector",
"dims": 1024,
"element_type": "byte",
},
"text": {"type": "text"},
"id": {"type": "integer"},
"title": {"type": "text"}
}
},
) Создать конвейер вывода
Теперь у вас есть конечная точка вывода и индекс, готовый для хранения вложений. Следующим шагом является создание конвейера обработки с процессором вывода, который будет создавать вложения с помощью конечной точки вывода и сохранять их в индексе.
client.ingest.put_pipeline(
id="cohere_embeddings",
description="Ingest pipeline for Cohere inference.",
processors=[
{
"inference": {
"model_id": "cohere_embeddings",
"input_output": {
"input_field": "text",
"output_field": "text_embedding",
},
}
}
],
) Подготовить данные и вставить документы
В этом примере используется набор данных SciFact, который можно найти на HuggingFace.
url = 'https://huggingface.co/datasets/mteb/scifact/raw/main/corpus.jsonl'
# Fetch the JSONL data from the URL
response = requests.get(url)
response.raise_for_status() # Ensure noticing bad responses
# Split the content by new lines and parse each line as JSON
data = [json.loads(line) for line in response.text.strip().split('\n') if line]
# Now data is a list of dictionaries
# Change `_id` key to `id` as `_id` is a reserved key in Elasticsearch.
for item in data:
if '_id' in item:
item['id'] = item.pop('_id')
# Prepare the documents to be indexed
documents = []
for line in data:
data_dict = line
documents.append({
"_index": "cohere-embeddings",
"_source": data_dict,
}
)
# Use the bulk endpoint to index
helpers.bulk(client, documents)
print("Data ingestion completed, text embeddings generated!") Ваш индекс заполнен данными SciFact и векторными вложениями текста для поля текста.
Гибридный поиск
Давайте начнем запрос индекса!
Код ниже выполняет гибридный поиск. Запрос kNN вычисляет релевантность результатов поиска на основе векторного сходства, используя поле text_embedding, лексический запрос использует ретриваль BM25 для вычисления сходства по ключевым словам в полях title и text.
query = "What is biosimilarity?"
response = client.search(
index="cohere-embeddings",
size=100,
knn={
"field": "text_embedding",
"query_vector_builder": {
"text_embedding": {
"model_id": "cohere_embeddings",
"model_text": query,
}
},
"k": 10,
"num_candidates": 50,
},
query={
"multi_match": {
"query": query,
"fields": ["text", "title"]
}
}
)
raw_documents = response["hits"]["hits"]
# Display the first 10 results
for document in raw_documents[0:10]:
print(f'Title: {document["_source"]["title"]}\nText: {document["_source"]["text"]}\n')
# Format the documents for ranking
documents = []
for hit in response["hits"]["hits"]:
documents.append(hit["_source"]["text"]) Переупорядочить результаты поиска
Для более эффективного объединения результатов используйте модель переупорядочения Cohere’s Rerank v3 через API вывода для предоставления более точного семантического переупорядочения результатов.
Создайте конечную точку вывода с вашим API ключом Cohere и именем используемой модели в качестве model_id (rerank-english-v3.0 в данном примере).
client.inference.put_model(
task_type="rerank",
inference_id="cohere_rerank",
body={
"service": "cohere",
"service_settings":{
"api_key": COHERE_API_KEY,
"model_id": "rerank-english-v3.0"
},
"task_settings": {
"top_n": 10,
},
}
) Переупорядочить результаты с помощью новой конечной точки вывода.
# Pass the query and the search results to the service
response = client.inference.inference(
inference_id="cohere_rerank",
body={
"query": query,
"input": documents,
"task_settings": {
"return_documents": False
}
}
)
# Reconstruct the input documents based on the index provided in the rereank response
ranked_documents = []
for document in response.body["rerank"]:
ranked_documents.append({
"title": raw_documents[int(document["index"])]["_source"]["title"],
"text": raw_documents[int(document["index"])]["_source"]["text"]
})
# Print the top 10 results
for document in ranked_documents[0:10]:
print(f"Title: {document['title']}\nText: {document['text']}\n") Ответ — список документов в порядке убывания релевантности. Каждый документ имеет соответствующий индекс, который отражает порядок документов при отправке их в конечную точку вывода.
Построение системы RAG (Retrieval Augmented Generation) с Cohere и Elasticsearch
RAG — это метод генерации текста с использованием дополнительной информации, извлеченной из внешнего источника данных. С упорядоченными результатами вы можете построить систему RAG поверх того, что вы создали ранее, используя API чата Cohere.
Передайте полученные документы и запрос, чтобы получить обоснованный ответ с использованием новейшей генеративной модели Cohere Command R+.
Затем передайте запрос и документы в API чата и выведите ответ.
response = co.chat(message=query, documents=ranked_documents, model='command-r-plus')
source_documents = []
for citation in response.citations:
for document_id in citation.document_ids:
if document_id not in source_documents:
source_documents.append(document_id)
print(f"Query: {query}")
print(f"Response: {response.text}")
print("Sources:")
for document in response.documents:
if document['id'] in source_documents:
print(f"{document['title']}: {document['text']}") Ответ будет похож на этот:
Query: What is biosimilarity? Response: Biosimilarity is based on the comparability concept, which has been used successfully for several decades to ensure close similarity of a biological product before and after a manufacturing change. Over the last 10 years, experience with biosimilars has shown that even complex biotechnology-derived proteins can be copied successfully. Sources: Interchangeability of Biosimilars: A European Perspective: (...)
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/cohere-es.html