문서 인텔리전스 활용하기: 벡터 기반 검색이 포함된 E2E Azure 기반 챗봇(2부 - Q&A)
앞서 언급한 콘텐츠는 편집팀에 의해 2024년 2월 29일에 마지막으로 업데이트되었습니다.
작성자: Shravankumar Hiregoudar
원래 이 사이트에 게시되었습니다.
이전 파트 에서 우리는 문서 처리에 대한 놀라운 여정을 시작했습니다. 강력한 문서 임베딩 메커니즘의 개발과 벡터 저장소의 탄생으로 간소화되고 최적화된 쿼리를 위한 발판이 마련된 것을 목격했습니다. 문서 처리 파이프라인의 핵심을 이루는 자연어 질문을 사용해 이 벡터 저장소를 쿼리하는 흥미로운 영역을 살펴보며 탐구를 계속해 보겠습니다.
사진 제공 Jamie Street on Unsplash
목차:
소개 솔루션 개요
1.1 아키텍처
1.2 채팅 파이프라인 채팅 구현
2.1 프로젝트 파일 결론 참조
소개
이전 섹션에서는 문서 임베딩과 벡터 리포지토리 형성을 포함하는 문서 처리 영역에 대해 살펴봤습니다. 이번에는 자연어 쿼리를 통해 이 벡터 저장소를 조사하는 방법에 대해 알아보겠습니다.
부품 (출처: 작성자)
솔루션 개요
아키텍처
아키텍처 (출처: 작성자)
채팅 파이프라인
채팅 파이프라인은 자연어 문의를 활용하여 사용자와 시스템 간의 커뮤니케이션을 촉진하고 관련 정보 추출을 위한 Azure Cognitive Search와 OpenAI의 고급 GPT-3을 통합하여 사용자와 시스템 간의 커뮤니케이션을 용이하게 합니다.5 적절한 답변을 생성하기 위한 Turbo. 이 프로세스는 다음과 같이 실행됩니다:
사용자 쿼리: 사용자가 Streamlit 애플리케이션의 채팅 인터페이스를 통해 쿼리를 입력합니다. 검색: 이 코드는 사용자의 쿼리를 기반으로 Azure Cognitive Search에서 관련 문서를 검색합니다. (벡터가 저장된 후에는 벡터 유사성 검색과 같은 작업을 수행할 수 있습니다. 이 함수는 코사인 유사도 또는 기타 거리 메트릭을 기반으로 벡터 저장소에서 유사한 벡터를 찾습니다.유사한 문서, 단어 또는 사용자 쿼리를 찾는 등의 작업에 특히 유용합니다. ( 랭체인 리트리버 ) 질문 답변: 언어 모델(GPT-3.5 터보)과 검색된 문서를 결합하는 사전 정의된 질문-응답 체인을 활용합니다. 시스템은 사용자의 쿼리와 문서에서 추출된 정보를 기반으로 응답을 생성합니다. 응답 표시: 응답이 채팅 인터페이스에 표시되어 사용자에게 쿼리에 대한 답변을 제공합니다.
채팅 구현
파이썬 프로그래밍 언어는 벡터 저장소를 사용하여 사용자가 쿼리를 제출하고 관련 정보를 응답으로 받을 수 있는 문의-응답 데이터베이스 시스템을 만드는 데 활용됩니다. 이 구현은 효율적인 지식 관리 및 검색을 위해 고급 데이터 검색 기술을 최신 컴퓨팅 언어와 통합할 수 있는 잠재력을 보여줍니다.
프로젝트 파일
코드의 아키텍처와 기능을 심층적으로 검토하여 작동 매개변수를 확인할 수 있도록 허용합니다.
app.py (. . 계속)
# Project Layout
.
├── README.md
├── requirements.txt U\\+2714️
├── app.py
├── .gitignore
├── .env U\\+2714️
├── db/ U\\+2714️
│ ├── metadata.db U\\+2714️
└── src/ U\\+2714️
├── database_manager.py U\\+2714️U\\+2714️ = covered in Part 1
ChatPipeline
클래스는 app.py
에 있으며 사전 학습된 언어 모델과 문서 검색기를 사용하여 자연어 질문에 답하기 위한 기본 구성 요소입니다. 이 클래스의 생성자는 리트리버(관련 문서 가져오기를 담당)와 언어 모델(응답 생성을 위해 사전 학습된 모델)을 초기화합니다.
# app.pyclass EmbeddingPipeline:
# ........ (refer to part 1)class ChatPipeline:
def __init__(self):
load_dotenv()
self.retriever = AzureCognitiveSearchRetriever(
content_key="content",
index_name=DEFAULT_SEARCH_INDEX,
service_name=AZURE_SEARCH_NAME,
api_key=AZURE_SEARCH_KEY,
top_k=1
)
self.llm = AzureChatOpenAI(deployment_name=DEFAULT_CHAT_MODEL,
openai_api_version=CHAT_API_VERSION,
temperature=0,
openai_api_base=CHAT_API_BASE,
openai_api_key=CHAT_API_KEY
)def get_query_answer(self, query, verbose=True):
"""
Retrieve an answer from a question answering system that utilizes a pretrained language model (llm)
and a pre-defined retriever (Azure Cognitive Search) (retriever) to respond to questions following a predefined question answering chain (chain_type).Args:
query (str): The query for which an answer is sought.
retriever: The retriever used for retrieving relevant documents.
verbose (bool, optional): Whether to log detailed information. Default is True.Returns:
dict: A dictionary containing the query and the generated answer.
"""
# Create a chain to answer questions
qa = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type='stuff',
retriever=self.retriever,
return_source_documents=True
)logger.info(f"Generating response ⏳")
result = qa({"query": query})
print(result)
if verbose:
logger.info(
f"\n\nQ: {result['query']}\nA: {result['result']}\nSource/s: {set(json.loads(i.metadata['metadata']).get('source') for i in result['source_documents'])}")return result['result'], set(json.loads(i.metadata['metadata']).get('source') for i in result['source_documents'])
main
함수는 app.py
에 상주하며 문서 처리 파이프라인의 진입점 역할을 합니다. 이 함수는 다음 단계를 실행합니다:
LOAD_VECTOR
플래그를 기반으로 EmbeddingPipeline을 초기화하여 Azure Storage 컨테이너에서 문서를 처리합니다. 상호작용을 위한 사용자 친화적인 Streamlit 인터페이스 만들기. 채팅 기록을 관리하여 사용자 및 어시스턴트 메시지를 보존합니다. 사용자 쿼리를 수락하여 채팅 인터페이스에 표시합니다. 채팅 파이프라인을 활용하여 사용자 쿼리에 대한 응답을 생성하고 채팅 인터페이스 내에서 이러한 응답을 표시합니다.
def main():if LOAD_VECTORS:
EmbeddingPipeline().perform_embedding_pipeline()
else:
logger.info(f"Retrieving the stored vectors from an Azure Search index: '{DEFAULT_SEARCH_INDEX}'")### STREAMLIT UIst.set_page_config(page_title="<name>")
st.title("Simple Chat")# Initialize chat history
if "messages" not in st.session_state:
st.session_state.messages = []# Display chat messages from history on app rerun
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])# Accept user input
if prompt := st.chat_input("Enter your query"):
# Add user message to chat history
st.session_state.messages.append({"role": "user", "content": prompt})
# Display user message in chat message container
with st.chat_message("user"):
st.markdown(prompt)
# Display assistant response in chat message container
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""answer , source = ChatPipeline().get_query_answer(prompt)
full_response \\+= f"{answer} *(source: {', '.join(source)})*" if source and None not in source else f"{answer}"
message_placeholder.markdown(full_response \\+ "▌")
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})if __name__ == "__main__":
main()
streamlit run app.py,
으로 프로젝트를 실행하면 스트림릿 앱이 로컬로 실행됩니다.
스트림라이트 앱 (출처: https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps )
결론
제공된 Python 코드는 Azure 서비스와 OpenAI 기술을 모두 통합하는 고급 문서 처리 워크플로우를 보여 줍니다. 이 다목적 솔루션은 콘텐츠 인덱싱에서 지능형 챗봇 상호 작용 생성에 이르기까지 다양한 용도로 사용할 수 있습니다. 이 코드와 그 구성 요소의 복잡성을 파악하는 것은 다양한 분야에 걸쳐 유사하게 효율적인 문서 처리 파이프라인을 개발하고 조정하는 데 매우 중요합니다.
참조
(출처: 작성자)
전 세계 8만 명 이상의 구독자를 자랑하는 데이터 전문가 커뮤니티에 가입하여 존경받는 데이터 전문가 커뮤니티에 초대해 드립니다. 연구 이니셔티브부터 혁신적인 애플리케이션과 생각을 자극하는 개념에 이르기까지 다양한 영역에 걸친 인공지능의 최첨단 발전 상황을 파악할 수 있습니다. 또한 인공지능 기반 벤처를 설립하거나 인공지능 중심 제품을 출시하거나 인공지능과 관련된 서비스를 제공하고자 한다면 후원사로 참여하실 수 있습니다.
이 사이트를 통해 게시됨