ساختن نماینده تحقیقاتی AI با نمایندگان Openai و Autokitteh

آشنایی با عوامل هوش مصنوعی
مأمورین هوش مصنوعی به طور مستقل عمل می کنند ، تصمیم می گیرند و برای دستیابی به اهداف خاص اقدام می کنند. مهمترین چالش آنها حفظ وضعیت در بین وقفه ها است – وقتی وظیفه یک عامل ساعت یا روز طول می کشد ، هرگونه اختلال می تواند آن را مجبور به شروع مجدد از ابتدا کند و پیشرفت ارزشمندی را از دست بدهد.
مشکل دولت در طراحی عامل
مدیریت دولت برای عوامل مؤثر بسیار مهم است. بدون آن ، هرگونه وقفه ای همه پیشرفت را تنظیم می کند – یک ناراحتی جزئی برای کارهای ساده اما برای تحقیقات پیچیده فاجعه بار است.
یک نماینده تحقیقاتی که در میانه راه از طریق یک کار از دست می دهد ، فراموش می کند:
- منابع قبلاً مشورت کرده اند
- اطلاعات جمع آوری شده
- نتیجه گیری ترسیم شد
- سوالات باقی مانده
- استراتژی تحقیق آن
این محدودیت اساساً محدود می کند که چه کارهایی را می توانیم با اطمینان به عوامل هوش مصنوعی اختصاص دهیم.
عوامل تحقیقاتی
وظایف تحقیقاتی نیاز به کار متدولوژیکی و تکراری دارند که دانش را به تدریج ایجاد می کند. Framework Agent OpenAI ابزاری مانند جستجوی وب ، استفاده از رایانه و جستجوی فایل را فراهم می کند ، اما از آن استفاده می شود ، هیچ قابلیت برای حفظ وضعیت بادوام نمی دهد. اگر برنامه شما خراب شود یا سرور شما دوباره راه اندازی شود ، وضعیت عامل از بین می رود.
این یک چالش مهم برای عوامل تحقیقاتی که نیاز به حفظ زمینه در دوره های طولانی دارند ، به ویژه هنگام بررسی مباحث پیچیده ای که نیاز به چندین مرحله و جمع آوری اطلاعات قابل توجه یا درگیر شدن تعامل انسان در حلقه دارند ، ایجاد می کند. هنگامی که یک مأمور تحقیقاتی باید منتظر ورودی انسان باشد – برای تأیید یک یافته ، زمینه اضافی یا برقراری تماس قضاوت – که انتظار ممکن است برای دقیقه ، ساعت یا حتی روزها تمدید شود. بدون مدیریت مناسب دولت ، این گردش کار مشارکتی غیر عملی می شوند ، زیرا هرگونه اختلال در دوره انتظار باعث تنظیم مجدد کل فرآیند می شود و تمام زمینه انباشته شده را از دست می دهد.
انتخاب انتزاع مناسب برای مدیریت دولت
عوامل تحقیقاتی نیاز به تداوم در سراسر اختلال در سیستم و تأخیر در تعامل انسان دارند. بدون انتزاع مناسب ، هنگامی که برنامه ها خراب می شوند ، دولت عامل از بین می رود ، یا سرورها مجدداً شروع می شوند و تحقیقات را مجبور می کنند که دوباره شروع کنند.
ساختار کد را به عنوان گردش کار و فعالیت ها در نظر بگیرید:
- گردش کار برنامه های قطعی هستند که منطق کلی ارکستراسیون را تعریف می کنند و وضعیت بادوام را حفظ می کنند. آنها به طور خودکار زمینه اجرای خود را ادامه می دهند و امکان از سرگیری یکپارچه را پس از وقفه از طریق پخش مجدد فراهم می کنند. این قسمت ارکستور عامل است که “خالص” است زیرا مستقیماً عوارض جانبی ایجاد نمی کند.
- فعالیت عملیات غیر قطعی است که با سیستم های خارجی تعامل دارند (پایگاه داده ها ، API ها ، سیستم های پرونده ، ورودی های انسانی). آنها توسط موتور گردش کار با منطق آزمایش مجدد خودکار و کار با شکست اجرا می شوند. خروجی های آنها باید برای ادامه و حافظه نهان قابل استفاده باشد. این بخشی است که می تواند عوارض جانبی ایجاد کند. با استفاده از مورد از مأمورین تحقیق ، ساختار تا حدودی ساده لوحانه می تواند مانند آن نوشته شود:
def research(topic: str) -> str:
"""Research a topic and return report.
This is the "workflow" part of the code.
"""
# Plan the research.
tasks: list[Task] = _plan(topic)
answers: list[str] = [_execute(task) for task in tasks]
for task in plan:
# Execute the given task. This might be costly - so if we have any interruption
# between steps here, we don't want to repeat previously executed steps.
# As this is executed as an activity, if it is completed, on replay it will
# not be executed - we will just reuse the previous result.
result = _execute(task)
answers.append(result)
return _summarize(topic, answers)
@activity
def _plan(topic: str) -> list[Task]:
"""Generate tasks to perform in order to research a given topic"""
...
@activity
def _execute(task: Task) -> str:
"""Execute a specific research task"""
...
@activity
def _summarize(topic: str, answers: list[str]) -> str:
"""Summarize all the answers in a way that explain the topic"""
...
Autokitteh (ساخته شده در بالای موقتی) این روند را به طرز چشمگیری ساده می کند.
Autokitteh یک پلت فرم بدون سرور OSS برای گردش کار با دوام است. این می تواند کد پایتون وانیلی را به خود اختصاص دهد و آن را به طور دوام بیش از زمانی اجرا کند ، با استفاده از انتزاع های توضیح داده شده در بالا:
- Autokitheh می داند چه چیزی باید به عنوان یک گردش کار اجرا شود و چه چیزی باید یک فعالیت را انجام دهد. این می داند که چگونه برنامه را به طور خودکار تجزیه کند ، هرگونه عملکرد غیر تعیین کننده را رهگیری کند و اینها را به عنوان فعالیت انجام دهد. شما می توانید همه چیز را در مورد آن در عملکرد ربودن خواسته های دوام و هک کردن سیستم واردات و بازنویسی AST برای اجرای بادوام بخوانید.
- این ماده با “باتری های گنجانده شده” همراه است – اجازه می دهد تا با استفاده از ادغام هایی مانند Slack ، Jira ، Linear و دیگران ، ماشه گردش کار را از سایر سیستم ها استفاده کند. این سرور بدون سرور است و به کاربران امکان می دهد “با کلیک یک دکمه” مستقر شوند. ” استقرار معمولاً فقط چند ثانیه طول می کشد.
- این یک آرم گربه زیبا دارد!
- موارد دیگر را می توان در مقاله دیگری مورد بحث قرار داد. به این ترتیب ، یک مأمور تحقیقاتی می تواند تحقیقات چند مرحله ای را در دوره های طولانی انجام دهد ، منتظر اعتبار انسان در نقاط تصمیم گیری بحرانی و زنده ماندن از اختلالات زیرساخت ها باشد-همه در حالی که دانش انباشته خود را دست نخورده نگه می دارد. منطق اصلی عامل به جای مدیریت دولت بر روی روش تحقیق متمرکز است و باعث می شود کد قابل حفظ تر و روند تحقیق قابل اطمینان تر باشد.
این سخت است …
بیایید همانطور که در بالا توضیح داده شد ، یک گردش کار تحقیق واقعی بسازیم. به طور سنتی ، یک سیستم با یک لایه پایداری صریح ، یک ارکستراسیون ناهمزمان با استفاده از صف ها و یک لایه پایداری صریح برای دولت خواهد بود. ایجاد این روش نیاز به تخصص نسبتاً عمیقی در سیستم های گردش کار و کار زیرساختی قابل توجه دارد.
… اما لازم نیست که باشد!
Autokitteh (ساخته شده در بالای موقتی) این روند را به طرز چشمگیری ساده می کند.
Autokitteh یک پلت فرم بدون سرور OSS برای گردش کار با دوام است. این می تواند کد پایتون وانیلی را به خود اختصاص دهد و آن را به طور دوام بیش از زمانی اجرا کند ، با استفاده از انتزاع های توضیح داده شده در بالا:
- Autokitheh می داند چه چیزی باید به عنوان یک گردش کار اجرا شود و چه چیزی باید یک فعالیت را انجام دهد. این می داند که چگونه برنامه را به طور خودکار تجزیه کند ، هرگونه عملکرد غیر تعیین کننده را رهگیری کند و اینها را به عنوان فعالیت انجام دهد. شما می توانید همه چیز را در مورد آن در عملکرد ربودن خواسته های دوام و هک کردن سیستم واردات و بازنویسی AST برای اجرای بادوام بخوانید.
- این ماده با “باتری های گنجانده شده” همراه است – اجازه می دهد تا با استفاده از ادغام هایی مانند Slack ، Jira ، Linear و دیگران ، ماشه گردش کار را از سایر سیستم ها استفاده کند.
- این سرور بدون سرور است و به کاربران امکان می دهد “با کلیک یک دکمه” مستقر شوند. ” استقرار معمولاً فقط چند ثانیه طول می کشد.
- این یک آرم گربه زیبا دارد!
- موارد دیگر را می توان در مقاله دیگری مورد بحث قرار داد.
یک عامل تحقیقاتی کار
بیایید یک نسخه ی نمایشی کوتاه از یک مأمور تحقیقاتی کار کنیم. در این مثال ، ما از طریق عامل فراخوانی می کنیم !r
فرمان
همانطور که مشاهده می کنید ، ما می توانیم با نماینده مکالمه کنیم تا برنامه تحقیق را خوب تنظیم کنیم. علاوه بر این ، در این حالت ، ما می توانیم با محدود کردن زمان مجاز به پاسخ به یک سؤال و تعداد نشانه های اختصاص یافته برای یک کار خاص ، برخی از مراحل را سفارشی کنیم. سپس به نماینده می گوییم که این طرح خوب به نظر می رسد. این مرحله بعدی را آغاز می کند ، که مرحله اجرای کار است.
مأمور وظایف را اجرا کرد ، از جمله درخواست ایت با توجه به این طرح. وقتی پاسخ داد ، مرحله نهایی آغاز شد.
در بالا می توانیم ببینیم که یک گزارش نهایی تشکیل شده است ، و به ما امکان می دهد تا بیشتر آن را اصلاح کنیم تا بیشتر … واقعی باشد. ضبط های فوق نشان دهنده اجرای کامل یک مأمور تحقیقاتی متصل به Slack با استفاده از Autokitteh است. می توانید آن را (در میان نمونه های جالب دیگر) در OpenAI_AGENT_RESEARCHER بررسی کنید. این یک نسخه گسترده از آنچه در بالا مورد بحث قرار گرفت ، است ، بنابراین بیایید بخشی از آن را مرور کنیم.
عوامل
عوامل در AI.Py با استفاده از نمایندگان OpenAi تعریف می شوند:
_plan_agent = Agent(
name="PlannerAgent",
instructions="""
You are a helpful research assistant. Given a query, come up with a set of tasks
to perform to best answer the query. Output between 3 and 10 tasks to perform.
A task can be either:
- A search task: search the web for a specific term and summarize the results.
- An ask someone task: ask a specific person a question and summarize the answer.
If a user explicitly specifies a time limit for a specific user, set it as such.
Do this only if the user explicitly specifies a person to ask.
For each task result, if applicable, default max tokens to None, unless user explicitly
specified otherwise. User cannot be allowed to specify max tokens below 16.
You can also modify an existing plan, by adding or removing searches.
Always provide the complete plan as output along with an indication if the user
considers it final.
Consider the plan as final only if the user explicitly specifies so.
""",
model="gpt-4o",
output_type=ResearchPlan,
)
_search_agent = Agent(
name="SearchAgent",
instructions="""
You are a research assistant. Given a search term, you search the web for that term and
produce a concise summary of the results. The summary must 2-3 paragraphs and less than
300 words. Capture the main points. Write succinctly, no need to have complete sentences
or good grammar. This will be consumed by someone synthesizing a report, so its vital
you capture the essence and ignore any fluff. Do not include any additional commentary
other than the summary itself.
""",
tools=[WebSearchTool()],
model_settings=ModelSettings(tool_choice="required"),
output_type=str,
)
_report_agent = Agent(
name="ReporterAgent",
instructions="""
Given a question and a set of search results, write a short summary of the findings.
Refine the report per user's feedback.
If the user wishes to send a slack report, use the appropriate tools to send the slack
report to the desired user.
""",
model="gpt-4o",
tools=[send_slack_report],
output_type=Report | str,
)
این عوامل با:
- برنامه ریزی: برنامه های تحقیقاتی را با کارهای دقیق ایجاد می کند. از GPT-4O استفاده می کند و داده های ساختاری شده را در قالب برنامه تحقیق می کند. این عامل ابزار ندارد – فقط برنامه ریزی می کند که باید انجام شود.
-
جستجوگر: جستجوی وب را انجام می دهد. دسترسی به
WebSearchTool
و پیکربندی شده است تا همیشه از این ابزار استفاده کند. این خلاصه های رشته ای از نتایج جستجو را برمی گرداند. - گزارشگر: یافته ها را به گزارش ها سنتز می کند. این دسترسی به ابزار SEND_SLACK_REPORT دسترسی دارد و بسته به جریان مکالمه ، می تواند یک شیء گزارش ساختاری یا یک رشته را برگرداند.
مدیریت تعامل
نماینده برنامه ریز و خبرنگار به کاربر اجازه می دهد تا با آنها گپ بزند ، این به معنای فراخوانی چندین بار در هنگام حفظ زمینه چت است.
بگذارید توابع _chat و _run را در ai.py توضیح دهم ، که برای مدیریت تعامل عامل بسیار مهم هستند:
در _run
عمل
@activity
def _run(agent: str, history: list, q: str, rc: RunConfig) -> tuple[str, list]:
"""Run the agent with the given query and history."""
send("🤔")
while True:
try:
response = asyncio.run(
Runner.run(
agent,
history + [{"role": "user", "content": q}],
run_config=rc,
)
)
return response.final_output, response.to_input_list()
except RateLimitError as e:
# In case of a rate limit error, retry after waiting for 5 seconds.
send(f"Rate limit error: {e}\n\nWaiting 5 seconds and retrying...")
sleep(5)
این عملکرد یک دعوت واحد از یک عامل معین را انجام می دهد. این تابع چهار پارامتر طول می کشد:
-
agent
: نماینده اجرا (برنامه ریز ، جستجوگر یا گزارشگر) -
history
: تاریخ گفتگو تاکنون -
q
: پرس و جو/پیام فعلی -
rc
: پیکربندی را برای عامل اجرا کنید
سپس نماینده را فراخوانی می کند و خروجی نهایی خود و “لیست ورودی” را برمی گرداند ، که در تکرار بعدی به عنوان تاریخ استفاده می شود.
به طور معمول ، Autokitteh به طور خودکار Runner.run را به عنوان یک فعالیت اجرا می کند. با این وجود ، در اینجا یک صید وجود دارد – Runner.Run نتیجه سریال نیست زیرا عملکردی را به عنوان یکی از زمینه ها در نتیجه خود باز می گرداند. بنابراین ، ما در اینجا از “دریچه فرار” استفاده می کنیم – ما کل عملکرد را با Activity تزئین می کنیم ، که توسط Autokitteh Python SDK تهیه می شود و فقط از آنچه که ما به آن اهمیت می دهیم باز می گردیم ، که سریال قابل استفاده است.
نکته جالب دیگر رسیدگی به خطاهای محدودیت نرخ Openai است: ما به سادگی خطا ، خواب و سپس دوباره امتحان می کنیم. در روش سنتی رویداد محور ، ما نیاز به ادامه در وضعیت فعلی ، تنظیم تایمر و همه آن آشفتگی ها داشتیم.
در _chat
عمل
def _chat(agent, is_final, q: str):
"""Chat with the agent until the response is final.
An interaction using this function can span some back and forth
between the user and the agent.
Args:
agent: The agent to chat with.
is_final: A function to check if the response is final.
q: The initial query.
"""
history = []
response = None
while not (response and is_final(response)):
if not q:
q = next_input()
response, history = _run(agent, history, q, RunConfig())
send(response)
q = None
return response
این تابع با استفاده از عملکرد _Run ، مکالمات چند چرخش را کنترل می کند ، جایی که عامل و کاربر ممکن است قبل از رسیدن به نتیجه نهایی چندین بار به عقب و جلو برود. به عنوان مثال ، با نماینده برنامه ریزی ، کاربر ممکن است چندین بار این طرح را قبل از علامت گذاری به عنوان نهایی اصلاح کند.
ترکیبی از این توابع با ویژگی های دوام Autokitteh به این معنی است که:
- اگر سیستم در حین اجرای عامل خراب شود ، از جایی که خارج شده است دوباره شروع می شود
- اگر سیستم در حالی که منتظر ورودی کاربر است خراب شود ، پس از راه اندازی مجدد ، منتظر می ماند
- کل تاریخ گفتگو ، حتی در سراسر خرابی سیستم حفظ می شود
- محدودیت های نرخ و خطاهای موقت با لطف انجام می شود
این کارکردها نشان می دهد که چگونه Autokitteh باعث می شود که ایجاد گردش کار با دوام و دارای دوام که می تواند فرآیندهای طولانی و چند مرحله ای را با تعامل انسان در حلقه انجام دهد ، ساده شود.
رانندگی عوامل
با استفاده از یاران توضیح داده شده در بالا ، رانندگی عوامل بسیار ساده تر می شود:
def plan(q: str) -> ResearchPlan:
"""Plan agent driver."""
return _chat(_plan_agent, lambda x: x.is_final, q)
def search(q: SearchResearchItem) -> str:
"""Search agent driver."""
return _run(
_search_agent,
[],
q.query,
RunConfig(
model_settings=ModelSettings(
tool_choice="required",
max_tokens=q.max_tokens,
),
),
)[0]
def report(q: str, tasks: dict[str, str]):
"""Report agent driver."""
q = f"Question: {q}\n\n\nTasks results: \n"
for key, value in tasks.items():
q += f"- {key}: {value}\n\n"
return _chat(_report_agent, lambda _: False, q)
اتصال همه چیز به هم – عملکرد گردش کار
عملکرد گردش کار در workflow.py
عملکرد اصلی ارکستراسیون است که کل فرایند تحقیق را با هم پیوند می دهد. این ساختار خوب است و یک رویکرد سه فاز روشن را دنبال می کند. بیایید آن را تجزیه و تحلیل کنیم:
def workflow(q: str):
"""Run the entire interaction with the user.
There are three phases:
1. Plan the search.
2. Execute the search.
3. Report the results.
"""
# Plan the search.
search_plan = ai.plan(q)
# Iterate over all tasks in the plan and execute them.
slack.send("Now I will execute on the plan.\n")
tasks: dict[str, data.ResearchItem] = {}
for t in search_plan.tasks:
match type(t):
case data.SearchResearchItem:
slack.send(f"🔍 Searching for: {t.query}...")
tasks[f"Search query result for {t.query}"] = ai.search(t)
case data.AskSomeoneResearchItem:
slack.send(f"💬 Asking {t.who} the question: {t.question}...")
who, answer = slack.ask(t.question, t.who, t.wait_time_in_seconds)
if who:
if not answer:
slack.send(f"{who['real_name']} did not answer the question.")
answer = "No answer"
tasks[f"According to the user {who['real_name']}"] = answer
else:
tasks[f"According to the user {t.who}"] = (
f"could not figure out which user is {t.who}"
)
# Summarize and report the results.
slack.send("All tasks complete, summarizing results...")
ai.report(search_plan.question, tasks)
در اینجا آنچه این عملکرد را قدرتمند می کند آورده شده است:
مرحله 1: برنامه ریزی
search_plan = ai.plan(q)
- برای تولید یک برنامه تحقیقاتی ساختاری از نماینده برنامه ریزی استفاده می کند
- این می تواند شامل چندین تعامل عقب و جلو با کاربر برای اصلاح طرح باشد
- در پشت صحنه ، Autokitteh در این تعامل بالقوه طولانی ، دولت را حفظ می کند
فاز 2: اعدام
for t in search_plan.tasks:
match type(t):
case data.SearchResearchItem:
# Execute search tasks
case data.AskSomeoneResearchItem:
# Execute ask-someone tasks
این فاز نقاط قوت دوام را نشان می دهد:
- اجرای تکراری: هر کار را در برنامه تحقیق یک به یک پردازش می کند
- تعامل طولانی مدت انسان: برای
AskSomeoneResearchItem
وظایف ، می تواند منتظر پاسخهای انسانی باشد ، به طور بالقوه برای دوره های طولانی پیگیری پیشرفت: همه نتیجه را در فرهنگ لغت وظایف ، که در سراسر راه اندازی مجدد سیستم ادامه دارد
در slack.ask()
عملکرد از اهمیت ویژه ای برخوردار است – سؤالاتی را به کاربران خاص ارسال می کند و منتظر پاسخ آنها است که می تواند چند دقیقه ، ساعت یا روز طول بکشد. با تشکر از دوام ، گردش کار می تواند به طور نامحدود منتظر این پاسخ ها بدون از دست دادن وضعیت باشد.
فاز 3: گزارش دهی
ai.report(search_plan.question, tasks)
- تمام اطلاعات جمع آوری شده را می گیرد و یک گزارش جامع تولید می کند
- ممکن است تعامل اضافی کاربر برای اصلاح گزارش باشد
چه چیزی این بادوام را ایجاد می کند
دوام تضمین می کند که:
- اگر سیستم در حین برنامه ریزی خراب شود ، می تواند مکالمه برنامه ریزی را از سر بگیرد
- اگر در حین جستجو خراب شود ، نیازی به جستجوهای قبلی نیست
- اگر در حالی که منتظر پاسخ انسانی است سقوط کند ، همچنان به انتظار می رود
- اگر در هنگام تولید گزارش خراب شود ، داده های جمع آوری شده را از دست نمی دهد
عملکرد گردش کار نیازی به اجرای هیچ یک از این منطق دوام ندارد – Autokitteh آن را به طور خودکار کنترل می کند. به همین دلیل است که کد به جای رسیدگی به خطا و مدیریت دولت ، بسیار تمیز و متمرکز بر منطق تجارت است.
این نمونه ای از نحوه برنامه نویسی مبتنی بر گردش کار است که فرآیندهای پیچیده و طولانی را ساده می کند. توسعه دهنده می تواند بر “مسیر شاد” متمرکز شود در حالی که سیستم زیربنایی با شکست ، قیام و تداوم دولت برخورد می کند.
خودتان آن را امتحان کنید!
یک پروژه را در ابر Autokitteh رایگان شروع کنید: از الگو شروع کنید ، سپس فقط اتصالات را آغاز کنید و مستقر کنید.