codequestion은 개발자 질문에 대한 의미 검색 애플리케이션입니다.
개발자는 일반적으로 작업하는 동안 웹 브라우저 창을 열어두고 질문이 있으면 웹 검색을 실행합니다. 코드 질문을 사용하면 로컬 컨텍스트에서 이 작업을 수행할 수 있습니다. 이 애플리케이션은 유사성 쿼리를 실행하여 입력 쿼리와 유사한 질문을 찾습니다.
코드 질문의 기본 모델은 archive.org의 스택 교환 덤프를 기반으로 구축되었습니다. 모델이 설치되면 codequestion이 로컬로 실행되며 네트워크 연결이 필요하지 않습니다.
codequestion은 Python 3.8+ 및 txtai로 구축되었습니다.
가장 쉬운 설치 방법은 pip와 PyPI를 이용하는 것입니다.
pip install codequestion
Python 3.8+가 지원됩니다. Python 가상 환경을 사용하는 것이 좋습니다.
codequestion을 GitHub에서 직접 설치하여 아직 출시되지 않은 최신 기능에 액세스할 수도 있습니다.
pip install git+https://github.com/neuml/codequestion
환경별 문제 해결은 이 링크를 참조하세요.
codequestion이 설치되면 모델을 다운로드해야 합니다.
python -m codequestion.download
모델은 ~/.codequestion/에 저장됩니다.
머신이 직접 인터넷에 액세스할 수 없는 경우 모델을 수동으로 설치할 수도 있습니다. 기본 모델은 GitHub 릴리스 페이지에서 가져옵니다.
unzip cqmodel.zip ~/.codequestion
시작하려면 코드 질문 셸을 시작하세요.
codequestion
프롬프트가 나타납니다. 콘솔에 쿼리를 입력할 수 있습니다. 사용 가능한 모든 명령을 보려면 help
입력하세요.
최신 릴리스에는 의미 그래프를 지원하는 txtai 5.0이 통합되어 있습니다.
의미론적 그래프는 주제 모델링 및 경로 탐색에 대한 지원을 추가합니다. 주제는 유사한 개념을 가진 그룹으로 질문을 구성합니다. 경로 순회는 의미 그래프를 사용하여 잠재적으로 서로 다른 두 항목이 어떻게 연결되는지 보여줍니다. 주제 및 경로 순회를 모두 다루는 예가 아래에 나와 있습니다.
Visual Studio Code 내에서 코드 질문 프롬프트를 시작할 수 있습니다. 이를 통해 IDE에서 바로 코딩 질문을 할 수 있습니다.
Ctrl+`
실행하여 새 터미널을 연 다음 codequestion
입력하세요.
codequestion은 표준 txtai 임베딩 인덱스를 구축합니다. 따라서 txtai API 서비스를 통해 인덱스 호스팅을 지원합니다.
다음을 실행합니다.
app.yml
path : /home/user/.codequestion/models/stackexchange/
embeddings :
# Install API extra
pip install txtai[api]
# Start API
CONFIG=app.yml uvicorn "txtai.api:app"
# Test API
curl "http://127.0.0.1:8000/search?query=python+query+sqlite&limit=1"
출력:
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
SQL 문을 사용하여 추가 메타데이터 필드를 가져올 수 있습니다.
curl
--get
--data-urlencode "query=select id, date, tags, question, score from txtai where similar('python query sqlite')"
--data-urlencode "limit=1"
"http://127.0.0.1:8000/search"
[{
"id" : " 616429 " ,
"date" : " 2022-05-23T10:45:40.397 " ,
"tags" : " python sqlite " ,
"question" : " How to fetch data from sqlite using python? " ,
"score" : 0.8401689529418945
}]
다음은 이 프로젝트의 작동 방식을 다루는 개요입니다.
Stack Exchange의 원시 7z XML 덤프는 일련의 단계를 통해 처리됩니다(모델 구축 참조). 답변이 승인된 높은 점수의 질문만 모델에 저장하기 위해 검색됩니다. 질문과 답변은 questions.db라는 단일 SQLite 파일로 통합됩니다. questions.db의 스키마는 아래와 같습니다.
questions.db 스키마
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
codequestion은 questions.db에 대한 txtai 임베딩 인덱스를 구축합니다. questions.db 스키마의 각 질문은 문장 변환기 모델을 사용하여 벡터화됩니다. questions.db가 문장 임베딩 모음으로 변환되면 임베딩이 정규화되어 Faiss에 저장되므로 빠른 유사성 검색이 가능합니다.
codequestion은 인덱싱 중과 동일한 방법을 사용하여 각 쿼리를 토큰화합니다. 해당 토큰은 문장 임베딩을 구축하는 데 사용됩니다. 해당 임베딩은 가장 유사한 질문을 찾기 위해 Faiss 지수에 대해 쿼리됩니다.
다음 단계에서는 Stack Exchange 아카이브를 사용하여 코드 질문 모델을 구축하는 방법을 보여줍니다.
GitHub 릴리스 페이지의 기본 모델을 사용하는 경우에는 필요하지 않습니다.
1.) Stack Exchange에서 파일 다운로드: https://archive.org/details/stackexchange
2.) 선택한 파일을 아래와 같은 디렉토리 구조에 배치합니다(현재 프로세스에는 이러한 파일이 모두 필요합니다).
3.) ETL 프로세스 실행
python -m codequestion.etl.stackexchange.execute stackexchange
그러면 stackexchange/questions.db 파일이 생성됩니다.
4.) 선택사항: 단어 벡터 작성 - 단어 벡터 모델을 사용하는 경우에만 필요합니다. 단어 벡터 모델을 사용하는 경우 pip install txtai[similarity]
실행하세요.
python -m codequestion.vectors stackexchange/questions.db
그러면 ~/.codequestion/Vectors/stackexchange-300d.magnitude 파일이 생성됩니다.
5.) 임베딩 인덱스 구축
python -m codequestion.index index.yml stackexchange/questions.db
기본 index.yml 파일은 GitHub에 있습니다. 설정을 변경하여 인덱스 작성 방법을 사용자 정의할 수 있습니다.
이 단계가 끝나면 인덱스가 생성되고 필요한 모든 파일을 쿼리할 준비가 됩니다.
다음 섹션에서는 최신 Stack Exchange 덤프를 사용하여 codequestion v2 및 codequestion v1에 대한 테스트 결과를 보여줍니다. 버전 2는 문장 변환기 모델을 사용합니다. 버전 1은 BM25 가중치를 적용한 단어 벡터 모델을 사용합니다. BM25 및 TF-IDF는 기준 점수를 설정하는 것으로 표시됩니다.
스택익스체인지 쿼리
모델은 MRR(Mean Reciprocal Rank)을 사용하여 점수를 매깁니다.
모델 | MRR |
---|---|
모든-MiniLM-L6-v2 | 85.0 |
SE 300d - BM25 | 77.1 |
BM25 | 67.7 |
TF-IDF | 61.7 |
STS 벤치마크
모델은 Pearson Correlation을 사용하여 점수를 매깁니다. 단어 벡터 모델은 Stack Exchange 데이터에 대해서만 학습되므로 STS 데이터 세트에 대해서는 일반화되지 않을 것으로 예상됩니다.
모델 | 감독 | 데브 | 시험 |
---|---|---|---|
모든-MiniLM-L6-v2 | 기차 | 87.0 | 82.7 |
SE 300d - BM25 | 기차 | 74.0 | 67.4 |
위의 테스트를 재현하려면 다음을 실행하세요. $TEST_PATH를 임의의 로컬 경로로 대체하십시오.
mkdir -p $TEST_PATH
wget https://raw.githubusercontent.com/neuml/codequestion/master/test/stackexchange/query.txt -P $TEST_PATH/stackexchange
wget http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz
tar -C $TEST_PATH -xvzf Stsbenchmark.tar.gz
python -m codequestion.evaluate -s test -p $TEST_PATH