Генерация с дополнением поиска с цитатами
Когда вы получаете ответы от своих приложений на основе больших языковых моделей (LLM), хотите ли вы знать, откуда взялся этот ответ? В этом сила цитирования или указания источников. В этом руководстве мы рассмотрим, почему важно включать цитаты, как можно получить цитаты на высоком уровне, а затем погрузимся в пример кода!
Зачем цитировать источники вашей Retrieval Augmented Generation (RAG)?
Retrieval Augmented Generation — это техника, используемая с приложениями на основе LLM для дополнения их знаний. Одна из основных слабостей LLM в целом — отсутствие актуальных или предметно-специфических знаний. Есть два основных решения этой проблемы: дообучение и retrieval augmented generation.
Здесь, в Zilliz, а также в других компаниях, таких как OpenAI, мы предлагаем RAG как более предпочтительный вариант по сравнению с дообучением для фактологического поиска. Дообучение дороже и требует гораздо больше данных; однако это хороший вариант для переноса стиля. RAG использует векторную базу данных, такую как Milvus, чтобы внедрить ваши знания в ваше приложение.
Вместо того чтобы спрашивать LLM о вашем продукте или документации, вы можете использовать векторную базу данных как хранилище истины. Это гарантирует, что ваше приложение возвращает корректные знания и не галлюцинирует в попытке компенсировать недостаток данных. По мере того как вы начинаете добавлять больше документов и сценариев использования, становится всё более важно знать, где находится эта информация.
Именно здесь в игру вступают цитаты и указание источников. Когда вы получаете ответ от своего приложения на основе LLM, вы хотите знать, как оно получило эту информацию. Получение ответов с цитатами или указанием источников показывает вам, из какого фрагмента текста/откуда в тексте был получен ваш ответ. По мере роста объёма данных это становится критически важным для определения достоверных ответов.
Как можно цитировать источники RAG?
LLM повысили популярность смежных инструментов, таких как векторные базы данных вроде Milvus. Это также привело к появлению фреймворков, таких как LangChain и LlamaIndex. В рамках этого роста популярности retrieval augmented generation стала важнейшим приложением, особенно когда речь идёт о поиске информации по вашим внутренним данным.
Помимо извлечения данных, многие поняли, что добавление цитат к извлечённым данным делает ваше приложение более надёжным, более объяснимым и предоставляет больше контекста. Итак, как это сделать? Существует множество способов. Вы можете хранить фрагменты текста внутри вашей векторной базы данных, если она поддерживает метаданные, как Milvus, или можете использовать фреймворк вроде LlamaIndex. В этом руководстве будет показано, как выполнять RAG с цитатами с использованием LlamaIndex и Milvus.
Пример Retrieval Augmented Generation с источниками
Давайте погрузимся в код. Чтобы выполнить это руководство, вам нужно pip install milvus llama-index python-dotenv. Библиотеки milvus и llama-index предназначены для основной функциональности, тогда как python-dotenv используется для загрузки переменных окружения, таких как ваш ключ API OpenAI. В этом примере мы извлекаем некоторые данные о разных городах из Wikipedia и выполняем по ним запрос с цитатами.
Мы импортируем некоторые необходимые библиотеки и загружаем наш ключ API OpenAI. Нам нужны семь подмодулей из LlamaIndex. В произвольном порядке: OpenAI для доступа к LLM, CitationQueryEngine для создания механизма запросов с цитированием и MilvusVectorStore для использования Milvus в качестве векторного хранилища. Кроме того, мы также импортируем VectorStoreIndex для использования Milvus, SimpleDirectoryReader для чтения локальных данных, а также StorageContext и ServiceContext, чтобы предоставить векторному индексу доступ к Milvus. Наконец, мы используем load_dotenv для загрузки нашего ключа API OpenAI.
from llama_index.llms import OpenAI
from llama_index.query_engine import CitationQueryEngine
from llama_index import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
ServiceContext,
)
from llama_index.vector_stores import MilvusVectorStore
from milvus import default_server
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")
Сбор некоторых тестовых данных
Давайте начнем наш проект с того, что сначала подготовим данные, с которыми можно работать. В этом примере мы собираем некоторые данные из Wikipedia. Фактически мы собираем те же данные, что и при создании механизма запросов по нескольким документам. Приведенный ниже код обращается к API Wikipedia для страниц, указанных в списке wiki_titles. Он сохраняет результат локально в текстовый файл.
wiki_titles = ["Toronto", "Seattle", "San Francisco", "Chicago", "Boston", "Washington, D.C.", "Cambridge, Massachusetts", "Houston"]
from pathlib import Path
import requests
for title in wiki_titles:
response = requests.get(
'https://en.wikipedia.org/w/api.php',
params={
'action': 'query',
'format': 'json',
'titles': title,
'prop': 'extracts',
'explaintext': True,
}
).json()
page = next(iter(response['query']['pages'].values()))
wiki_text = page['extract']
data_path = Path('data')
if not data_path.exists():
Path.mkdir(data_path)
with open(data_path / f"{title}.txt", 'w') as fp:
fp.write(wiki_text)
Настройка вашего векторного хранилища в LlamaIndex
Теперь, когда у нас есть все данные, мы можем настроить логику приложения для нашего RAG-приложения с цитированием. Для начала первое, что нам нужно сделать, — запустить векторную базу данных. В этом примере мы используем Milvus Lite, чтобы запустить ее прямо в нашем notebook. Затем мы используем модуль MilvusVectorStore из LlamaIndex для подключения к Milvus в качестве нашего векторного хранилища.
default_server.start()
vector_store = MilvusVectorStore(
collection_name="citations",
host="127.0.0.1",
port=default_server.listen_port
)
Далее давайте создадим контексты для нашего индекса. Сервисный контекст сообщает индексу и ретриверу, какие сервисы использовать. В данном случае он передает GPT 3.5 Turbo в качестве желаемой LLM. Мы также создаем контекст хранилища, чтобы индекс знал, где хранить данные и выполнять запросы к ним. В этом случае мы передаем объект векторного хранилища Milvus, который создали выше.
service_context = ServiceContext.from_defaults(
llm=OpenAI(model="gpt-3.5-turbo", temperature=0)
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
После того как все это настроено, мы можем загрузить данные, которые собрали ранее, и создать индекс векторного хранилища из этих документов.
documents = SimpleDirectoryReader("./data/").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context, storage_context=storage_context)
Запросы с цитированием
Теперь мы можем создать Citation Query Engine. Мы передаем ему векторный индекс, который построили ранее, а также параметры о том, сколько результатов возвращать, и размер фрагмента цитаты. Это все, что нужно для настройки цитирования, а следующий шаг — выполнить запрос к движку.
query_engine = CitationQueryEngine.from_args(
index,
similarity_top_k=3,
# here we can control how granular citation sources are, the default is 512
citation_chunk_size=512,
)
response = query_engine.query("Does Seattle or Houston have a bigger airport?")
print(response)
for source in response.source_nodes:
print(source.node.get_text())
Когда мы выполняем запрос, ответ выглядит примерно так.
Запросы с цитированием
Резюме
В этом руководстве мы узнали, как выполнять retrieval augmented generation с цитированием (атрибуциями). Retrieval augmented generation — это тип LLM-приложения, которое хотят создавать многие предприятия. Помимо извлечения и форматирования вашей информации в удобоваримом формате, мы также хотим знать, откуда поступает информация.
Мы можем создать такой тип RAG-приложения, используя LlamaIndex в качестве маршрутизатора данных и Milvus в качестве векторного хранилища. Мы начали со сбора некоторых данных из Wikipedia, чтобы показать, как это работает. Затем мы запускаем экземпляр Milvus и создаем экземпляр векторного хранилища в LlamaIndex. После этого мы помещаем наши данные в Milvus и используем LlamaIndex для отслеживания атрибуций и цитат с помощью механизма запросов с цитированием. Затем мы можем выполнять запросы к этому механизму запросов и получать ответы, включая то, из какого места в тексте и какой именно текст мы используем для нашего ответа.
Читать далее

Zilliz Cloud Audit Logs Goes GA: Security, Compliance, and Transparency at Scale
Zilliz Cloud Audit Logs are now GA, giving enterprises real-time visibility, compliance-ready trails, and stronger security across AWS, GCP, and Azure.

Why AI Databases Don't Need SQL
Whether you like it or not, here's the truth: SQL is destined for decline in the era of AI.

How to Use Anthropic MCP Server with Milvus
MCP + Milvus: Streamline AI agent development with standardized data access, eliminating integration hassles while enhancing context and flexibility.



