Дополненная поиском генерация - это быстро развивающаяся группа методов, которые были изначально задуманы как расширение больших языковых моделей (LLM), но все чаще рассматриваются как альтернативная парадигма, полностью переосмысливающая роль AI-моделей.
Мы покажем вам, как создать базовый RAG-движок, используя фреймворк LlamaIndex, открытую языковую модель Mistral, Jina Embeddings v2 и векторную базу данных Qdrant для AI.
tagRAG в контексте
В системе RAG роль AI-модели остается центральной, но гораздо более ограниченной. Вместо того чтобы отвечать на запросы из своих внутренних знаний, полученных из обучающих данных, ей предоставляется релевантная информация в промпте. Роль модели заключается в том, чтобы понять и синтезировать информацию в выходные данные.
Это использует сильные стороны AI-моделей и минимизирует их слабости.
Например, мы можем дать модели Mistral-Instruct следующий промпт:
Answer the query. Please be brief, concise, and complete.
Query: Why is Taylor Swift planning to attend the Superbowl?
Answer:
Когда я это сделал, модель ответила:
I don't have real-time information. However, as of my last update,
Taylor Swift is not officially confirmed to attend or perform at
the Superbowl. If there are any updates, I recommend checking the
latest news sources.Большие языковые модели дорого обновлять и переобучать, поэтому их внутренняя информация никогда не может быть полностью актуальной.
Более того, большие языковые модели известны своими "галлюцинациями", то есть правдоподобными ответами, которые могут быть частично или полностью неверными и требуют проверки.
Answer the query. Please be brief, concise, and complete.
Query: What was Weird Al Yankovic's first Taylor Swift parody?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," a spoof
of Swift's song "Blank Space." The parody was released in 2014
as part of Yankovic's album "Mandatory Fun." The song humorously
addresses the obsession with celebrity gossip and scandals, as
reported by the tabloid news website TMZ.Песня Weird Al Yankovic TMZ была выпущена в 2011 году в альбоме Alpocalypse и является пародией на песню Swift You Belong with Me.
Природа нейронных сетей делает галлюцинации трудными, если не невозможными для полного предотвращения, что серьезно подрывает любой план использования AI-моделей в качестве источников информации.
По словам Сэма Альтмана, CEO OpenAI:
"Я думаю, люди совершают большую ошибку, когда думают об этих моделях [LLM] как о базе данных. [...] Это будет работать, вроде как. Но это самая дорогая, самая медленная и наименее точная база данных в мире."
RAG минимизирует зависимость от внутренних знаний AI-модели о фактах окружающего мира и использует ее главные сильные стороны: понимание естественного языка и свободную генерацию текста.
Давайте рассмотрим еще один пример вопроса, на который Mistral-Instruct не может ответить:
Answer the query. Please be brief, concise, and complete.
Query: What is the title of Taylor Swift's next album?
Answer:
As of the time I am providing this answer, Taylor Swift has
not yet announced the title of her next album. She has released
several re-recorded albums, but the title of her next original
album remains unknown. I recommend checking her official social
media channels or website for the latest updates.Теперь система RAG может иметь базу данных последних новостных статей или, возможно, искать в Интернете тексты, связанные с названием следующего альбома Taylor Swift. Затем она вставит найденные тексты в промпт.
Предположим, она определила эту статью AP как релевантную запросу и составляет следующий промпт:
Context information is below.
---------------------
February 6, 2024
LOS ANGELES (AP) — Forget her "Reputation." Taylor Swift has a
whole new album coming out.
Accepting the Grammy for best pop vocal album on Sunday night,
Taylor said she'd been keeping a secret for two years.
"My brand-new album comes out April 19. It's called 'The Tortured
Poets Department.' I'm going to go and post the cover right now
backstage," she announced.
And so she did.
---------------------
Given the context information and not prior knowledge, answer the query.
Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What is the title of Taylor Swift's next album?
Answer:Mistral-Instruct ответила:
The title of Taylor Swift's next album is 'The Tortured Poets Department'.Такой тип промптинга также значительно снижает вероятность галлюцинаций. Например:
Context information is below.
---------------------
Alpocalypse is the thirteenth studio album by American parody
musician "Weird Al" Yankovic, released on June 21, 2011.
Track List
1. Perform This Way (Parody of "Born This Way" by Lady Gaga)
2. CNR
3. TMZ (Parody of "You Belong with Me" by Taylor Swift)
4. Skipper Dan
5. Polka Face (Polka medley including songs by artists such as
Lady Gaga, Justin Bieber, Britney Spears, Ke$ha, and others)
6. Craigslist
7. Party in the CIA (Parody of "Party in the U.S.A." by Miley
Cyrus)
8. Ringtone
9. Another Tattoo (Parody of "Nothin' on You" by B.o.B featuring
Bruno Mars)
10. If That Isn't Love
11. Whatever You Like (Parody of "Whatever You Like" by T.I.)
12. Stop Forwarding That Crap to Me
---------------------
Given the context information and not prior knowledge, answer the
query. Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What was Weird Al Yankovic's first Taylor Swift parody, what
year was it released, and what song was he parodying?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," and it was
released in 2011. He was parodying "You Belong with Me" by Taylor
Swift.
tagАнатомия системы RAG
Система RAG имеет как минимум два компонента:
- Генеративная AI-модель.
- Система поиска информации.
В этой статье мы будем использовать Mistral-Instruct в качестве генеративной AI-модели и получать к ней доступ через Hugging Face Inference API. Для системы поиска информации мы будем использовать векторную базу данных Qdrant и Jina Embeddings.
В качестве источника данных мы будем использовать Национальный стратегический план исследований и разработок в области искусственного интеллекта, обновление 2023 года, опубликованный в мае 2023 года Национальным советом по науке и технологиям, органом, который консультирует президента США по научным и техническим вопросам. Этот документ объемом примерно 25 000 слов является документом по политике и стратегическому планированию американской политики и разработок в области AI.
Это также классический правительственный программный документ, который "слишком длинный, чтобы читать". Большая его часть очень скучная, и если у вас нет заинтересованности или близкого интереса к этой области, вы, вероятно, не станете его читать. Но вы все равно можете хотеть знать, что в нем говорится.
В этой статье мы проведем вас через этапы создания системы RAG, способной отвечать на вопросы о тексте и его содержании.
tagУстановка необходимых компонентов
Сначала убедитесь, что у вас установлены все необходимые библиотеки Python. В вашем окружении Python выполните следующие команды:
pip install llama-index qdrant-client
pip install pdfminer.six llama-index-vector-stores-qdrant
pip install llama-index-llms-openai llama-index-embeddings-jinaai
pip install llama-index-llms-huggingface "huggingface_hub[inference]"Мы будем использовать LlamaIndex для создания RAG-системы с использованием языковой модели Mistral-Instruct и pdfminer.six для обработки PDF-файла в векторное хранилище Qdrant.
tagПодключение к Mistral-Instruct через Hugging Face Inference API
Сначала настроим LLM. Вам понадобится доступ к Hugging Face Inference API, включая токен доступа. Если у вас есть аккаунт Hugging Face, вы можете получить его на странице настроек вашего аккаунта.
Если у вас нет аккаунта, сначала создайте его, затем создайте токен доступа.
Поместите ваш токен в переменную для дальнейшего использования:
hf_inference_api_key = '<your HuggingFace Inference API token>'Далее создадим шаблон промпта:
from llama_index.core import PromptTemplate
qa_prompt_tmpl = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query. Please be brief, concise, and complete.\n"
"If the context information does not contain an answer to the query, "
"respond with \"No information\".\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt = PromptTemplate(qa_prompt_tmpl)Этот шаблон инструктирует LLM использовать только предоставленную в промпте контекстную информацию для ответов на вопросы. Этот промпт хорошо работал с Mistral-Instruct, но вы можете экспериментировать с другими формулировками, чтобы найти то, что подходит для вашего случая.
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key
)Наконец, создадим и инициализируем объект для фреймворка LlamaIndex, который содержит подключение к Mistral-Instruct. Код ниже взят из предыдущего поста о создании RAG-систем с использованием LlamaIndex.
Это помещает подключение к Mistral LLM в переменную mistral_llm.
tagИнформационный поиск с Qdrant и Jina Embeddings
Для настройки системы поиска вам понадобится ключ API Jina Embeddings. Вы можете получить его бесплатно с предоплаченным бюджетом в 1 миллион токенов на сайте Jina Embeddings.

Поместите ваш ключ Jina Embeddings в переменную для дальнейшего использования:
jina_emb_api_key = "<your Jina Embeddings API key>"Затем создайте объект-коннектор с помощью LlamaIndex для сервера Jina Embeddings, выбрав конкретно английскую одноязычную модель:
from llama_index.embeddings.jinaai import JinaEmbedding
jina_embedding_model = JinaEmbedding(
api_key=jina_emb_api_key,
model="jina-embeddings-v2-base-en",
)tagЗагрузка текстовых данных
Далее мы загрузим документ и разделим его на параграфы. Сначала загрузим PDF с сайта Белого дома в переменную pdf_data:
import urllib.request
uri = "https://www.whitehouse.gov/wp-content/uploads/2023/05/National-Artificial-Intelligence-Research-and-Development-Strategic-Plan-2023-Update.pdf"
pdf_data = urllib.request.urlopen(uri).read()Затем мы обработаем PDF постранично, извлекая текст и разбивая его на параграфы путем разделения по двойным переносам строк. Они сохраняются в списке text_paras:
import regex as re
from io import BytesIO, StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
text_paras = []
parser = PDFParser(BytesIO(pdf_data))
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
for page in PDFPage.create_pages(doc):
output_string = StringIO()
device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
interpreter = PDFPageInterpreter(rsrcmgr, device)
interpreter.process_page(page)
page_text = output_string.getvalue()
text_paras.extend(re.split(r'\n\s*\n', page_text))
Проверим, что всё загружено:
assert len(text_paras) == 615Далее мы преобразуем этот список коротких текстов в объекты Document LlamaIndex:
from llama_index.core.readers import StringIterableReader
rag_docs = StringIterableReader().load_data(text_paras)И вы можете проверить текст:
print(rag_docs[0].text)Результат:
NATIONAL ARTIFICIAL INTELLIGENCE
RESEARCH AND DEVELOPMENT
STRATEGIC PLAN
2023 UPDATEtagНастройка векторной базы данных Qdrant
В этой статье мы будем использовать Qdrant Vector Search Cloud для реализации базы данных RAG-системы. Бесплатный тариф Qdrant включает 1 ГБ хранилища, чего более чем достаточно для этого руководства.
Вам нужно будет создать аккаунт на сайте Qdrant Cloud прежде чем продолжить.

После того как у вас будет аккаунт и вы войдете в систему, вам нужно будет создать кластер. Следуйте инструкциям "быстрого старта" на сайте Qdrant, чтобы настроить бесплатный кластер и получить API-ключ и имя хост-сервера Qdrant.

Сохраните ключ и имя хоста в переменных:
qdrant_api_key = "<your API key>"
qdrant_server = "https://<your server>"Далее нам нужно импортировать соответствующие компоненты из пакетов qdrant_client и llama_index:
import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(qdrant_server, api_key=qdrant_api_key)
vector_store = QdrantVectorStore(client=client, collection_name="NTSC")Это создает коллекцию с названием NTSC в вашем бесплатном кластере.
Вы можете прочитать документацию Qdrant для получения информации о создании локального хранилища данных в памяти или на диске и размещении собственного экземпляра сервера Qdrant в docker-контейнере через веб-API.
tagЗавершение системы RAG
Теперь мы соберем эти компоненты в полноценную систему RAG, используя шаблонный код для LlamaIndex:
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.storage.storage_context import StorageContext
from llama_index.core import (
VectorStoreIndex,
ServiceContext,
get_response_synthesizer,
)
# set up the service and storage contexts
service_context = ServiceContext.from_defaults(
llm=mixtral_llm, embed_model=jina_embedding_model
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# create an index
index = VectorStoreIndex.from_documents(
rag_docs, storage_context=storage_context, service_context=service_context
)
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=2,
)
# configure response synthesizer
response_synthesizer = get_response_synthesizer(
service_context=service_context,
text_qa_template=qa_prompt,
response_mode="compact",
)
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
Эта система будет использовать Jina Embeddings для индексации параграфов из нашего текстового источника и будет помещать два лучших совпадения в контекст каждого промпта. Чтобы изменить, например, на три лучших совпадения, просто измените параметр similarity_top_k при инициализации VectorIndexRetriever выше:
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=3,
)Теперь система готова к использованию.
tagЗапрос к документу
Давайте попробуем простой запрос:
response = query_engine.query("""
What is the Biden Administration's policy with regard to AI?
""")
print(response.response)Результат (ваш может отличаться):
The Biden Administration prioritizes responsible AI systems that
are ethical, trustworthy, and safe, and serve the public good.
The Administration has committed to substantial funding for AI
R&D, and has established the National AI Initiative Office to
coordinate AI activities across the federal government.
The Administration's AI policy focuses on developing evaluative
techniques for AI, workforce development, public-private
partnerships, and international collaboration in AI research.Или что-то более конкретное:
response = query_engine.query("""
What protections does the AI Bill of Rights propose to offer?
""")
print(response.response)The AI Bill of Rights proposes five core protections: Safe and
Effective Systems; Algorithmic Discrimination Protections; Data
Privacy; Notice and Explanation; and Human Alternatives,
Consideration, and Fallback.Или даже очень конкретное:
response = query_engine.query("Who is Kei Koizumi?")
print(response.response)Kei Koizumi is the Principal Deputy Director for Policy at the Office
of Science and Technology Policy (OSTP).Вы также можете задавать более необычные вопросы:
response = query_engine.query("""
What rights will AI's receive under President Biden's proposed
AI Bill of Rights?
""")
print(response.response)The proposed AI Bill of Rights does not grant rights to AI systems, but
rather outlines principles to ensure that AI technologies are
developed and used in a manner that respects human rights and values.
The principles include safety, transparency, fairness, disclosure,
data privacy, non-discrimination, and the ability for individuals to
opt out of certain AI systems.response = query_engine.query("""
Why is President Biden's proposing an AI Bill of Rights?
Does AI really need rights?
""")
print(response.response)President Biden's proposed AI Bill of Rights aims to ensure that AI
technologies are developed and used ethically, legally, and with
societal considerations in mind. The Bill of Rights is not granting
"rights" to AI, but rather setting guidelines for the responsible
development and deployment of AI systems to protect individuals and
communities from potential negative impacts.response = query_engine.query("""
Has Donald Trump weighed in on AI?
Will he Make Humans Great Again?
""")
print(response.response)
No information. The context information does not mention Donald
Trump's views on AI.tagJina AI и Qdrant
Контекстное окно Jina Embeddings в 8k токенов делает его особенно подходящим для генерации с дополнением из retrieval, поскольку он может работать с гораздо более крупными блоками текста. В то время как другим RAG-приложениям часто приходится хранить отдельные предложения или пары предложений, в этом руководстве мы могли использовать целые параграфы, не беспокоясь об их размере.
Это уменьшает количество текстовых элементов, которые необходимо хранить для передачи той же информации, снижая вычислительные затраты, экономя память и делая поиск быстрее.
Векторная база данных Qdrant проста в настройке, быстра и экономична, и, как вы видели, требуется всего несколько строк Python-кода для интеграции ее в систему RAG.
Для получения дополнительной информации о базе данных Qdrant, готовой к работе с ИИ, и облачных предложениях вы можете посетить их веб-сайт.

tagСвяжитесь с нами
Jina AI стремится сделать надежные и доступные технологии ИИ доступными для предприятий любого размера и типа. Мы будем рады узнать о ваших сценариях использования и помочь внедрить ИИ в ваши бизнес-процессы. Для получения дополнительной информации о предложениях Jina AI и для связи с нами посетите веб-сайт Jina AI или присоединяйтесь к нашему сообществу в Discord.











