ساخت کد ، یک عامل برای پایگاه کد خود را بسازید

مقدمه
به تازگی ، من با اتوماسیون مصرف داده ها به پایگاه داده های بردار ارتباط برقرار کرده ام ، و با آن روبرو شدم ingest-anything
، که من در آخرین پست خود درباره آن صحبت کردم.
پس از انتشار چونکی CodeChunker
، من تصمیم گرفتم که مصرف کد را در داخل وارد کنم ingest-anything
، و می توانید در این پست LinkedIn ، جایی که من نسخه جدید را اعلام کردم ، در مورد آن بخوانید:
تنها کاری که باید انجام شود این بود که چیزی را بسازم که بتواند قدرت مصرف کد را در یک پایگاه داده بردار نشان دهد ، و بلافاصله در ذهن من کلیک کرد: “چرا من کل پایگاه کد خود را از تمرینات حل شده از تمرینی مصرف نمی کنم؟”
اینگونه است که من Code-Ragent ، دستیار برنامه نویسی دوستانه شما را بر اساس کد های شخصی شما ایجاد کردم و در جستجوی وب پایه گذاری شده ام. این ساختمان در بالای GPT-4.1 ساخته شده است که توسط OpenAi ، Linkup ، Llamaindex ، Qdrant ، FastAPI و Streamlit ساخته شده است.
ساختمان این پروژه با هدف تهیه یک عامل قابل تکرار و سازگار انجام شده است که بنابراین مردم می توانند بر اساس نیازهای خود سفارشی سازی کنند و از سه مرحله تشکیل شده است:
- تنظیم محیط
- تهیه و مصرف داده ها
- طراحی گردش کار عامل
تنظیم محیط
من شخصاً دوست دارم محیط خود را با استفاده از Conda تنظیم کنم ، همچنین به این دلیل که به راحتی قابل حمل است ، بنابراین ما این مسیر را دنبال خواهیم کرد:
conda create -y -n code-ragent python=3.11 # you don't necessarily need to specify 3.11, it's for reproducibility purposes
conda activate code-ragent
حال بیایید تمام بسته های مورد نیاز را در محیط خود نصب کنیم:
python3 -m pip install ingest-anything streamlit
ingest-anything
در حال حاضر تمام بسته های مورد نیاز ما را برای گرفتن کد و کار خود در حال اجرا می کند ، فقط باید اضافه کنیم streamlit
، که ما برای ایجاد جلوی آن استفاده خواهیم کرد.
بیایید یک نمونه Qdrant ، به عنوان یک پایگاه داده بردار ، به صورت محلی با استفاده از Docker دریافت کنیم:
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest
مصرف داده ها
داده های شروع ، همانطور که قبلاً گفتم ، مخزن یادگیری و Go من خواهد بود ، که شامل تمرینات حل شده GO است که از تمرینات ناشی می شود. ما می توانیم با کلون کردن آن مخزن را دریافت کنیم:
git clone https://github.com/AstraBert/learning-go
و اکنون می توانیم تمام پرونده های GO موجود در آن ، در اسکریپت های پایتون خود را به شرح زیر بدست آوریم:
import os
files = []
for root, _, fls in os.walk("./learning-go"):
for f in fls:
if f.endswith(".go"):
files.append(os.path.join(root, f))
حال بیایید همه پرونده ها را با ingest-anything
:
from ingest_anything.ingestion import IngestCode
from qdrant_client import QdrantClient, AsyncQdrantClient
client = QdrantClient("http://localhost:6333")
aclient = AsyncQdrantClient("http://localhost:6333")
ingestor = IngestCode(qdrant_client=client, async_qdrant_client=aclient, collection_name="go-code",hybrid_search=True)
vector_index = ingestor.ingest(files=files, embedding_model="Shuu12121/CodeSearch-ModernBERT-Owl", language="go")
و این همان است: مجموعه go-code
اکنون در QDRANT تنظیم و در دسترس است ، بنابراین می توانیم دست خود را در واقع در طراحی گردش کار قرار دهیم.
طراحی گردش کار عامل
این یک تجسم از گردش کار کد کننده کد است:
ما جزئیات کد را در اینجا ، فقط مفاهیم سطح بالا مشاهده نخواهیم کرد ، اما می توانید همه چیز را در repo github پیدا کنید.
1. ابزارها
ما به سه ابزار اصلی نیاز داریم:
-
vector_search_tool
این پایگاه داده وکتور را با استفاده از یک موتور پرس و جو Llamaindex جستجو می کند ، که ابتدا یک سند فرضی را تعبیه می کند (HYDE) و سپس آن را با پایگاه داده با استفاده از بازیابی ترکیبی مطابقت می دهد و یک پاسخ خلاصه نهایی ایجاد می کند. -
web_search_tool
این می تواند راه حل ها را در جستجوی وب ایجاد کند: ما از Linkup بهره برداری می کنیم ، و نتایج جستجو را به گونه ای قالب می کنیم که ابزار همیشه توضیح کد و در صورت لزوم یک قطعه کد را تولید می کند. -
evaluate_response
این می تواند درست ، وفاداری و نمره مرتبط را به پاسخ نهایی عامل بر اساس پرس و جو کاربر اصلی و در زمینه بازیابی شده (یا از وب و یا از جستجوی بردار) ارائه دهد. برای این منظور ، ما از ارزیاب های Llamaindex استفاده می کنیم
2. طراحی و خدمت به نماینده
ما از یک عامل ساده و ساده استفاده می کنیم که در ماژول گردش کار عامل در Llamaindex قرار دارد و به عامل دسترسی به تمام ابزارهای طراحی شده در نقطه (1) می دهیم.
اکنون ، این فقط مسئله استقرار نماینده در یک نقطه انتهایی API است و آن را در دسترس قسمت جلوی برنامه ما قرار می دهد: ما این کار را از طریق FastAPI انجام می دهیم و به نماینده در زیر خدمت می کنیم /chat
پست پایانی
3. رابط کاربری
UI ، که با Streamlit نوشته شده است ، می تواند مانند این تنظیم شود:
import streamlit as st
import requests as rq
from pydantic import BaseModel
class ApiInput(BaseModel):
prompt: str
def get_chat(prompt: str):
response = rq.post("http://backend:8000/chat/", json=ApiInput(prompt=prompt).model_dump())
actual_res = response.json()["response"]
actual_proc = response.json()["proces"]
return actual_res, actual_proc
st.title("Code RAGent💻")
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("What is up?"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
stream, proc = get_chat(
prompt=st.session_state.messages[-1]["content"],
)
response = st.write(stream)
st.session_state.messages.append({"role": "assistant", "content": stream})
with st.expander("See Agentic Process"):
st.write(proc)
و به چیزی شبیه به این منجر می شود:
تمیز و ساده!
پایان
برای پایان دادن به این مقاله ، اجازه دهید فقط سه نکته اصلی را که پتانسیل ایجاد کد را به عنوان دستیار پایگاه بسیار خوب دارند ، برجسته کنم:
- پایه کد با یک خط لوله اختصاصی ، با استفاده از یک قطعه مخصوص کد ، و همچنین یک مدل جاسازی متراکم برای بازیابی کد ، مصرف می شود
- نماینده می تواند هر زمان که اطلاعاتی را که از شما درخواست می کنید خارج از محدوده پایگاه کد مصرف شده شما باشد ، دوباره به جستجوی وب برگردد
- پاسخ هایی را که تولید می کند ارزیابی می کند
گفته می شود ، این فقط یک سیستم عامل آماده آموزش ، به دور از کامل بودن است ، بنابراین اگر بازخورد یا پیشنهادی دارید فقط به من اطلاع دهید! ✨