
Эффективные данные о том, как подготовить и запросы с помощью PineCone и GPT-4O
18 июля 2025 г.После выпуска первой части статьи я продолжал запрашивать VectordB с различными запросами. Я был недоволен результатами, поэтому я хотел оптимизировать проглатывание данных на Pinecone (или, по крайней мере, попробовать) немного.
Улучшение качества данных
Прежде всего, я попытался очистить отметку от ссылки на изображения, новые линии, сепараторы и другие вещи, чтобы файлы, передаваемые в Pinecone, более читаемы.
Итак, я создал небольшую функцию с регулярными выражениями (спасибо, Chatgpt!), Чтобы предварительно обработать отметку, извлеченную FireCRAWL, прежде чем передавать его в Pinecone.
def clean_markdown(md_text):
"""Cleans Markdown text by removing images and dividers."""
import re
md_text = re.sub(r"!\[.*?\]\(.*?\)", "", md_text) # Remove markdown images
md_text = re.sub(r'<img[^>]*>', "", md_text) # Remove HTML images
md_text = re.sub(r"(\*{3,}|-{3,})\n(.*?)\n(\*{3,}|-{3,})", "", md_text, flags=re.DOTALL) # Remove dividers
md_text = re.sub(r'\n\s*\n', '\n', md_text).strip() # Remove extra newlines
return md_text
Расщепление кусочков с фиксированной длиной
Другой метод, который можно использовать для улучшения уместности полученных данных, - это разделение статей на куски. Вместо того, чтобы употреблять всю статью в той же записи индекса, она разделена на куски и вставляется в несколько записей индекса.
Таким образом, одна запись должна содержать одну концепцию вместо всей статьи, облегчая расчет его актуальности для запроса пользователя. Вы можете найти этот подход, используемый в файлеFIRECRAWL_GET_DATA_WITH_CHUNKS.PYНа репозитории GitHub в лаборатории.
Я хорошо знаю, что это далеко не идеально. Я просто разделяю содержание на куски фиксированной длины и игнорирую содержание кусочек. Один и тот же абзац может быть разделен на разные куски, что довольно приблизительно.
Более умный подход может заключаться в том, чтобы прочитать статью с CHATGPT, что обобщает ее различные абзацы, а затем загрузить каждое резюме в другой кусок. Таким образом, мы можем получить чистые данные и куски, которые имеют целый абзац внутри.
Расщепление кусочков с GPT4-O
Это именно то, что я сделал в своей последней попытке: я дал файлы отметки статьи в отношении ввода в GPT4-O и попросил переписать их, используя разные абзацы на отдельный пост.
Каждый абзац стал куском в Pinecone. В этом случае он имеет начало и конец, будучи полностью разработанной концепцией вместо ряда токенов X.
Вы можете найти этот метод кункинга в файле репозиторияFIRECRAWL_GET_DATA_WITH_CHUNKS_OPENAI.PYПолем
Мне потребовалось несколько часов, чтобы разработать и проверить эти идеи, которые не были частью первоначальной статьи, поэтому этот эпизод опубликован в пятницу, а не в обычный четверг.
Запрос базы данных Pinecone
В конце тестов на кункинг у нас есть три различных индекса Pinecone, которые использовали одни и те же входные данные, но разделили их по -другому:
Статья-индекс, с одной записью за статью
Статья-индекс-с-чушь, с предметами, разделенными на различные куски на основе количества используемых токенов
Статья-индекс-с-чушь-оопенай, с статьями, разделенными главами, написанными Openai
Вместо этого все три индекса имеют одинаковую структуру:
аценностиПоле, где у нас есть векторное представление текста, которое мы пропустили. Это будет использовано для поиска наиболее важного текста для входного запроса с использованием алгоритма близости.
аchunk_textПоле, где мы храним текст, который будет использоваться в качестве вывода запроса (полная статья или кусок выбранной статьи)
триМетаданные поля(Автор, заголовок и URL), которые мы будем использовать для цитирования статей, используемых для ответа на запрос
Но как мы можем запросить эти индексы, чтобы получить результаты?
Теория довольно проста, по крайней мере, на поверхностном уровне. Когда мы пишем подсказку, мы в основном пишем запрос на естественном языке. Этот запрос затем встроен с тем же алгоритмом, который использовался, когда мы встроили статьи, вставленные в Pinecone. Сам наш запрос становится серией чисел, так что Pinecone (или другие векторные базы данных) может выполнять поиск близости между значениями запроса и значениями статей. Ближайшие результаты затем возвращаются с определенной степенью близости, и мы можем отфильтровать записи, возвращаемые, используя только ближайшие.
def retrieve_articles(query, top_k=3, confidence_threshold=0.3):
"""Retrieve the most relevant articles from Pinecone for a user query."""
# Generate query embedding
query_embedding = pc.inference.embed(
model="llama-text-embed-v2",
inputs=[query],
parameters={"input_type": "query"}
)[0]["values"]
# Query Pinecone
results = index.query(
vector=query_embedding,
top_k=top_k,
namespace="articles",
include_metadata=True
)
# Extract relevant articles
retrieved_docs = []
for match in results["matches"]:
score = match["score"]
metadata = match["metadata"]
# Add article details
retrieved_docs.append({
"title": metadata["title"],
"url": metadata["url"],
"author": metadata["author"],
"content": metadata["chunk_text"],
"score": score
})
# Compute highest confidence score
max_score = max([doc["score"] for doc in retrieved_docs], default=0)
# Decide whether to use Pinecone or fallback to GPT-4o
use_pinecone = max_score >= confidence_threshold
return retrieved_docs if use_pinecone else None, use_pinecone
Как только записи будут возвращены, это всего лишь вопрос быстрого проектирования. Нам нужно добавить значения, содержащиеся в поле Chunk_text записей в контекстные окна подсказки и попытаться найти лучший способ описать желаемый вывод.
def generate_answer(query):
"""Generates a long-form instructional answer using retrieved articles."""
retrieved_docs, use_pinecone = retrieve_articles(query)
if use_pinecone:
# Extract full text from relevant articles
context_text = "\n\n".join([
f"Title: {doc['title']}\nAuthor: {doc['author']}\nContent:\n{doc['content']}..."
for doc in retrieved_docs
])
# Construct the GPT prompt
prompt = (
"Using the following extracted content from expert-written articles, "
"provide a long-form, step-by-step, detailed answer with practical instructions. "
"Make sure to extract key information and structure the answer properly.\n\n"
f"{context_text}\n\n"
f"📌 **User's Question**: {query}\n\n"
f"💡 **Detailed Answer**:"
)
else:
# No relevant articles, fall back to GPT-4o general knowledge
prompt = f"Provide a long-form, detailed answer with step-by-step instructions based on your general knowledge:\n\n📌 **User's Question**: {query}\n\n💡 **Detailed Answer**:"
# Query GPT-4o
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)
# Extract paragraphs from the response
return response.choices[0].message.content.strip(), use_pinecone, retrieved_docs
Эта подсказка, вероятно, может быть улучшена, но результаты довольно хороши со всеми тремя индексами, даже если я думаю, что получаю лучшие ответы с индексом, который использовал GPT для составления статей.
Тесты
После всего этого введения пришло время проверить нашего помощника и посмотреть, какой индекс дает лучшие ответы. Ответы довольно длинные
Тест 1 -Статья-индекс
Как я могу обойти защищенные сайты Dataadome?
В этом ответе используются более старые статьи, чтобы ответить на него, и не упоминается Camoufox, последнее решение, которое я использовал для этой задачи, в то время как в нем упоминается призрак-Cursor.
Другие части ответа довольно хорошие, но немного общие и не такие интересные, в чистом стиле GPT.
### Step 2: Detect Datadome on Target Website
- **Wappalyzer**: Use this tool to inspect the website's tech stack and detect the presence of Datadome.
- **Cookie Inspection**: Recognize Datadome by looking for specific cookies in the website's response headers, e.g., a "Datadome" cookie.
### Step 3: Initial Scraping Attempts
- **Avoid Basic Tools**: Basic HTTP libraries like 'requests' or simple Scrapy setups will likely be blocked due to lack of JavaScript execution and human-like behavior.
2. **Human-like Interactions**:
- Use tools like `python_ghost_cursor` to simulate human-like mouse movements (not compatible with Firefox).
- Randomize waits between actions to mimic human browsing patterns.
- Avoid direct navigation to deep links; instead, simulate a user's path through the site.
### Step 5: Experiment with Different Browsers
- **Switch to Brave Browser**: If Firefox does not work, try using Brave (a Chromium-based browser) with Playwright and see if it bypasses detection better than Chrome.
### Step 6: Commercial Proxy Solutions
- **Proxy Rotation**: Use a service like Proxyempire to rotate IPs frequently. Proxies can help bypass IP-based detection by altering your apparent origin.
- **Ensure Quality Proxies**: Use residential proxies for a more natural browsing fingerprint.
📚 **Sources:**
🔗 [How to scrape Datadome protected websites (early 2023 version)](https://substack.thewebscraping.club/p/how-to-scrape-datadome-2023) - Pierluigi Vinciguerra
🔗 [Bypassing Datadome with Web Scraping - End of 2023 Version](https://substack.thewebscraping.club/p/bypassing-datadome-2023-scraping) - Pierluigi Vinciguerra
🔗 [THE LAB #2: scraping data from a website with Datadome and xsrf tokens](https://substack.thewebscraping.club/p/scraping-datadome-api-hermes) - Pierluigi Vinciguerra
Какие лучшие инструменты с открытым исходным кодом для соскоба в 2025 году?
Это довольно точно. Ответ начинается с традиционных инструментов, таких как Scrapy и Playwright, а затем переходит к ScrapeGraphai, Nodriver и Camoufox.
Тот же вопрос, заданный стандартному GPT-4O, предоставляет гораздо менее актуальный ответ.
Как я могу изменить отпечаток пальца в браузере? Какие инструменты мне следует использовать?
Опять же, это довольно хороший ответ, не идеальный, но, по крайней мере, ссылается на правильные статьи.
Тест 2 -Статья-индекс-с-чушь
Давайте посмотрим, как меняются ответы (если они это делают), используя этот индекс, сделанный с разделенными статьями.
Как я могу обойти защищенные сайты Dataadome?
Это довольно интересно. Помимо введения о обнаружении DataDome, ответ не из моих статей. На самом деле, есть какой -то код узла, который я не писал, который довольно общий и не будет работать для этой задачи. Не хороший ответ.
Какие лучшие инструменты с открытым исходным кодом для соскоба в 2025 году?
Опять же, это смесь общих знаний GPT и что -то, что добавлено моими статьями. Я думаю, что из моих статей была взята часть Scrapoxy, но я определенно не рекомендовал в них Selenium и Beautifoulsoup.
Как я могу изменить отпечаток пальца в браузере? Какие инструменты мне следует использовать?
Ответ снова пришел из знаний GPT и из кусков моей последней статьи о снятии пальцев браузера.
Сверху, это также добавило немного саморекламы
Stay Informed and Adaptive:
Understand that modifying fingerprints is an ongoing arms race. Keep updated on new fingerprinting tactics, and regularly adapt your strategies.
Subscribing to resources like The Web Scraping Club can provide ongoing insights into the latest developments in web scraping and browser fingerprinting.
Давайте посмотрим, работает ли третий индекс лучше.
Тест 3 -Статья-индекс-с-чушь-оопенай
Учитывая заблуждение о ответах предыдущего индекса, будем надеяться, что эти тесты дадут лучшие результаты.
Как я могу обойти защищенные сайты Dataadome?
Ответ в порядке, аналогично тому, что на первом тесте. Он добавил подход обратной инженерии, но не упоминал Ghostcursor или Camoufox.
Вероятно, я должен улучшить подсказку и использовать больше элементов в результате.
Какие лучшие инструменты с открытым исходным кодом для соскоба в 2025 году?
Опять же, ответ в порядке, но не так хорош, как первый тест. Посмотрев на упомянутые статьи, я полагаю, что он извлек несколько кусочков, которые на самом деле не на самом деле.
Как я могу изменить отпечаток пальца в браузере? Какие инструменты мне следует использовать?
Сохраняя предел двадцати кусков, мы снова получили блестящий ответ.
Окончательные замечания
Я продолжал тестировать в течение некоторого времени, увеличивая количество кусков, используемых с первым индексом, с полной статьей на запись, но результаты не были хорошими; Кажется, что я добавил больше путаницы в контекст. Я буду продолжать играть с этой конфигурацией, и вскоре я напишу последнюю статью серии, в которой мы увидим, как добавить интерфейс UX к нашему помощнику.
Статья является частью«Лаборатория»серияПьерлуиджи ВинсгуерраПолем Проверьте егоПодмазочныйСтраница для получения дополнительных знаний о скребке.
Оригинал