自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

強(qiáng)強(qiáng)聯(lián)合!LangChain與CrewAI構(gòu)建基于RAG的智能查詢解答系統(tǒng) 原創(chuàng)

發(fā)布于 2025-4-14 09:56
瀏覽
0收藏

在當(dāng)今數(shù)字化時(shí)代,企業(yè)和教育機(jī)構(gòu)每天都會(huì)收到海量的咨詢問題。無論是客戶支持、銷售團(tuán)隊(duì)的提問,還是內(nèi)部員工的咨詢,手動(dòng)回復(fù)這些問題不僅耗時(shí)費(fèi)力,還容易出現(xiàn)回答不一致的情況。而基于人工智能的查詢解答系統(tǒng),能夠快速、準(zhǔn)確且高效地提供答案,極大地提升了工作效率和用戶體驗(yàn)。

今天,我們就來聊聊如何利用LangChain、ChromaDB和CrewAI構(gòu)建一個(gè)基于檢索增強(qiáng)生成(RAG)的智能查詢解答系統(tǒng)。這個(gè)系統(tǒng)不僅能自動(dòng)處理各種問題,還能生成精準(zhǔn)的回答,幫助企業(yè)和教育機(jī)構(gòu)更好地服務(wù)用戶。

為什么我們需要AI驅(qū)動(dòng)的查詢解答系統(tǒng)?

在傳統(tǒng)的業(yè)務(wù)流程中,手動(dòng)回復(fù)客戶或?qū)W員的咨詢問題是一個(gè)極其低效的過程??蛻粝M玫郊磿r(shí)的回復(fù),而企業(yè)則需要快速獲取準(zhǔn)確的信息來做出決策。AI驅(qū)動(dòng)的查詢解答系統(tǒng)通過自動(dòng)化處理這些問題,不僅減輕了人工負(fù)擔(dān),還能提供一致且高質(zhì)量的回答。

在客戶服務(wù)領(lǐng)域,AI系統(tǒng)可以自動(dòng)回復(fù)常見問題,提升客戶滿意度;在銷售和市場營銷中,它可以實(shí)時(shí)提供產(chǎn)品細(xì)節(jié)和客戶洞察;在金融、醫(yī)療、教育和電商等行業(yè),AI驅(qū)動(dòng)的查詢處理能夠確保操作順暢,提升用戶體驗(yàn)。

深入了解RAG工作流程

在動(dòng)手構(gòu)建系統(tǒng)之前,我們先來了解一下檢索增強(qiáng)生成(RAG)系統(tǒng)是如何工作的。RAG架構(gòu)主要分為三個(gè)關(guān)鍵階段:索引、檢索和生成。

強(qiáng)強(qiáng)聯(lián)合!LangChain與CrewAI構(gòu)建基于RAG的智能查詢解答系統(tǒng)-AI.x社區(qū)

1. 構(gòu)建向量存儲(chǔ)(文檔處理與存儲(chǔ))

系統(tǒng)首先需要處理和存儲(chǔ)相關(guān)文檔,以便能夠快速檢索。具體步驟如下:

  • 文檔切分:將大型文檔切分為更小的文本塊,以便高效檢索。
  • 嵌入模型:利用基于AI的嵌入模型將這些文本塊轉(zhuǎn)換為向量表示。
  • 向量存儲(chǔ):將向量化的數(shù)據(jù)索引并存儲(chǔ)在數(shù)據(jù)庫(如ChromaDB)中,以便快速查找。

2. 查詢處理與檢索

當(dāng)用戶提交問題時(shí),系統(tǒng)會(huì)先檢索相關(guān)數(shù)據(jù),然后再生成回答。具體步驟如下:

  • 用戶查詢輸入:用戶提交問題或請(qǐng)求。
  • 向量化:利用嵌入模型將查詢轉(zhuǎn)換為數(shù)值向量。
  • 搜索與檢索:系統(tǒng)在向量存儲(chǔ)中搜索最相關(guān)的文本塊并檢索出來。

3. 增強(qiáng)與回答生成

為了生成準(zhǔn)確的回答,系統(tǒng)會(huì)將檢索到的數(shù)據(jù)與原始查詢結(jié)合。具體步驟如下:

  • 增強(qiáng)查詢:將檢索到的文檔塊與原始查詢結(jié)合。
  • LLM處理:利用大型語言模型(LLM)根據(jù)查詢和檢索到的上下文生成最終回答。
  • 最終回答:系統(tǒng)向用戶提供一個(gè)準(zhǔn)確且富有上下文的回答。

構(gòu)建基于RAG的查詢解答系統(tǒng)

接下來,我們將通過一個(gè)實(shí)際案例,展示如何構(gòu)建一個(gè)基于RAG的查詢解答系統(tǒng)。這個(gè)系統(tǒng)將高效地回答學(xué)員的問題,幫助他們更好地學(xué)習(xí)。

選擇合適的數(shù)據(jù)用于查詢解答

在構(gòu)建RAG系統(tǒng)之前,最重要的就是數(shù)據(jù)。一個(gè)結(jié)構(gòu)良好的知識(shí)庫是關(guān)鍵,因?yàn)榛卮鸬臏?zhǔn)確性和相關(guān)性完全依賴于數(shù)據(jù)的質(zhì)量。以下是一些適合不同類型用途的數(shù)據(jù):

  • 客戶支持?jǐn)?shù)據(jù):常見問題解答(FAQ)、故障排除指南、產(chǎn)品手冊(cè)和過去的客戶互動(dòng)記錄。
  • 銷售與市場數(shù)據(jù):產(chǎn)品目錄、價(jià)格詳情、競爭對(duì)手分析和客戶咨詢記錄。
  • 內(nèi)部知識(shí)庫:公司政策、培訓(xùn)文檔和標(biāo)準(zhǔn)操作流程(SOP)。
  • 財(cái)務(wù)與法律文件:合規(guī)指南、財(cái)務(wù)報(bào)告和監(jiān)管政策。
  • 用戶生成內(nèi)容:論壇討論、聊天記錄和反饋表單,這些都能提供真實(shí)的用戶問題。

在我們的學(xué)員查詢解答系統(tǒng)中,我們嘗試了多種數(shù)據(jù)類型,最終發(fā)現(xiàn)使用課程視頻的字幕是最有效的方法。字幕提供了與學(xué)員問題直接相關(guān)的結(jié)構(gòu)化和詳細(xì)內(nèi)容,能夠快速生成相關(guān)答案。

構(gòu)建查詢解答系統(tǒng)的架構(gòu)

在動(dòng)手編寫代碼之前,我們需要先規(guī)劃系統(tǒng)的架構(gòu)。系統(tǒng)需要完成以下三個(gè)主要任務(wù):

  1. 從字幕文件(SRT)中提取并存儲(chǔ)課程內(nèi)容。
  2. 根據(jù)學(xué)員的查詢檢索相關(guān)的課程材料。
  3. 利用AI驅(qū)動(dòng)的代理生成結(jié)構(gòu)化的回答。

為了實(shí)現(xiàn)這些功能,我們將系統(tǒng)分為三個(gè)組件:

  • 字幕處理:從SRT文件中提取文本,處理并將其嵌入存儲(chǔ)到ChromaDB中。
  • 檢索:根據(jù)學(xué)員的查詢搜索并檢索相關(guān)的課程材料。
  • 查詢回答代理:利用CrewAI生成結(jié)構(gòu)化且準(zhǔn)確的回答。

實(shí)現(xiàn)步驟

現(xiàn)在,我們已經(jīng)規(guī)劃好了系統(tǒng)的架構(gòu),接下來就是動(dòng)手實(shí)現(xiàn)。

1. 導(dǎo)入必要的庫

構(gòu)建AI驅(qū)動(dòng)的學(xué)習(xí)支持系統(tǒng),首先需要導(dǎo)入一些關(guān)鍵的庫:

import pysrt
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from crewai import Agent, Task, Crew
import pandas as pd
import ast
import os
import time
from tqdm import tqdm

這些庫的作用如下:

  • pysrt:用于從SRT字幕文件中提取文本。
  • RecursiveCharacterTextSplitter:將大段文本切分為更小的塊,以便更好地檢索。
  • Document:表示結(jié)構(gòu)化的文本文檔。
  • OpenAIEmbeddings:將文本轉(zhuǎn)換為數(shù)值向量,用于相似性搜索。
  • Chroma:將嵌入存儲(chǔ)在向量數(shù)據(jù)庫中,便于高效檢索。
  • CrewAI(Agent、Task、Crew):定義處理學(xué)員查詢的AI代理。
  • pandas:以DataFrame形式處理結(jié)構(gòu)化數(shù)據(jù)。
  • ast:將基于字符串的數(shù)據(jù)結(jié)構(gòu)解析為Python對(duì)象。
  • os:提供系統(tǒng)級(jí)操作,如讀取環(huán)境變量。
  • tqdm:在長時(shí)間運(yùn)行的任務(wù)中顯示進(jìn)度條。

2. 設(shè)置環(huán)境

為了使用OpenAI的API進(jìn)行嵌入,我們需要加載API密鑰并配置模型設(shè)置。

步驟1:從本地文件中讀取API密鑰

with open('/home/janvi/Downloads/openai.txt', 'r') as file:
    openai_api_key = file.read()

步驟2:將API密鑰存儲(chǔ)為環(huán)境變量

os.environ['OPENAI_API_KEY'] = openai_api_key

步驟3:指定OpenAI模型

os.environ["OPENAI_MODEL_NAME"] = 'gpt-4o-mini'

通過這些配置,我們可以確保系統(tǒng)能夠高效地處理和存儲(chǔ)嵌入。

3. 提取并存儲(chǔ)字幕數(shù)據(jù)

字幕文件中包含了視頻講座的寶貴信息,是AI檢索系統(tǒng)中結(jié)構(gòu)化內(nèi)容的豐富來源。有效地提取和處理字幕數(shù)據(jù),能夠讓我們?cè)诨卮饘W(xué)員問題時(shí)快速檢索到相關(guān)信息。

步驟1:從SRT文件中提取文本

我們使用??pysrt??庫從SRT文件中提取文本,并將其組織成結(jié)構(gòu)化的形式,以便進(jìn)一步處理和存儲(chǔ)。

def extract_text_from_srt(srt_path):
    """從SRT字幕文件中提取文本"""
    subs = pysrt.open(srt_path)
    text = " ".join(sub.text for sub in subs)
    return text

由于課程可能包含多個(gè)字幕文件,我們需要系統(tǒng)地組織和迭代這些文件,以便無縫提取文本。

course_folders = {
    "深度學(xué)習(xí)入門(使用PyTorch)": "C:\M\Code\GAI\Learn_queries\Subtitle_Introduction_to_Deep_Learning_Using_Pytorch",
    "構(gòu)建生產(chǎn)級(jí)RAG系統(tǒng)(使用LlamaIndex)": "C:\M\Code\GAI\Learn_queries\Subtitle of Building Production-Ready RAG systems using LlamaIndex",
    "LangChain入門(構(gòu)建生成式AI應(yīng)用與代理)": "C:\M\Code\GAI\Learn_queries\Subtitle_introduction_to_langchain_using_agentic_ai"
}

course_srt_files = {}

for course, folder_path in course_folders.items():
    srt_files = []
    for root, _, files in os.walk(folder_path):
        srt_files.extend(os.path.join(root, file) for file in files if file.endswith(".srt"))
    if srt_files:
        course_srt_files[course] = srt_files

這些提取的文本將成為我們AI驅(qū)動(dòng)學(xué)習(xí)支持系統(tǒng)的基礎(chǔ),使我們能夠進(jìn)行高級(jí)檢索和查詢解答。

步驟2:將字幕存儲(chǔ)到ChromaDB

接下來,我們將課程字幕存儲(chǔ)到ChromaDB中,包括文本切分、嵌入生成、持久化存儲(chǔ)和成本估算。

(1)為ChromaDB設(shè)置持久化目錄

??persist_directory??是一個(gè)文件夾路徑,用于保存存儲(chǔ)的數(shù)據(jù)。這樣即使程序重新啟動(dòng),嵌入數(shù)據(jù)也能保留下來。

persist_directory = "./subtitles_db"
(2)將文本切分為更小的塊

大型文檔(如整個(gè)課程字幕)可能會(huì)超出嵌入的標(biāo)記限制。為了處理這種情況,我們使用??RecursiveCharacterTextSplitter??將文本切分為更小的、有重疊的塊,以提高搜索精度。

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)

每個(gè)塊的長度為1000個(gè)字符,為了在塊之間保留上下文,我們將前一個(gè)塊的200個(gè)字符包含在下一個(gè)塊中。這種重疊有助于保留重要細(xì)節(jié),提高檢索精度。

(3)初始化OpenAI嵌入和ChromaDB向量存儲(chǔ)

我們需要將文本轉(zhuǎn)換為數(shù)值向量表示,以便進(jìn)行相似性搜索。OpenAI的嵌入功能允許我們將課程內(nèi)容編碼為可以高效搜索的格式。

embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)

這里,??OpenAIEmbeddings()??使用我們的OpenAI API密鑰初始化嵌入模型,確保每段文本都能轉(zhuǎn)換為高維向量表示。

(4)初始化ChromaDB

現(xiàn)在,我們將這些向量嵌入存儲(chǔ)到ChromaDB中。

vectorstore = Chroma(
    collection_name="course_materials",
    embedding_functinotallow=embeddings,
    persist_directory=persist_directory
)

??collection_name="course_materials"???在ChromaDB中創(chuàng)建了一個(gè)專門的集合,用于組織所有與課程相關(guān)的嵌入。??embedding_functinotallow=embeddings???指定了OpenAI嵌入用于將文本轉(zhuǎn)換為數(shù)值向量。??persist_directory=persist_directory??確保所有存儲(chǔ)的嵌入在程序重新啟動(dòng)后仍然可用。

(5)估算存儲(chǔ)課程數(shù)據(jù)的成本

在將文檔添加到向量數(shù)據(jù)庫之前,估算標(biāo)記使用成本是非常重要的。由于OpenAI按每1000個(gè)標(biāo)記收費(fèi),我們需要提前估算成本,以便高效管理開支。

COST_PER_1K_TOKENS = 0.0001  # 每1000個(gè)標(biāo)記的成本(使用'text-embedding-ada-002'模型)
TOKENS_PER_CHUNK_ESTIMATE = 750  # 每1000字符塊的估計(jì)標(biāo)記數(shù)

total_tokens = 0
total_cost = 0

start_time = time.time()

??COST_PER_1K_TOKENS=0.0001???定義了使用OpenAI嵌入時(shí)每1000個(gè)標(biāo)記的成本。??TOKENS_PER_CHUNK_ESTIMATE=750???估計(jì)每個(gè)1000字符塊包含約750個(gè)標(biāo)記。??total_tokens???和??total_cost???變量用于跟蹤整個(gè)執(zhí)行過程中處理的數(shù)據(jù)量和產(chǎn)生的成本。??start_time??變量記錄了開始時(shí)間,用于測量整個(gè)過程的耗時(shí)。

(6)檢查并添加課程到ChromaDB

我們希望避免重新處理已經(jīng)存儲(chǔ)在向量數(shù)據(jù)庫中的課程。因此,我們先查詢ChromaDB,檢查課程是否已經(jīng)存在。如果不存在,我們則提取并存儲(chǔ)其字幕數(shù)據(jù)。

for course, srt_list in course_srt_files.items():
    existing_docs = vectorstore._collection.get(where={"course": course})
    if not existing_docs['ids']:
        srt_texts = [extract_text_from_srt(srt) for srt in srt_list]
        course_text = "\n\n\n\n".join(srt_texts)
        doc = Document(page_cnotallow=course_text, metadata={"course": course})
        chunks = text_splitter.split_documents([doc])

字幕通過??extract_text_from_srt()???函數(shù)提取,多個(gè)字幕文件通過??\n\n\n\n???連接,以提高可讀性。創(chuàng)建了一個(gè)??Document???對(duì)象,存儲(chǔ)完整的字幕文本及其元數(shù)據(jù)。最后,使用??text_splitter.split_documents()??將文本切分為更小的塊,以便高效處理和檢索。

(7)估算標(biāo)記使用量和成本

在將塊添加到ChromaDB之前,我們估算成本。

chunk_count = len(chunks)
batch_tokens = chunk_count * TOKENS_PER_CHUNK_ESTIMATE
batch_cost = (batch_tokens / 1000) * COST_PER_1K_TOKENS
total_tokens += batch_tokens
total_cost += batch_cost

??chunk_count???表示切分后的塊數(shù)量。??batch_tokens???根據(jù)塊數(shù)量估算總標(biāo)記數(shù)。??batch_cost???計(jì)算當(dāng)前課程的處理成本。??total_tokens???和??total_cost??累加每次處理的值,以跟蹤整體處理量和開支。

(8)將塊添加到ChromaDB

vectorstore.add_documents(chunks)
print(f"已添加課程:{course} (塊數(shù):{chunk_count}, 成本:${batch_cost:.4f})")

處理后的塊被存儲(chǔ)到ChromaDB中,以便高效檢索。程序會(huì)顯示添加的塊數(shù)和估算的處理成本。

如果課程已經(jīng)存在,則會(huì)顯示以下信息:

print(f"課程已存在:{course}")

一旦所有課程處理完成,我們計(jì)算并顯示最終結(jié)果。

end_time = time.time()

print(f"\n課程嵌入更新完成!??")
print(f"總處理塊數(shù):{total_tokens // TOKENS_PER_CHUNK_ESTIMATE}")
print(f"估算總標(biāo)記數(shù):{total_tokens}")
print(f"估算總成本:${total_cost:.4f}")
print(f"總耗時(shí):{end_time - start_time:.2f}秒")

??end_time - start_time??計(jì)算總處理時(shí)間。系統(tǒng)會(huì)顯示處理的塊數(shù)、估算的標(biāo)記使用量、總成本以及整個(gè)嵌入過程的總結(jié)。

4. 查詢并回答學(xué)員問題

一旦字幕存儲(chǔ)到ChromaDB中,系統(tǒng)需要一種方式來檢索相關(guān)內(nèi)容,以便在學(xué)員提交問題時(shí)提供答案。這個(gè)檢索過程通過相似性搜索實(shí)現(xiàn),它能夠識(shí)別與輸入問題最相關(guān)的存儲(chǔ)文本段。

工作原理

  • 查詢輸入:學(xué)員提交與課程相關(guān)的問題。
  • 按課程過濾:系統(tǒng)確保檢索僅限于相關(guān)課程材料。
  • ChromaDB中的相似性搜索:將查詢轉(zhuǎn)換為嵌入,ChromaDB檢索最相似的存儲(chǔ)文本塊。
  • 返回頂部結(jié)果:系統(tǒng)選擇最相關(guān)的三個(gè)文本段。
  • 格式化輸出:檢索到的文本被格式化并呈現(xiàn)為進(jìn)一步處理的上下文。

def retrieve_course_materials(query: str, course):
    """按課程名稱檢索課程材料"""
    filter_dict = {"course": course}
    results = vectorstore.similarity_search(query, k=3, filter=filter_dict)
    return "\n\n".join([doc.page_content for doc in results])

例如:

course_name = "深度學(xué)習(xí)入門(使用PyTorch)"
question = "什么是梯度下降?"
context = retrieve_course_materials(query=question, course=course_name)
print(context)

從輸出中可以看到,ChromaDB通過相似性搜索,根據(jù)課程名稱和問題檢索到最相關(guān)的信息。

為什么使用相似性搜索?

  • 語義理解:與關(guān)鍵詞搜索不同,相似性搜索能夠找到與查詢語義相關(guān)的文本。
  • 高效檢索:系統(tǒng)無需掃描整個(gè)文檔,只需檢索最相關(guān)的部分。
  • 提升答案質(zhì)量:通過按課程過濾并按相關(guān)性排序,學(xué)員能夠獲得高度針對(duì)性的內(nèi)容。

這種機(jī)制確保學(xué)員提交問題時(shí),能夠從存儲(chǔ)的課程材料中獲得相關(guān)且上下文準(zhǔn)確的信息。

5. 實(shí)現(xiàn)AI查詢回答代理

檢索到相關(guān)課程材料后,下一步是利用AI驅(qū)動(dòng)的代理生成有意義的回答。我們使用CrewAI定義一個(gè)智能代理,負(fù)責(zé)分析查詢并生成結(jié)構(gòu)化的回答。

步驟1:定義代理

查詢回答代理通過清晰的角色和背景故事來指導(dǎo)其行為,以便更好地回答學(xué)員的問題。

query_answer_agent = Agent(
    role="學(xué)習(xí)支持專家",
    goal="您需要為學(xué)員提供最準(zhǔn)確的回答",
    backstory="""
    您是一家專注于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)和生成式AI的在線教育公司學(xué)員查詢解答部門的負(fù)責(zé)人。您負(fù)責(zé)回答學(xué)員關(guān)于課程內(nèi)容、作業(yè)、技術(shù)問題和行政問題的咨詢。您禮貌、圓滑,并且對(duì)可以改進(jìn)的地方負(fù)有責(zé)任感。
    """,
    verbose=False
)

在代碼塊中,我們首先定義了代理的角色為“學(xué)習(xí)支持專家”,因?yàn)樗洚?dāng)虛擬助教的角色,回答學(xué)員的問題。然后,我們定義了目標(biāo),確保代理在回答時(shí)優(yōu)先考慮準(zhǔn)確性和清晰性。最后,我們將??verbose???設(shè)置為??False??,這樣在不需要調(diào)試時(shí),執(zhí)行過程將保持安靜。這種清晰定義的代理角色確?;卮鸺扔袔椭?,又結(jié)構(gòu)化,且符合教育平臺(tái)的語氣。

步驟2:定義任務(wù)

定義了代理之后,我們需要為其分配任務(wù)。

query_answering_task = Task(
    descriptinotallow="""
    盡您所能回答學(xué)員的問題。盡量保持回答簡潔,不超過100個(gè)單詞。
    這是問題:{query}

    這是從課程字幕中提取的相關(guān)內(nèi)容,僅在需要時(shí)使用:{relevant_content}。
    由于這些內(nèi)容是從課程字幕中提取的,可能存在拼寫錯(cuò)誤,請(qǐng)?jiān)诨卮鹬屑m正這些錯(cuò)誤。

    這是與學(xué)員之前的對(duì)話記錄:{thread}。
    在對(duì)話中,以“學(xué)員”開頭的是學(xué)員的問題,以“支持”開頭的是您的回答。請(qǐng)根據(jù)之前的對(duì)話適當(dāng)調(diào)整您的回答。

    這是學(xué)員的全名:{learner_name}。
    如果不確定學(xué)員的名字,直接用“嗨”開頭。
    在回答的結(jié)尾添加一些適當(dāng)?shù)?、鼓?lì)性的安慰語句,例如“希望您覺得有幫助”、“希望這些信息有用。繼續(xù)努力!”、“很高興能幫到您!隨時(shí)聯(lián)系我?!钡?。

    如果您不確定答案,請(qǐng)注明:“抱歉,我不確定這個(gè)問題的答案,我會(huì)稍后回復(fù)您。”
    """,
    expected_output="簡潔準(zhǔn)確的回答",
    agent=query_answer_agent
)

接下來,我們來分解分配給AI的任務(wù)。處理學(xué)員的查詢時(shí),??{query}???代表學(xué)員的問題。回答應(yīng)簡潔(不超過100個(gè)單詞)且準(zhǔn)確。如果需要使用課程內(nèi)容,??{relevant_content}??是從存儲(chǔ)在ChromaDB中的字幕中提取的,AI必須在回答中糾正任何拼寫錯(cuò)誤。

如果存在之前的對(duì)話,??{thread}???有助于保持連貫性。學(xué)員的問題以“學(xué)員”開頭,而之前的回答以“支持”開頭,這使得代理能夠提供與上下文相關(guān)的回答。通過??{learner_name}??實(shí)現(xiàn)個(gè)性化——代理會(huì)用學(xué)員的名字稱呼他們,如果不確定名字,就簡單地用“嗨”開頭。

為了使回答更具吸引力,AI會(huì)在結(jié)尾添加一句積極的結(jié)束語,比如“希望您覺得有幫助!”或者“隨時(shí)聯(lián)系我?!比绻鸄I不確定答案,它會(huì)明確說明:“抱歉,我不確定這個(gè)問題的答案,我會(huì)稍后回復(fù)您?!边@種方法確保了回答的禮貌性、清晰性和結(jié)構(gòu)化,提升了學(xué)員的參與度和信任感。

步驟3:初始化CrewAI實(shí)例

現(xiàn)在我們已經(jīng)定義了代理和任務(wù),接下來初始化CrewAI,它能夠動(dòng)態(tài)處理學(xué)員的查詢。

response_crew = Crew(
    agents=[query_answer_agent],
    tasks=[query_answering_task],
    verbose=False
)

??agents=[query_answer_agent]???將“學(xué)習(xí)支持專家”代理添加到團(tuán)隊(duì)中。??tasks=[query_answering_task]???將查詢回答任務(wù)分配給這個(gè)代理。設(shè)置??verbose=False??可以保持輸出簡潔,除非需要調(diào)試。CrewAI能夠動(dòng)態(tài)處理多個(gè)學(xué)員的查詢,使系統(tǒng)具有可擴(kuò)展性和高效性,能夠動(dòng)態(tài)處理查詢。

步驟4:為多個(gè)學(xué)員的查詢生成回答

設(shè)置好AI代理后,我們需要?jiǎng)討B(tài)處理存儲(chǔ)在結(jié)構(gòu)化數(shù)據(jù)集中的學(xué)員查詢。

以下代碼處理存儲(chǔ)在CSV文件中的學(xué)員查詢,并使用AI代理生成回答。它首先加載包含學(xué)員查詢、課程詳情和對(duì)話線程的數(shù)據(jù)集。??reply_to_query??函數(shù)提取相關(guān)細(xì)節(jié),如學(xué)員姓名、課程名稱和當(dāng)前查詢。如果存在之前的對(duì)話,它會(huì)提取出來以提供上下文。如果查詢包含圖片,則會(huì)跳過。然后,它從ChromaDB中檢索相關(guān)的課程材料,并將查詢、相關(guān)內(nèi)容和之前的對(duì)話發(fā)送給AI代理,以生成結(jié)構(gòu)化的回答。

df = pd.read_csv('C:\M\Code\GAI\Learn_queries\filtered_data_top3_courses.csv')

def reply_to_query(df, index=1):
    learner_name = df.iloc[index]["thread_starter"]
    course_name = df.iloc[index]["course"]
    if df.iloc[index]['number_of_replies'] > 1:
        thread = ast.literal_eval(df.iloc[index]["modified_thread"])
    else:
        thread = []
    question = df.iloc[index]["current_query"]
    if df.iloc[index]['has_image'] == True:
        return" "
    context = retrieve_course_materials(query=question, course=course_name)
    response_result = response_crew.kickoff(inputs={"query": question, "relevant_content": context, "thread": thread, "learner_name": learner_name})
    print('Q: ', question)
    print('\n')
    print('A: ', response_result)
    print('\n\n')

測試該函數(shù)時(shí),我們?yōu)橐粋€(gè)查詢(??index=1??)執(zhí)行它:

reply_to_query(df, index=1)

從輸出中可以看到,它能夠正常工作,僅針對(duì)一個(gè)索引生成回答。

現(xiàn)在,我們通過所有查詢進(jìn)行迭代,處理每一個(gè)查詢,同時(shí)處理可能出現(xiàn)的錯(cuò)誤。這確保了查詢解答過程的高效自動(dòng)化,能夠動(dòng)態(tài)處理多個(gè)學(xué)員的查詢。

for i in range(len(df)):
    try:
        reply_to_query(df, index=i)
    except:
        print("索引號(hào)出錯(cuò):", i)
        continue

為什么這一步很重要?

  • 自動(dòng)化查詢處理:系統(tǒng)能夠高效處理多個(gè)學(xué)員的查詢。
  • 確保上下文相關(guān)性:回答基于檢索到的課程材料和之前的對(duì)話生成。
  • 可擴(kuò)展性:該方法允許AI代理動(dòng)態(tài)處理并回答數(shù)千個(gè)查詢。
  • 提升學(xué)習(xí)支持體驗(yàn):學(xué)員能夠收到個(gè)性化且數(shù)據(jù)驅(qū)動(dòng)的回答。

這一步確保每個(gè)學(xué)員的查詢都能被分析、結(jié)合上下文并有效回答,從而提升整體學(xué)習(xí)體驗(yàn)。

輸出示例

從輸出中可以看到,回答查詢的過程已經(jīng)實(shí)現(xiàn)自動(dòng)化,首先是問題,然后是回答。

未來改進(jìn)方向

為了進(jìn)一步提升基于RAG的查詢解答系統(tǒng),我們可以考慮以下改進(jìn)方向:

  1. 常見問題及其解答:在查詢解答框架內(nèi)實(shí)現(xiàn)一個(gè)結(jié)構(gòu)化的FAQ系統(tǒng),能夠即時(shí)回答常見問題,減少對(duì)人工支持的依賴。
  2. 圖像處理能力:增加分析和提取圖像(如截圖、圖表或掃描文檔)相關(guān)信息的能力,將使系統(tǒng)在教育和客戶支持領(lǐng)域更具 versatility。
  3. 改進(jìn)圖像列布爾值:完善圖像列檢測的邏輯,更準(zhǔn)確地識(shí)別和處理基于圖像的查詢。
  4. 語義切塊和不同的切塊技術(shù):嘗試不同的切塊策略,如語義切塊、固定長度分割和混合方法,可以提高檢索精度和回答的上下文理解能力。

總結(jié)

這個(gè)基于RAG的查詢解答系統(tǒng)利用LangChain、ChromaDB和CrewAI,高效地實(shí)現(xiàn)了學(xué)員支持的自動(dòng)化。它從課程字幕中提取文本,將其嵌入存儲(chǔ)到ChromaDB中,并通過相似性搜索檢索相關(guān)內(nèi)容。CrewAI代理處理查詢,參考之前的對(duì)話,并生成結(jié)構(gòu)化的回答,確?;卮鸬臏?zhǔn)確性和個(gè)性化。

該系統(tǒng)提升了可擴(kuò)展性、檢索效率和回答質(zhì)量,使自主學(xué)習(xí)更加互動(dòng)。未來的改進(jìn)方向包括多模態(tài)支持、更好的檢索優(yōu)化和增強(qiáng)的回答生成。通過自動(dòng)化查詢解答,這個(gè)系統(tǒng)簡化了學(xué)習(xí)支持流程,為學(xué)員提供了更快、更具上下文意識(shí)的回答,提升了整體參與度。

希望這篇文章能幫助你更好地理解如何構(gòu)建一個(gè)基于RAG的智能查詢解答系統(tǒng)。如果你有任何問題或想法,歡迎在評(píng)論區(qū)留言,我們一起探討!

目前市面上也有很多現(xiàn)成管理平臺(tái),如Dify、RagFlow、AnythinLLM等,通過低代碼的方式就可以直接實(shí)現(xiàn)自主搭建智能問答系統(tǒng)。感興趣的都可以去看看哈!


本文轉(zhuǎn)載自公眾號(hào)Halo咯咯    作者:基咯咯

原文鏈接:??https://mp.weixin.qq.com/s/vQiL3RjAU7--QE-EyXrarg??


?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
標(biāo)簽
已于2025-4-14 09:56:53修改
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦