RAG без містыкі: адзысканне, а потым стварэнне
Просты пацерак ад чанкінгу і індэксаў да практычных адказоў, у якіх можна выкарыстоваць аператары цитатаў для аудыту.
Існавайце гэта як пераклад ідэй з кантэнту “RAG, Explained the Way I Wish Someone Had Explained It to Me” для працаваючых з апаратамі: чыстыя этапы, арранжаваныя блакіты коду і прыметкі па восстанавлэнню, якія застаюцца пасля перадачы задання. Адгляд работае найэфектывней, калі яго розглядаць як вимероўваную паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па атрыбуцыі да пачатку роботы, прычаму расширяючы сферу дзеяння.
1. Аналагія, якая дапамагае зрозумець RAG
Для 1. Аналагія, яка робить RAG эфективным неабяжна прадзеўляць вхідныя даны, абяжна выклікаць власніка крока і абяжна задаць критэрыя завершэння пры перадзеўленні коду. Аператары павінны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына нехарактэрыстыкі павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Наводзіце тыя часткі тексту, якія фактычна ляглі в основу адпаведнай адказы. Без цых цітатаў аператары не зможаць разлічыць галюцинацію ад працягу індэксавання.
2. Две часткі кожной системы RAG
Для 2. Две часты кожнай системы RAG неабяжна практычна вакулінкі інпутаў, адпаведальнага за крок і крэтарыяў завершэння працы перад зменым коду. Аперацыйшчыкі павінны магчымае перапрацаваць крок з вядомай точкі контролю, не падозрываючы схованы статус. Спрыяйце гэтаму этапу як кантракту межа інпутамі і падтверджанымі выходамі. Даўце назвы артыфактам, практычна вакулінкі перагляду успеху і адмовіцеся ад тыхнай частковай роботы без паведамлення. Цітуйце тыя часткі, якія фактычна сталі падставай для адпаведнага адказу. Без цітаў аперацыйшчыкі не зможаюць разлічыць галлюцинацыю ад прасоў у індэксаванні.
3. Этап 1 — Індэксаванне: ператварэнне дакументаў у тое, што можна шукаць
Для 3. Этап 1 — Індексаванне: ператворэнне дакументаў у матэрыялы, якія можна шукати неабходна прадзефінаваць вхідныя даны, адпаведальную за этап особу і крэтыяры завершэння пры перадзмене коду. Аператары должны магчыма было перзапускаць этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і вартасць токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне вартасцей запобегае неспадзяваным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўысы. Указваць тые часткі тексту, якія фактычна сталі падставай для адпаведнай адпаведзі. Без цых цытатаў аператары не можуць разлічыць галюцинацію ад прасоў у індексаванні.
Этап 1: Зацягніце своі дакументы
Для Крок 1: Завантажыце вашы дакументы неабяжна пазначыць параметры вводу, адпаведнага власніка кроку і критэрыя завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічваць пазначальна коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Указывайце тыя часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аператары не можаць разлічыць галюцинацію ад прасоўкі ў індэксаванні.
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("company_policy.pdf")
documents = loader.load()
print(f"Loaded {len(documents)} pages")
Крок 2: Разбіце ў часткі — і гэты крок мае больш значэння, чым думаюць людзі
Для 2-го крока: Разбіліце на часткі — і гэты крок мае большое значэнне, чым думаюць людзі неабяжна з’явіць апісанне вхідных дадзенняў, адпаведнага адпаведальнага за крок і крэатарыяў завершэння працы перад змінайом коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не елементамі, які дадуць готовы результат пазней. Паказваць цікавячыя фрагменты, які насправдзе лежаць у падставе адпаведнай адказы. Без ціх цікавячых фрагментоў аператары не зможаць разлічыць галюцинацію ад працягу індэксавання.
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # characters per chunk
chunk_overlap=80, # overlap between consecutive chunks
separators=["\n\n", "\n", ". ", " "]
)
chunks = splitter.split_documents(documents)
print(f"Split into {len(chunks)} chunks")
3-й крок: Убудоўваць часткі
Для Крока 3: Утрамбаванне чакаў неабходна прадзефінавацыя вхідных дадзеных, адпаведнага адпаведальнага за крок і крэатарыяў выходу пры перадзмене коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест абмежлівых скрыптав. Калі крок не выйшаў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Наводзіце тыя часткі тексту, якія фактычна ляглі в основу адпаведнай адказы. Без цых цітатаў аператары не зможуць разлічыць галюцинацію ад працягу ў індэксаванні.
from langchain_openai import OpenAIEmbeddings
embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
# under the hood, this is what happens per chunk:
vector = embedding_model.embed_query("30-day refund window for annual plans")
print(len(vector)) # e.g. 1536 numbers representing this sentence's meaning
"refund policy" •
\
• "money-back guarantee"
"vacation days" •
\
• "paid time off"
Крок 4: Зберагчы вектары ў базе дадзеных вектараў
Для Крока 4: Зберагачыце вектары ў базе дадзеных вектараў неабходна перад змянай коду задаць параметры вхідных даных, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цім этапу як кантракту межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад беззвучнага частковага завершэння. Указуйце тыя часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аператары не зможаць разлічыць галюцинацію ад прасоў у індэксаванні.
from langchain_community.vectorstores import FAISS
vectorstore = FAISS.from_documents(chunks, embedding_model)
vectorstore.save_local("faiss_index")
4. Этап 2 — Адзысканне + Генераванне: Адпаведжанне на рэальны запыт
Для 4. Этап 2 — Адзыяванне + Генераванне: Адпаведзь на рэальны вопыт неабяжна практычнаць вхідныя даны, адпаведальнага за шаг і крэтыяры завершэння прычыні перад зменым коду. Аператары должны магчымаць перапрацоўваць шаг з вядомай точкі контролю без адгадванняя схованага стану. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмавай версіі ў спяльныя среды. Указваць часткі тексту, якія фактычна сталі падставай для адпаведзі. Без цых цитатаў аператары не можуць разлічыць галюцинацію ад прасоў у індэксаванні. Для 4. Этап 2 — Адзыяванне + Генераванне: Адпаведзь на рэальны вопыт неабяжна практычнаць вхідныя даны, адпаведальнага за шаг і крэтыяры завершэння прычыні перад зменым коду. Аператары должны магчымаць перапрацоўваць шаг з вядомай точкі контролю без адгадванняя схованага стану. Аддзеўна задокументаваць шлях успеху і шлях вяснавання. Перадзеўна
Такі элементы, як людзькі інтерфейсы та обробка некоректных паведамленняў, ўжо є частью продукту, а не чымось, што дадаецца пазней.Крок 1: Уключыце запит — з там самым модэлем
Працюючы над Крокам 1: Уключыце запит — з там самым модэлем, спачатку запісайце умовы: неабяжлівыя данні, сигнал успеху та тое, што вядзецься у разе частковага невыпання. Такі список контролю дапамагае заліцьваты змяны ў кодзе. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына невыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Зберагаеце стабільныя інструкцыі системы та схемы інструментав. Перадзесланне ідэнтычных даных — частая прычына зайвых витрацоў.
query = "Can I get a refund on my annual subscription?"
Крок 2: Атрымайце найболей рэлевантныя часткі
Калі вы працуеце над Этапам 2: Адзысканне самых рэлевантных фрагментаў, спачатку запісайце умовы контракту: неабходныя данні, сігнал успеху і тое, што выходзіць калі адбываецца частковая нявыплата. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрэчвайце гэты этап як контракт межу вхіднымі даннемі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць тэсты на успех і не прымайце часткова завершанне без паведамлення. Змяркуйце рэграбіранне інформацыі на фіксаванай сэтке запитанняў прычым перад налаштаваннем запитоў. Частае зміненне запитоў рэдка калі-небудзь выправляе слабыя аспекты адзыскання інформацыі.
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
relevant_chunks = retriever.invoke(query)
for chunk in relevant_chunks:
print(chunk.page_content[:100], "...")
Этап 3: Уключэнне фрагментаў у запит
Калі працуеце над Крок 3: Уключыце фрагменты ў запит, спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Запісвайце час выконання і вартасьць токеноў або запыта праза функцыйнальныя рэзултаты. Відразлівая вартасьць з самага пачатку запобегае неспакою, калі працэс пераходзіць з дамовай версіі ў спяльныя сераўы. Зберагайце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перасылка ідэнтычных даных ёсць частым выклікам витрачання ресурсаў. Калі працуеце над Крок 3: Уключыце фрагменты ў запит, спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Адначасова задокументавайце шляхы успеху і вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных запытаў є часткай продукту, а не пазнейшым дапрацоўкам.
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""
Answer the question using ONLY the context below.
If the answer isn't in the context, say "I don't have that information."
Context:
{context}
Question: {question}
""")
Шаг 4: Склець усё разам
Шаг 4: Склець усё разам працюе найэфектывней, калі яго розглядаць як вимерную плошчу. Зафіксавайце адна ідеальная версія транскрыпцыі, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь шаг не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеліце правілы часткавання інфармацыі ад правіл яе выкарыстоўвання. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцца паказателі якосці.
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-mini")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
answer = rag_chain.invoke("Can I get a refund on my annual subscription?")
print(answer)
5. Чаму гэта краща, чым проста перадача всіго дакумента ў запит
5. Чаму гэта краща за простае вставкі цэлага дакумента ў запит — гэта метод працюе наякша, калі яго розглядаць як меркаваную плошчу. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і прыметку па адкатуванні перш чым расширваць масштабы. Разглядзіце гэты этап як кантракт межа вхіднымі даннымі і паверыранымі выходамі. Дайце назвы артыфактам, задаце критэрыі успеху і адмовіцеся ад тыхоў, частковага завершэння. Задзейце бюджет токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.
6. Частыя падступы (навучанне на власных грошах)
6. Частыя падазры (якія навучыліся на скарбе) працюе найэфектывней, калі яго розглядаюць як вимерную плошчу. Зафіксавайце адны ідеальны прымер, адзін кейс неудачы і прыметкі па адвярненню роботы пры расшырэнні масштаба. Запісвайце часы выконання і вартасць токеноў або запытак праза функцыйнае рэзультат. Відразлівае прадставленне вартасцей запобегае неспакою з боку расчытанняў, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Раздзеліце політіку часткавага оброблэння дадзеных ад політікі ўзяць іх. Змена адной з яных не павінна вымагаць перапісву другой, калі зменяюцыся паказнікі якосці. 6. Частыя падазры (якія навучыліся на скарбе) працюе найэфектывней, калі яго розглядаюць як вимерную плошчу. Зафіксавайце адны ідеальны прымер, адзін кейс неудачы і прыметкі па адвярненню роботы пры расшырэнні масштаба. Дакументавайце як успешны, так і варыянт вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольны пункты і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
7. Куды далей
Для раздзела 7. Куды працавац далей неабяжна практычна апранаванне: перад змінайом код неабяжна визначыць параметры, адпаведальнага за крок і критэрыі завершэння. Апранавальнікі должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неабяжна стосавацца адной відпаведальнасці, а не заплутанага ланца задач. Прыкладзіце фрагменты, якія насправды лежалі в основе адпаведнай адказы. Без цых праменаванняў апранавальнікі не зможаць разлічыць галюцинацію ад працягу індэксавання.
Чек-ліст для апранавання
Калі працуеце над чек-лістам для апранавання, спачатку запісайце умовы: неабяжныя параметры, сігнал успеху і тое, што выходзіць пад частым неудачам. Такі чек-ліст дапамагае заставаць пасляэйшыя зміны коду чыстымі.
Зберагаюце канфігурацыю праза ў кодзе прыемлі. Файлы сяродавішча, храненні секрэтных дадзенаў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжнага чытання всіх элементаў.
Перад налаштаваннем запрошэнняў памерайце рэкалі на фіксаваным наборы пытанняў. Частае зменшэнне запрошэнняў рэдка калі вялікі адрас слабкага процесу пошуку.
Фіксуйце версіі залежнасцяў і запішыце хэш адпаведнага зображэння, якое было выкарыстоўвана для дэманстрацыі. Возможнасць павтарнага стварэння результаатаў лепшая за традыцыйныя методы.
Документавайце як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Перад налаштаваннем запрошэнняў памерайце рэкалі на фіксаваным наборы пытанняў. Частае зменшэнне запрошэнняў рэдка калі вялікі адрас слабкага процесу пошуку.
Перш чым запускать даную структуру, заморозьце версіі, зафіксавце „золаты” транскрыпты для критичных етапаў і паказвце спосабы вярнення да пачатковага стану. У спільных середавішчах неабходны ліміты швайнаў, перакананні ў правах на викорыстоўвання ресурсаў і чысткі власнік для змены секретных даных. Валіце надзейнасць працы над красавімі разовымі дэманстрацыямі.
Прыметкі для 372916c7a432: не кладзіце ключы прадаўцаў у репазітарый, задаце ліміт токену на кожную сесію і зберагачыце транскрыпты разам з фіксатрамі для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównаннімы.