PaperQA2 هي حزمة للقيام بتوليد عالي الدقة معززة (RAG) على ملفات PDF أو الملفات النصية ، مع التركيز على الأدب العلمي. راجع ورقة 2024 الأخيرة لترى أمثلة على أداء PaperQA2 الخارق في المهام العلمية مثل الإجابة على الأسئلة والتلخيص والكشف عن التناقض.
ask يدويًافي هذا المثال ، نأخذ مجلد من PDFs الورقية البحثية ، ونحصل بطريقة سحرية على بيانات التعريف الخاصة بهم - بما في ذلك تعداد الاقتباس مع فحص التراجع ، ثم تحليل PDF و Cache في مؤشر بحث النص الكامل ، وأجاب أخيرًا على سؤال المستخدم مع وكيل LLM.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? 'سؤال: هل صمم أي شخص شبكات عصبية تحسب البروتينات أو الحمض النووي؟
يتم دعم الادعاء بأن الشبكات العصبية قد تم تصميمها لحسابها باستخدام الحمض النووي بواسطة مصادر متعددة. يوضح العمل من قبل Qian و Winfree و Bruck استخدام شلالات إزاحة حبلا الحمض النووي لبناء مكونات الشبكة العصبية ، مثل الخلايا العصبية الاصطناعية والذكريات الترابطية ، باستخدام نظام قائم على الحمض النووي (الصفحات QIAN20111-2 ، QIAN2011 الصفحات 15-16 ، Qian2011nural pages 54-56). يتضمن هذا البحث تنفيذ بوابة XOR ذات 3 بت وذاكرة نقابية Hopfield بأربعة نورون ، مما يعرض إمكانات الحمض النووي لحساب الشبكة العصبية. بالإضافة إلى ذلك ، فإن تطبيق تقنيات التعلم العميق على علم الجينوم ، والذي يتضمن الحوسبة مع تسلسل الحمض النووي ، موثقة جيدًا. طبقت الدراسات الشبكات العصبية التلافيفية (CNNs) للتنبؤ بسمات الجينوم مثل ربط عامل النسخ وإمكانية الوصول إلى الحمض النووي (Eraslan2019deep Pages 4-5 ، Eraslan2019deep Pages 5-6). هذه النماذج تستفيد من تسلسل الحمض النووي كبيانات إدخال ، باستخدام الشبكات العصبية بشكل فعال لحساب الحمض النووي. في حين أن المقتطفات المقدمة لا تذكر صراحة حساب الشبكة العصبية القائمة على البروتين ، فإنها تسلط الضوء على استخدام الشبكات العصبية في المهام المتعلقة بتسلسل البروتين ، مثل التنبؤ بربط البروتين الحمض النووي (صفحات ZENG201616 -2). ومع ذلك ، يبقى التركيز الأساسي على الحساب القائم على الحمض النووي.
تم تصميم PaperQA2 ليكون أفضل نموذج للخرقة الوكيل للعمل مع الأوراق العلمية. فيما يلي بعض الميزات:
بشكل افتراضي ، يستخدم Openai Openings و Modeddings مع DB Vector DB لتضمين المستندات والبحث. ومع ذلك ، يمكنك بسهولة استخدام نماذج أو تضمينات أخرى للمصادر المفتوحة (انظر التفاصيل أدناه).
يعتمد PaperQA2 على بعض المكتبات الرائعة/واجهات برمجة التطبيقات التي تجعل ريبونا ممكنًا. فيما يلي بعض بترتيب معين:
لقد عملنا بجد على ترقيات أساسية لفترة من الوقت وتبعوا في الغالب Semver. وهذا يعني أننا قمنا بزيادة رقم الإصدار الرئيسي في كل تغيير كسر. هذا يقودنا إلى رقم الإصدار الرئيسي الحالي V5. فلماذا يدعى repo الآن paperqa2؟ أردنا أن نلاحظ عن حقيقة أننا تجاوزنا الأداء البشري على العديد من المقاييس المهمة. لذلك ندعو بشكل تعسفي الإصدار 5 و PaperQa2 ، والإصدارات قبلها كورق exaa1 للإشارة إلى التغيير الكبير في الأداء. نحن ندرك أننا نواجه تحديًا في التسمية والعد في FutureHouse ، لذلك نحتفظ بالحق في أي وقت في تغيير الاسم بشكل تعسفي إلى Papercrow.
وأضاف الإصدار 5:
pqaDocs لاحظ أن كائنات Docs المخللة من الإصدارات السابقة من PaperQA غير متوافقة مع الإصدار 5 ، وسيحتاج إلى إعادة بنائها. أيضا ، تمت زيادة الحد الأدنى من إصدار Python إلى Python 3.11.
لفهم PaperQA2 ، لنبدأ بقطع الخوارزمية الأساسية. سير العمل الافتراضي لـ PaperQA2 كما يلي:
| مرحلة | إجراءات paperqa2 |
|---|---|
| 1. البحث الورقي | - احصل على أوراق مرشح من استعلام الكلمات الرئيسية التي تم إنشاؤها بواسطة LLM |
| - قطعة ، تضمين ، وأضف أوراق المرشح إلى الدولة | |
| 2. جمع الأدلة | - تضمين الاستعلام في المتجه |
| - رتبة أفضل قطع مستند K في الحالة الحالية | |
| - إنشاء ملخص مسجل لكل قطعة في سياق الاستعلام الحالي | |
| - استخدم LLM لإعادة تدريب واختيار معظم الملخصات ذات الصلة | |
| 3. توليد الإجابة | - ضع أفضل ملخصات في موجه مع السياق |
| - توليد إجابة مع موجه |
يمكن استدعاء الأدوات بأي ترتيب من قبل وكيل لغة. على سبيل المثال ، قد يقوم وكيل LLM بإجراء بحث ضيق وواسع ، أو يستخدم صياغة مختلفة لخطوة أدلة التجميع من خطوة الإجابة.
لإعداد غير تطوير ، قم بتثبيت PaperQA2 (المعروف أيضًا باسم الإصدار 5) من PYPI. ملاحظة الإصدار 5 يتطلب Python 3.11+.
pip install paper-qa > =5لإعداد التطوير ، يرجى الرجوع إلى ملف المساهمة.
يستخدم PaperQA2 LLM للعمل ، لذلك ستحتاج إما إلى تعيين متغير بيئة مفتاح API مناسب (أي export OPENAI_API_KEY=sk-... ) أو إعداد خادم LLM مفتوح المصدر (أي باستخدام llamafile. يتم تكوينها للاستخدام مع paperqa2.
إذا كنت بحاجة إلى فهرسة مجموعة كبيرة من الأوراق (100+) ، فمن المحتمل أن ترغب في مفتاح API لكل من CrossRef والباحث الدلالي ، مما سيسمح لك بتجنب ضرب حدود الأسعار العامة باستخدام خدمات البيانات الوصفية هذه. يمكن تصديرها كمتغيرات CROSSREF_API_KEY و SEMANTIC_SCHOLAR_API_KEY .
أسرع طريقة لاختبار PaperQA2 هي عبر CLI. انتقل أولاً إلى دليل مع بعض الأوراق واستخدم pqa CLI:
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'سترى PaperQA2 فهرس ملفات PDF المحلية الخاصة بك ، وجمع البيانات الوصفية اللازمة لكل منها (باستخدام CrossRef والباحث الدلالي) ، والبحث عن هذا الفهرس ، ثم تقسيم الملفات إلى سياقات أدلة مكثرة ، وترتيبها ، وإنشاء إجابة في النهاية. في المرة التالية التي يتم فيها الاستعلام عن هذا الدليل ، سيتم بالفعل بناء الفهرس الخاص بك (باستثناء أي اختلافات تم اكتشافها ، مثل الأوراق المضافة الجديدة) ، لذلك سيتخطى خطوات الفهرسة والتشكيل.
سيتم فهرسة جميع الإجابات السابقة وتخزينها ، يمكنك عرضها عن طريق الاستعلام عبر المجموعة الفرعية search ، أو الوصول إليها بنفسك في دليل PQA_HOME ، والذي يتخلف عن سداد ~/.pqa/ .
$ pqa search -i ' answers ' ' antibodies ' PaperQA2 قابلة للتكوين بشكل كبير ، عند التشغيل من سطر الأوامر ، يعرض pqa --help جميع الخيارات والأوصاف القصيرة. على سبيل المثال لتشغيل مع درجة حرارة أعلى:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' يمكنك عرض جميع الإعدادات مع pqa view . هناك شيء مفيد آخر هو التغيير إلى إعدادات أخرى تمثل - على سبيل المثال fast هو إعداد يجيب بسرعة أكبر ويمكنك رؤيته باستخدام pqa -s fast view
ربما لديك بعض الإعدادات الجديدة التي تريد حفظها؟ يمكنك القيام بذلك مع
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 saveوبعد ذلك يمكنك استخدامه مع
pqa -s my_new_settings ask ' What manufacturing challenges are unique to bispecific antibodies? ' إذا قمت بتشغيل pqa باستخدام أمر يتطلب فهرسة جديدة ، فقل إذا قمت بتغيير chunk_size الافتراضي ، فسيتم إنشاء فهرس جديد تلقائيًا لك.
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? ' يمكنك أيضًا استخدام pqa للقيام بالبحث عن النص الكامل باستخدام LLMS عرض أمر البحث. على سبيل المثال ، دعنا نحفظ الفهرس من دليل ونمنحه اسمًا:
pqa -i nanomaterials indexالآن يمكنني البحث عن أوراق حول الطاقة الحرارية:
pqa -i nanomaterials search thermoelectricsأو يمكنني استخدام السؤال العادي
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'يحتوي كل من CLI والوحدة النمطية على إعدادات تم تكوينها مسبقًا بناءً على الأداء السابق ومنشوراتنا ، يمكن استدعاءها على النحو التالي:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' داخل paperqa/configs نحن نحزم الإعدادات المفيدة المعروفة:
| إعداد الاسم | وصف |
|---|---|
| High_quality | أداء للغاية ، باهظ الثمن نسبيا (بسبب وجود evidence_k = 15) باستخدام وكيل ToolSelector . |
| سريع | الإعداد للحصول على إجابات بثمن بخس وبسرعة. |
| ويككرو | الإعداد لمحاكاة كتابة مقالة ويكيبيديا المستخدمة في منشور wikicrow لدينا. |
| كونتاكرو | الإعداد للعثور على تناقضات في الأوراق ، يجب أن يكون استفسارك مطالبة يجب أن يتم وضع علامة عليها على أنها تناقض (أو لا). |
| تصحيح | تحديد مفيد فقط للتصحيح ، ولكن ليس في أي تطبيق فعلي يتجاوز تصحيح الأخطاء. |
| tier1_limits | الإعدادات التي تتطابق مع حدود معدل Openai لكل طبقة ، يمكنك استخدام tier<1-5>_limits لتحديد الطبقة. |
إذا كنت تصل إلى حدود معدل ، على سبيل المثال مع خطة Openai Tier 1 ، يمكنك إضافتها إلى PaperQA2. لكل طبقة من Openai ، يوجد إعداد تم إنشاؤه مسبقًا للحد من الاستخدام.
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? 'سيؤدي ذلك إلى الحد من نظامك لاستخدام tier1_limits ، وإبطاء استفساراتك لاستيعابها.
يمكنك أيضًا تحديدها يدويًا مع أي سلسلة من الأسعار التي تتطابق مع المواصفات في وحدة الحدود:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? ' أو عن طريق الإضافة إلى كائن Settings ، إذا اتصل بشكل حريفي:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
summary_llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
),
)يمكن الوصول إلى سير العمل الكامل لـ PaperQA2 عبر Python مباشرة:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)يرجى الاطلاع على مستندات التثبيت الخاصة بنا حول كيفية تثبيت الحزمة من PYPI.
ask يدويًا يحتوي كائن الإجابة على السمات التالية: formatted_answer ، answer (الإجابة وحدها) ، question ، context (ملخصات المقاطع الموجودة للإجابة). ask تستخدم أداة SearchPapers ، والتي ستستفسر عن فهرس محلي للملفات ، يمكنك تحديد هذا الموقع عبر كائن Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
) ask هو مجرد غلاف ملائم حول نقطة الدخول الحقيقية ، والتي يمكن الوصول إليها إذا كنت ترغب في تشغيل أعباء العمل غير المتزامنة المتزامنة:
from paperqa import Settings , agent_query , QueryRequest
answer = await agent_query (
QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)
) سيستخدم الوكيل الافتراضي وكيلًا قائمًا على LLM ، ولكن يمكنك أيضًا تحديد وكيل "fake" لاستخدام مسار استدعاء مشفرة صلبة للبحث -> جمع الأدلة -> الإجابة لتقليل استخدام الرمز المميز.
إذا كنت تفضل التحكم الدقيق في الحبيبات ، وترغب في إضافة كائنات إلى كائن المستندات بنفسك (بدلاً من استخدام أداة البحث) ، يمكن استخدام واجهة كائن Docs الموجودة سابقًا:
from paperqa import Docs , Settings
# valid extensions include .pdf, .txt, and .html
doc_paths = ( "myfile.pdf" , "myotherfile.pdf" )
docs = Docs ()
for doc in doc_paths :
docs . add ( doc )
settings = Settings ()
settings . llm = "claude-3-5-sonnet-20240620"
settings . answer . answer_max_sources = 3
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
print ( answer . formatted_answer ) PaperQA2 مكتوبة لاستخدامها بشكل غير متزامن. واجهة برمجة التطبيقات المتزامنة هي مجرد غلاف حول Async. فيما يلي الأساليب ومكافئاتها async :
| المزامنة | غير متزامن |
|---|---|
Docs.add | Docs.aadd |
Docs.add_file | Docs.aadd_file |
Docs.add_url | Docs.aadd_url |
Docs.get_evidence | Docs.aget_evidence |
Docs.query | Docs.aquery |
النسخة المتزامنة تستدعي فقط إصدار Async في حلقة. تدعم معظم بيئات Python الحديثة async أصلاً (بما في ذلك أجهزة الكمبيوتر المحمولة Jupyter!). حتى تتمكن من القيام بذلك في دفتر Jupyter:
import asyncio
from paperqa import Docs
async def main () -> None :
docs = Docs ()
# valid extensions include .pdf, .txt, and .html
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
await docs . aadd ( doc )
answer = await docs . aquery (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer . formatted_answer )
asyncio . run ( main ()) بشكل افتراضي ، يستخدم نماذج Openai مع gpt-4o-2024-08-06 لكل من الخطوة إعادة التصنيف والملخص ، وإعداد summary_llm ، ولخطوة الإجابة ، إعداد llm . يمكنك ضبط هذا بسهولة:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "gpt-4o-mini" , summary_llm = "gpt-4o-mini" , paper_directory = "my_papers"
),
) يمكنك استخدام أنثروبور أو أي نموذج آخر يدعمه litellm :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "claude-3-5-sonnet-20240620" , summary_llm = "claude-3-5-sonnet-20240620"
),
)يمكنك استخدام llama.cpp ليكون LLM. لاحظ أنه يجب أن تستخدم نماذج كبيرة نسبيًا ، لأن PaperQA2 يتطلب اتباع الكثير من التعليمات. لن تحصل على أداء جيد مع طرز 7B.
أسهل طريقة للحصول على الإعداد هي تنزيل ملف LLAMA وتنفيذه باستخدام -cb -np 4 -a my-llm-model --embedding سيمكّن التضمين المستمر والتضمينات.
from paperqa import Settings , ask
local_llm_config = dict (
model_list = [
dict (
model_name = "my_llm_model" ,
litellm_params = dict (
model = "my-llm-model" ,
api_base = "http://localhost:8080/v1" ,
api_key = "sk-no-key-required" ,
temperature = 0.1 ,
frequency_penalty = 1.5 ,
max_tokens = 512 ,
),
)
]
)
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "my-llm-model" ,
llm_config = local_llm_config ,
summary_llm = "my-llm-model" ,
summary_llm_config = local_llm_config ,
),
) كما يتم دعم النماذج المستضافة مع ollama . لتشغيل المثال أدناه ، تأكد من تنزيل LLAMA3.2 و MXBAI-embed-large عبر Ollama.
from paperqa import Settings , ask
local_llm_config = {
"model_list" : [
{
"model_name" : "ollama/llama3.2" ,
"litellm_params" : {
"model" : "ollama/llama3.2" ,
"api_base" : "http://localhost:11434" ,
},
}
]
}
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "ollama/llama3.2" ,
llm_config = local_llm_config ,
summary_llm = "ollama/llama3.2" ,
summary_llm_config = local_llm_config ,
embedding = "ollama/mxbai-embed-large" ,
),
) PaperQA2 الافتراضية لاستخدام Openai ( text-embedding-3-small ) ، ولكن لديها خيارات مرنة لكل من المتاجر المتجهات واختيارات التضمين. إن أبسط طريقة لتغيير التضمين هي عبر وسيطة embedding على مُنشئ كائن Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding يقبل أي اسم طراز التضمين الذي يدعمه Litellm. يدعم PaperQA2 أيضًا إدخالًا للتضمين "hybrid-<model_name>" ie "hybrid-text-embedding-3-small" لاستخدام الكلمة الرئيسية المتناثرة الهجينة (استنادًا إلى مُضطر مميز) وتضمين المتجه الكثيف ، حيث يمكن لأي نموذج litellm نماذج التضمين يمكن استخدامها في اسم النموذج الكثيف. يمكن استخدام "sparse" لاستخدام كلمات رئيسية متناثرة فقط.
تُستخدم نماذج التضمين لإنشاء فهرس PaperQA2 لناقلات تضمين النص الكامل ( texts_index Mistument). يمكن تحديد نموذج التضمين كإعداد عند إضافة أوراق جديدة إلى كائن Docs :
from paperqa import Docs , Settings
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , settings = Settings ( embedding = "text-embedding-large-3" )) لاحظ أن PaperQA2 يستخدم Numpy كمتجر متجه كثيف. يقلل تصميمه لاستخدام الكلمات الرئيسية في البداية من عدد القطع اللازمة لكل إجابة على عدد صغير نسبيًا <1K. لذلك ، يعد NumpyVectorStore مكانًا جيدًا للبدء ، إنه متجر بسيط في الذاكرة ، بدون أي فهرس. ومع ذلك ، إذا كانت هناك حاجة إلى متجر أكبر من الذاكرة ، فنحن نفتقر حاليًا هنا.
يمكن تخصيص التضمينات الهجينة:
from paperqa import (
Docs ,
HybridEmbeddingModel ,
SparseEmbeddingModel ,
LiteLLMEmbeddingModel ,
)
model = HybridEmbeddingModel (
models = [ LiteLLMEmbeddingModel (), SparseEmbeddingModel ( ndim = 1024 )]
)
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , embedding_model = model ) نماذج التضمين المتفرقة (الكلمة الرئيسية) الافتراضية لوجود 256 بعدًا ، ولكن يمكن تحديد ذلك عبر وسيطة ndim .
يمكنك استخدام نموذج SentenceTransformerEmbeddingModel إذا قمت بتثبيت sentence-transformers ، وهي مكتبة التضمين المحلية مع دعم لنماذج Huggingface والمزيد. يمكنك تثبيته عن طريق إضافة الإضافات local .
pip install paper-qa[local] ثم بادئة تدمير أسماء النماذج مع st- :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "st-multi-qa-MiniLM-L6-cos-v1" ),
)أو مع نموذج هجين
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "hybrid-st-multi-qa-MiniLM-L6-cos-v1" ),
) يمكنك ضبط أعداد المصادر (مقاطع النص) لتقليل استخدام الرمز المميز أو إضافة المزيد من السياق. يشير k إلى أعلى K الأكثر صلة وتنوعًا (من مصادر مختلفة). يتم إرسال كل مقطع إلى LLM لتلخيص ، أو تحديد ما إذا كان غير ذي صلة. بعد هذه الخطوة ، يتم تطبيق حد لـ max_sources بحيث يمكن أن تتناسب الإجابة النهائية مع نافذة سياق LLM. وبالتالي ، فإن k > max_sources و max_sources هو عدد المصادر المستخدمة في الإجابة النهائية.
from paperqa import Settings
settings = Settings ()
settings . answer . answer_max_sources = 3
settings . answer . k = 5
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)لا تحتاج إلى استخدام الأوراق - يمكنك استخدام الكود أو HTML الخام. لاحظ أن هذه الأداة تركز على الإجابة على الأسئلة ، لذلك لن تعمل بشكل جيد في كتابة التعليمات البرمجية. ملاحظة واحدة هي أن الأداة لا يمكنها استنتاج الاستشهادات من الكود ، لذلك ستحتاج إلى تزويدها بنفسك.
import glob
import os
from paperqa import Docs
source_files = glob . glob ( "**/*.js" )
docs = Docs ()
for f in source_files :
# this assumes the file names are unique in code
docs . add ( f , citation = "File " + os . path . name ( f ), docname = os . path . name ( f ))
answer = docs . query ( "Where is the search bar in the header defined?" )
print ( answer )قد ترغب في ذاكرة التخزين المؤقت للنصوص المحسورة والتضمينات في قاعدة بيانات أو ملف خارجي. يمكنك بعد ذلك إنشاء كائن مستندات من هؤلاء مباشرة:
from paperqa import Docs , Doc , Text
docs = Docs ()
for ... in my_docs :
doc = Doc ( docname = ..., citation = ..., dockey = ..., citation = ...)
texts = [ Text ( text = ..., name = ..., doc = doc ) for ... in my_texts ]
docs . add_texts ( texts , doc ) سيتم وضع الفهارس في الدليل المنزلي بشكل افتراضي. يمكن التحكم في ذلك عبر متغير بيئة PQA_HOME .
يتم إجراء الفهارس عن طريق قراءة الملفات في Settings.paper_directory . بشكل افتراضي ، نقرأ بشكل متكرر من الدليل الفرعي للدليل الورقي ، ما لم يتم تعطيله باستخدام Settings.index_recursively . لم يتم تعديل دليل الورق بأي شكل من الأشكال ، فهو يتم قراءته للتو.
تحاول عملية الفهرسة استنتاج بيانات التعريف الورقية مثل العنوان و DOI باستخدام معالجة النص التي تعمل بالطاقة LLM. يمكنك تجنب هذه النقطة من عدم اليقين باستخدام ملف "واضح" ، وهو CSV يحتوي على ثلاثة أعمدة (لا يهم الطلب):
file_location : المسار النسبي إلى PDF للورقة داخل دليل الفهرسdoi : دوي من الورقةtitle : عنوان الورقةمن خلال توفير هذه المعلومات ، نضمن أن استفسارات مقدمي البيانات الوصفية مثل CrossRef دقيقة.
تم تصميم فهارس البحث المحلية بناءً على تجزئة من كائن Settings الحالية. لذا تأكد من تحديد paper_directory بشكل صحيح إلى كائن Settings . بشكل عام ، من المستحسن:
import os
from paperqa import Settings
from paperqa . agents . main import agent_query
from paperqa . agents . models import QueryRequest
from paperqa . agents . search import get_directory_index
async def amain ( folder_of_papers : str | os . PathLike ) -> None :
settings = Settings ( paper_directory = folder_of_papers )
# 1. Build the index. Note an index name is autogenerated when unspecified
built_index = await get_directory_index ( settings = settings )
print ( settings . get_index_name ()) # Display the autogenerated index name
print ( await built_index . index_files ) # Display the index contents
# 2. Use the settings as many times as you want with ask
answer_response_1 = await agent_query (
query = QueryRequest (
query = "What is the best way to make a vaccine?" , settings = settings
)
)
answer_response_2 = await agent_query (
query = QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
) في paperqa/agents/task.py ، ستجد:
GradablePaperQAEnvironment : بيئة يمكن أن ترتدي الإجابات بالنظر إلى وظيفة التقييم.LitQAv2TaskDataset : مجموعة بيانات مهمة مصممة لسحب Litqa V2 من Hugging Face ، وإنشاء GradablePaperQAEnvironment لكل سؤالفيما يلي مثال على كيفية استخدامها:
import os
from aviary . env import TaskDataset
from ldp . agent import SimpleAgent
from ldp . alg . callbacks import MeanMetricsCallback
from ldp . alg . runners import Evaluator , EvaluatorConfig
from paperqa import QueryRequest , Settings
from paperqa . agents . task import TASK_DATASET_NAME
async def evaluate ( folder_of_litqa_v2_papers : str | os . PathLike ) -> None :
base_query = QueryRequest (
settings = Settings ( paper_directory = folder_of_litqa_v2_papers )
)
dataset = TaskDataset . from_name ( TASK_DATASET_NAME , base_query = base_query )
metrics_callback = MeanMetricsCallback ( eval_dataset = dataset )
evaluator = Evaluator (
config = EvaluatorConfig ( batch_size = 3 ),
agent = SimpleAgent (),
dataset = dataset ,
callbacks = [ metrics_callback ],
)
await evaluator . evaluate ()
print ( metrics_callback . eval_means )واحدة من أقوى ميزات PaperQA2 هي قدرتها على الجمع بين البيانات من مصادر بيانات التعريف المتعددة. على سبيل المثال ، يمكن لـ Unpaywall توفير حالة وصول مفتوحة/روابط مباشرة إلى PDFs ، ويمكن لـ CrossRef توفير bibtex ، ويمكن للباحث الدلالي توفير تراخيص الاقتباس. إليك عرضًا توضيحيًا قصيرًا لكيفية القيام بذلك:
from paperqa . clients import DocMetadataClient , ALL_CLIENTS
client = DocMetadataClient ( clients = ALL_CLIENTS )
details = await client . query ( title = "Augmenting language models with chemistry tools" )
print ( details . formatted_citation )
# Andres M. Bran, Sam Cox, Oliver Schilter, Carlo Baldassari, Andrew D. White, and Philippe Schwaller.
# Augmenting large language models with chemistry tools. Nature Machine Intelligence,
# 6:525-535, May 2024. URL: https://doi.org/10.1038/s42256-024-00832-8,
# doi:10.1038/s42256-024-00832-8.
# This article has 243 citations and is from a domain leading peer-reviewed journal.
print ( details . citation_count )
# 243
print ( details . license )
# cc-by
print ( details . pdf_url )
# https://www.nature.com/articles/s42256-024-00832-8.pdf يهدف client.query . إنه قوي بعض الشيء (مثل الغلاف ، وفقد كلمة). هناك تكرارات للعناوين - بحيث يمكنك أيضًا إضافة مؤلفين إلى الغموض. أو يمكنك توفير doi client.query(doi="10.1038/s42256-024-00832-8") .
إذا كنت تفعل ذلك على نطاق واسع ، فقد لا ترغب في استخدام ALL_CLIENTS (فقط حذف الوسيطة) ويمكنك تحديد الحقول المحددة التي تريد تسريع الاستعلامات. على سبيل المثال:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)سيعود أسرع بكثير من الاستعلام الأول وسنكون متأكدين من تطابق المؤلفين.
حسنًا ، هذا سؤال جيد حقًا! ربما من الأفضل تنزيل ملفات PDF من الأوراق التي تعتقد أنها ستساعد في الإجابة على سؤالك والبدء من هناك.
لقد مر بعض الوقت منذ أن اختبرنا هذا - لذلك أخبرنا إذا كان سيواجه مشكلات!
إذا كنت تستخدم Zotero لتنظيم المراجع الشخصية الخاصة بك ، فيمكنك استخدام paperqa.contrib.ZoteroDB للاستعلام عن أوراق من مكتبتك ، والتي تعتمد على Pyzotero.
قم بتثبيت pyzotero عبر zotero Extra لهذه الميزة:
pip install paperqa[zotero]أولاً ، لاحظ أن PaperQA2 تخلق PDF من الأوراق لتخزينها في قاعدة البيانات ، لذلك يجب أن تحتوي جميع الأوراق ذات الصلة على PDFs المخزنة داخل قاعدة البيانات الخاصة بك. يمكنك الحصول على Zotero للقيام بذلك تلقائيًا عن طريق تسليط الضوء على المراجع التي ترغب في استردادها ، والنقر بزر الماوس الأيمن ، واختيار "البحث عن ملفات PDF" المتاحة . يمكنك أيضًا سحب PDFs يدويًا على كل مرجع.
لتنزيل الأوراق ، تحتاج إلى الحصول على مفتاح API لحسابك.
ZOTERO_USER_ID .https://www.zotero.org/groups/groupname ، وتحركه على رابط الإعدادات. المعرف هو عدد صحيح بعد /مجموعات /. ( H/T Pyzotero! )ZOTERO_API_KEY .مع هذا ، يمكننا تنزيل الأوراق من مكتبتنا وإضافتها إلى paperqa2:
from paperqa import Docs
from paperqa . contrib import ZoteroDB
docs = Docs ()
zotero = ZoteroDB ( library_type = "user" ) # "group" if group library
for item in zotero . iterate ( limit = 20 ):
if item . num_pages > 30 :
continue # skip long papers
docs . add ( item . pdf , docname = item . key ) والتي ستقوم بتنزيل أول 20 ورقة في قاعدة بيانات Zotero الخاصة بك وإضافتها إلى كائن Docs .
يمكننا أيضًا القيام باستعلامات محددة لمكتبة Zotero الخاصة بنا والتكرار حول النتائج:
for item in zotero . iterate (
q = "large language models" ,
qmode = "everything" ,
sort = "date" ,
direction = "desc" ,
limit = 100 ,
):
print ( "Adding" , item . title )
docs . add ( item . pdf , docname = item . key ) يمكنك قراءة المزيد حول بناء جملة البحث عن طريق كتابة zotero.iterate? في Ipython.
إذا كنت ترغب في البحث عن أوراق خارج مجموعتك الخاصة ، فقد وجدت مشروعًا غير ذي صلة بعنوان "Paper-Scraper" يبدو أنه قد يساعد. ولكن حذار ، يبدو هذا المشروع أنه يستخدم بعض أدوات الكشط التي قد تنتهك حقوق الناشر أو تكون في منطقة رمادية من الشرعية.
from paperqa import Docs
keyword_search = "bispecific antibody manufacture"
papers = paperscraper . search_papers ( keyword_search )
docs = Docs ()
for path , data in papers . items ():
try :
docs . add ( path )
except ValueError as e :
# sometimes this happens if PDFs aren't downloaded or readable
print ( "Could not read" , path , e )
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer )لتنفيذ وظيفة على كل جزء من إكمال LLM ، تحتاج إلى توفير وظيفة يمكن تنفيذها على كل قطعة. على سبيل المثال ، للحصول على عرض الآلة الكاتبة للإكمال ، يمكنك القيام به:
def typewriter ( chunk : str ) -> None :
print ( chunk , end = "" )
docs = Docs ()
# add some docs...
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
callbacks = [ typewriter ],
) بشكل عام ، يتم تخطيط التضمينات مؤقتًا عند مخلل Docs بغض النظر عن متجر المتجهات الذي تستخدمه. طالما قمت بحفظ كائن Docs الأساسي الخاص بك ، يجب أن تكون قادرًا على تجنب إعادة صياغة مستنداتك.
يمكنك تخصيص أي من المطالبات باستخدام الإعدادات.
from paperqa import Docs , Settings
my_qa_prompt = (
"Answer the question '{question}' n "
"Use the context below if helpful. "
"You can cite the context using the key like (Example2012). "
"If there is insufficient context, write a poem "
"about how you cannot answer. n n "
"Context: {context}"
)
docs = Docs ()
settings = Settings ()
settings . prompts . qa = my_qa_prompt
docs . query ( "Are covid-19 vaccines effective?" , settings = settings )بعد بناء الجملة أعلاه ، يمكنك أيضًا تضمين مطالبات يتم تنفيذها بعد الاستعلام وقبل الاستعلام. على سبيل المثال ، يمكنك استخدام هذا لانتقاد الإجابة.
داخليًا في FutureHouse ، لدينا مجموعة مختلفة قليلاً من الأدوات. نحن نحاول الحصول على بعضهم ، مثل اجتياز الاقتباس ، في هذا الريبو. ومع ذلك ، لدينا واجهات برمجة التطبيقات والتراخيص للوصول إلى أوراق البحث التي لا يمكننا مشاركتها علانية. وبالمثل ، في نتائج أوراقنا البحثية ، لا نبدأ مع PDF المعروفة. يتعين على وكيلنا التعرف عليها باستخدام البحث عن الكلمات الرئيسية على جميع الأوراق ، بدلاً من مجرد مجموعة فرعية. نحن نتوافق تدريجياً من هذين الإصدارين من PaperQA ، ولكن حتى يكون هناك طريقة مفتوحة المصدر للوصول بحرية للأوراق (حتى مجرد أوراق مفتوحة المصدر) ، ستحتاج إلى تزويد PDF بنفسك.
يعد كل من Langchain و Llamaindex أطرافًا للعمل مع تطبيقات LLM ، مع تجريدات من أجل سير العمل الوكلاء وجيل معزز الاسترجاع.
بمرور الوقت ، اختار فريق PaperQA بمرور الوقت أن يصبح إطار عمل ، بدلاً من ذلك ، الاستعانة بمصادر خارجية لبرامج التشغيل LLM إلى Litellm ولا يوجد إطار إلى جانب Pydantic لأدواتها. يركز PaperQA على الأوراق العلمية وبيانات التعريف الخاصة بها.
يمكن إعادة تنفيذ PaperQA باستخدام Llamaindex أو Langchain. على سبيل المثال ، يمكن إعادة تنفيذ أداة GatherEvidence الخاصة بنا كمسترد مع ملخص إعادة صياغة قائم على LLM. هناك عمل مماثل مع طريقة استجابة الشجرة في Llamaindex.
يمكن أن تكون فئة Docs مخللًا وغير مختبئ. هذا مفيد إذا كنت ترغب في حفظ تضمينات المستندات ثم تحميلها لاحقًا.
import pickle
# save
with open ( "my_docs.pkl" , "wb" ) as f :
pickle . dump ( docs , f )
# load
with open ( "my_docs.pkl" , "rb" ) as f :
docs = pickle . load ( f )الواردة في المستندات/2024-10-16_LITQA2-SPLITS.JSON5 هي معرفات الأسئلة (تتوافق مع معرفات أسئلة LITQA2 الخاصة بمقاعد المختبر) المستخدمة في تقسيم القطار والتقييم ، وكذلك DOIS الورقية المستخدمة لبناء فهارس تقسيم القطار والتقييم . لا يزال انقسام الاختبار محتجزًا.
يرجى قراءة الأوراق التالية واستشهد بها إذا كنت تستخدم هذا البرنامج:
@article { skarlinski2024language ,
title = { Language agents achieve superhuman synthesis of scientific knowledge } ,
author = {
Michael D. Skarlinski and
Sam Cox and
Jon M. Laurent and
James D. Braza and
Michaela Hinks and
Michael J. Hammerling and
Manvitha Ponnapati and
Samuel G. Rodriques and
Andrew D. White } ,
year = { 2024 } ,
journal = { arXiv preprent arXiv:2409.13740 } ,
url = { https://doi.org/10.48550/arXiv.2409.13740 }
} @article { lala2023paperqa ,
title = { PaperQA: Retrieval-Augmented Generative Agent for Scientific Research } ,
author = {
Jakub Lála and
Odhran O'Donoghue and
Aleksandar Shtedritski and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White } ,
journal = { arXiv preprint arXiv:2312.07559 } ,
year = { 2023 }
}