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

基于LangChain自查詢(xún)檢索器的RAG系統(tǒng)開(kāi)發(fā)實(shí)戰(zhàn)

譯文 精選
人工智能
本文介紹RAG(檢索增強(qiáng)生成)技術(shù)并基于LangChain框架的自查詢(xún)檢索器來(lái)開(kāi)發(fā)一個(gè)實(shí)戰(zhàn)型電影推薦系統(tǒng)。

想了解更多AIGC的內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO AI.x社區(qū)

http://www.scjtxx.cn/aigc/

最近,我在瀏覽Max.com網(wǎng)站時(shí)想找一部電影看。通常,這個(gè)過(guò)程包括瀏覽系統(tǒng)呈現(xiàn)給我的各種列表,閱讀一些相關(guān)描述,然后挑選一些看起來(lái)有趣的電影。如果我知道我想看的電影的片名或我喜歡的演員的名字,我通常只會(huì)點(diǎn)擊搜索功能。否則,搜索就沒(méi)有多大用處了。

現(xiàn)在,我突然想到了一個(gè)新的想法:為什么我不能用自然語(yǔ)言來(lái)查找一部電影,更多地基于電影的氛圍或?qū)嵸|(zhì),而不僅僅是標(biāo)題或演員呢?例如,為什么我不能啟動(dòng)Max、Netflix或Hulu等流媒體播放平臺(tái),并在搜索欄中鍵入類(lèi)似于以下查詢(xún)之一呢:

  • 給我找一部長(zhǎng)度不到2小時(shí)、以寵物為主角的英語(yǔ)戲劇電影。
  • 推薦僵尸電影,但要確保它們很有趣。
  • 我喜歡《瞬息全宇宙》。給我一部類(lèi)似的電影,但場(chǎng)景、氛圍或者人物性格更加陰暗、沉重一些。

這種方法的美妙之處超出了更自然的電影搜索方式,還保護(hù)了用戶(hù)的隱私。該系統(tǒng)根本不會(huì)使用用戶(hù)數(shù)據(jù),不是挖掘用戶(hù)的行為、喜歡和不喜歡來(lái)提供給推薦系統(tǒng)。唯一需要的就是一個(gè)查詢(xún)。

為此,我開(kāi)發(fā)了本文中要展示給大家的一個(gè)電影搜索程序。這是一個(gè)基于RAG(檢索增強(qiáng)生成)的系統(tǒng),它可以接受用戶(hù)的查詢(xún),嵌入查詢(xún),并進(jìn)行相似性搜索,以找到相似的電影。不過(guò),這個(gè)程序超越了普通的RAG系統(tǒng)。這個(gè)系統(tǒng)使用了所謂的自查詢(xún)檢索器。該技術(shù)允許在進(jìn)行相似性搜索之前,根據(jù)電影的元數(shù)據(jù)對(duì)其進(jìn)行過(guò)濾。因此,如果用戶(hù)有一個(gè)類(lèi)似“推薦1980年后拍攝的以大量爆炸為特征的恐怖電影”的查詢(xún),搜索算法將首先過(guò)濾掉所有不是“1980年后制作的恐怖片”的電影,然后再對(duì)“以大量爆炸為主”的電影進(jìn)行相似性搜索。

在本文中,我將提供一個(gè)關(guān)于我如何創(chuàng)建此系統(tǒng)的總體概述。如果您想深入了解這個(gè)程序,完整的源代碼將在文后的鏈接參考處提供。

接下來(lái),讓我們繼續(xù)作深入介紹。

檢索數(shù)據(jù)

首先,該項(xiàng)目的數(shù)據(jù)來(lái)自電影數(shù)據(jù)庫(kù)(TMDB:https://developer.themoviedb.org/docs/getting-started),并得到了所有者的許可。他們的API使用簡(jiǎn)單,維護(hù)良好,并且沒(méi)有嚴(yán)格的費(fèi)率限制。我從他們的API中提取了以下電影屬性:

  • 標(biāo)題
  • 運(yùn)行時(shí)間(分鐘)
  • 語(yǔ)言
  • 概述
  • 發(fā)布年份
  • 體裁
  • 描述電影的關(guān)鍵詞
  • 演員
  • 董事
  • 流式傳輸?shù)奈恢?/li>
  • 購(gòu)買(mǎi)地點(diǎn)
  • 出租場(chǎng)所
  • 生產(chǎn)公司名單

以下是如何使用TMDB API和Python的響應(yīng)庫(kù)提取數(shù)據(jù)的片段:

def get_data(API_key, Movie_ID, max_retries=5):
    """
函數(shù)以JSON格式提取感興趣的電影的詳細(xì)信息。

    parameters:
    API_key (str): Your API key for TMBD
    Movie_ID (str): TMDB id for film of interest

    returns:
    dict: JSON格式的字典,包含您的電影的所有細(xì)節(jié)
興趣
    """

    query = 'https://api.themoviedb.org/3/movie/' + Movie_ID + \
        '?api_key='+API_key + '&append_to_response=keywords,' + \
            'watch/providers,credits'
    for i in range(max_retries):
        response = requests.get(query)
        if response.status_code == 429:
            # If the response was a 429, wait and then try again
            print(
                f"Request limit reached. Waiting and retrying ({i+1}/{
                    max_retries})")
            time.sleep(2 ** i)  # Exponential backoff
        else:
            dict = response.json()
            return dict

請(qǐng)注意,該查詢(xún)需要電影ID(也是使用TMDB獲得的)以及append_to_response,這允許我提取幾種類(lèi)型的數(shù)據(jù),例如關(guān)鍵字、影片提供商、演員(導(dǎo)演和演員)以及有關(guān)電影的一些基本信息。還有一些基本的框架類(lèi)代碼,以防我達(dá)到速率限制,盡管我注意到從未發(fā)生這種情況。

然后,我們必須解析JSON響應(yīng)。以下的代碼片段展示了如何解析電影中的演員和導(dǎo)演:

credits = dict['credits']
    actor_list, director_list = [], []

# 分析演員表
cast = credits['cast']
NUM_ACTORS = 5
for member in cast[:NUM_ACTORS]:
    actor_list.append(member["name"])

# 分析劇組
crew = credits['crew']
for member in crew:
    if member['job'] == 'Director':
        director_list.append(member["name"])

actor_str = ', '.join(list(set(actor_list)))
director_str = ', '.join(list(set(director_list)))

請(qǐng)注意,我將演員數(shù)量限制在一部電影的前五名。我還必須說(shuō)明,我只對(duì)導(dǎo)演感興趣,因?yàn)橄到y(tǒng)的響應(yīng)還包括其他類(lèi)型的劇組成員,如編輯、服裝設(shè)計(jì)師等。

所有這些數(shù)據(jù)隨后被編譯成CSV文件。上面列出的每個(gè)屬性都被轉(zhuǎn)換成了一列,現(xiàn)在每一行都代表一部特定的電影。以下是通過(guò)程序創(chuàng)建的2008_movie_collection_data.csv文件中的短片。在這個(gè)項(xiàng)目中,我獲得了大約100部1920年至2023年的頂級(jí)電影。

用于演示目的的電影數(shù)據(jù)片段(作者本人提供)

信不信由你,我還沒(méi)看過(guò)《功夫熊貓》。也許我必須完成這個(gè)項(xiàng)目。

將文檔上載到pinecone網(wǎng)站

接下來(lái),我必須將csv數(shù)據(jù)上傳到https://www.pinecone.io/網(wǎng)站([譯者注]。Pinecone是一個(gè)非開(kāi)源型的向量數(shù)據(jù)庫(kù)。Pinecone支持在大規(guī)模向量集上進(jìn)行快速且實(shí)時(shí)的搜索,具有亞秒級(jí)的查詢(xún)響應(yīng)時(shí)間,適用于需要高性能和實(shí)時(shí)性的大型應(yīng)用,特別適合于構(gòu)建實(shí)時(shí)推薦系統(tǒng)、電商搜索引擎和社交媒體內(nèi)容過(guò)濾等)。通常,分塊在RAG系統(tǒng)中很重要,但這里每個(gè)“文檔”(CSV文件的行)都很短,所以分塊不是一個(gè)問(wèn)題。我首先必須將每個(gè)CSV文件轉(zhuǎn)換為L(zhǎng)angChain文檔,然后指定哪些字段應(yīng)該是主要內(nèi)容,哪些字段應(yīng)該作為元數(shù)據(jù)。

以下是用于構(gòu)建這些文檔的代碼片段:

# 從所有csv文件加載數(shù)據(jù)
loader = DirectoryLoader(
    path="./data",
    glob="*.csv",
    loader_cls=CSVLoader,
    show_progress=True)

docs = loader.load()

metadata_field_info = [
    AttributeInfo(
        name="Title", description="The title of the movie", type="string"),
    AttributeInfo(name="Runtime (minutes)",
                  description="The runtime of the movie in minutes", type="integer"),
    AttributeInfo(name="Language",
                  description="The language of the movie", type="string"),
    ...
]

for doc in docs:
    #將page_content字符串解析到字典中
    page_content_dict = dict(line.split(": ", 1)
                             for line in doc.page_content.split("\n") if ": " in line)
    
    doc.page_content = 'Overview: ' + page_content_dict.get(
        'Overview') + '. Keywords: ' + page_content_dict.get('Keywords')
    doc.metadata = {field.name: page_content_dict.get(
        field.name) for field in metadata_field_info}

    #將字段從字符串轉(zhuǎn)換為字符串列表
    for field in fields_to_convert_list:
        convert_to_list(doc, field)      

    # 將字段從字符串轉(zhuǎn)換為整數(shù)
    for field in fields_to_convert_int:
        convert_to_int(doc, field)

LangChain的DirectoryLoader負(fù)責(zé)將所有csv文件加載到文檔中。然后,我需要指定什么應(yīng)該是page_content,什么應(yīng)該是metadata;這是一個(gè)重要的決定。page_content將在檢索階段嵌入并用于相似性搜索。在進(jìn)行相似性搜索之前,metadata將僅用于過(guò)濾目的。我決定采用overview和keywords屬性并嵌入它們,其余的屬性將是元數(shù)據(jù)。應(yīng)該做進(jìn)一步的調(diào)整,看看title是否也應(yīng)該包括在page_content中,但我發(fā)現(xiàn)這種配置對(duì)大多數(shù)用戶(hù)查詢(xún)都很有效。

接下來(lái),文件必須上傳到pinecone網(wǎng)站。這是一個(gè)相當(dāng)簡(jiǎn)單的過(guò)程:

# 如果尚未創(chuàng)建索引,則取消注釋
pc.create_index(
    name=PINECONE_INDEX_NAME,
    dimension=1536,
    metric="cosine",
    spec=PodSpec(
        environment="gcp-starter"
    )
)

# 目標(biāo)索引和檢查狀態(tài)
pc_index = pc.Index(PINECONE_INDEX_NAME)
print(pc_index.describe_index_stats())

embeddings = OpenAIEmbeddings(model='text-embedding-ada-002')

vectorstore = PineconeVectorStore(
    pc_index, embeddings
)

# 創(chuàng)建記錄管理器
namespace = f"pinecone/{PINECONE_INDEX_NAME}"
record_manager = SQLRecordManager(
    namespace, db_url="sqlite:///record_manager_cache.sql"
)

record_manager.create_schema()

# 將文檔上載到松果網(wǎng)站
index(docs, record_manager, vectorstore,
      cleanup="full", source_id_key="Website")

我只想在這里強(qiáng)調(diào)幾個(gè)事情:

  • 如果多次運(yùn)行此代碼,那么使用SQLRecordManager可確保不會(huì)將重復(fù)的文檔上載到Pinecone。如果修改了文檔,則在矢量存儲(chǔ)中僅修改該文檔。
  • 我們使用OpenAI的經(jīng)典text-embedding-ada-002作為我們的嵌入模型。

創(chuàng)建自查詢(xún)檢索器

自查詢(xún)檢索器將允許我們通過(guò)我們之前定義的元數(shù)據(jù)來(lái)過(guò)濾RAG期間檢索到的電影。這將大大提高我們電影推薦人的實(shí)用性。

在選擇矢量存儲(chǔ)時(shí),一個(gè)重要的考慮因素是確保它支持按元數(shù)據(jù)過(guò)濾,因?yàn)椴⒎撬袛?shù)據(jù)庫(kù)都支持這種技術(shù)。鏈接https://python.langchain.com/docs/integrations/retrievers/self_query處提供了LangChain支持自查詢(xún)檢索的數(shù)據(jù)庫(kù)列表。另一個(gè)重要的考慮因素是對(duì)于每個(gè)矢量存儲(chǔ)允許什么類(lèi)型的比較器。比較器是我們通過(guò)元數(shù)據(jù)進(jìn)行過(guò)濾的方法。例如,我們可以使用eq比較器來(lái)確保我們的電影屬于科幻類(lèi)型:eq('Genre', 'Science Fiction')。并非所有矢量存儲(chǔ)都允許所有比較器。舉個(gè)例子,有興趣的讀者可以觀察一下開(kāi)源的嵌入式數(shù)據(jù)庫(kù)Chroma中支持的比較器(https://docs.trychroma.com/usage-guide#using-where-filters),以及它們與Pinecone網(wǎng)站中支持的比較器(https://docs.pinecone.io/guides/data/filtering-with-metadata#metadata-query-language)有何不同。我們需要告訴模型允許使用哪些比較器,以防止它意外地寫(xiě)入禁止的查詢(xún)。

除了告訴模型存在哪些比較器之外,我們還可以提供用戶(hù)查詢(xún)和相應(yīng)過(guò)濾器的模型示例。這被稱(chēng)為小樣本學(xué)習(xí)(Few-shot Learning),這對(duì)指導(dǎo)您的模型是非常寶貴的。

要具體地了解這一技巧有何幫助,您可以嘗試查看以下兩個(gè)用戶(hù)查詢(xún):

  • “推薦一些約戈斯·蘭蒂莫斯的電影?!?/li>
  • “類(lèi)似于約戈斯·蘭圖米奧斯電影的電影?!?/li>

我的元數(shù)據(jù)過(guò)濾模型很容易為這些示例中的每一個(gè)編寫(xiě)相同的過(guò)濾查詢(xún),盡管我希望對(duì)它們進(jìn)行不同的處理。第一部應(yīng)該只推薦蘭蒂莫斯執(zhí)導(dǎo)的電影,而第二部應(yīng)該推薦與蘭蒂莫斯電影有相似氛圍的電影。為了確保這種行為,我一點(diǎn)點(diǎn)細(xì)致地提供了我想要的行為的模型示例。語(yǔ)言模型的美妙之處在于,它們可以利用自己的“推理”能力和世界知識(shí),將這些小樣本學(xué)習(xí)示例推廣到其他用戶(hù)查詢(xún)中。

document_content_description = "Brief overview of a movie, along with keywords"

        # 定義允許的比較器列表
        allowed_comparators = [
            "$eq",  # Equal to (number, string, boolean)
            "$ne",  # Not equal to (number, string, boolean)
            "$gt",  # Greater than (number)
            "$gte",  # Greater than or equal to (number)
            "$lt",  # Less than (number)
            "$lte",  # Less than or equal to (number)
            "$in",  # In array (string or number)
            "$nin",  # Not in array (string or number)
            "$exists", # Has the specified metadata field (boolean)
        ]

        examples = [
            (
                "Recommend some films by Yorgos Lanthimos.",
                {
                    "query": "Yorgos Lanthimos",
                    "filter": 'in("Directors", ["Yorgos Lanthimos]")',
                },
            ),
            (
                "Films similar to Yorgos Lanthmios movies.",
                {
                    "query": "Dark comedy, absurd, Greek Weird Wave",
                    "filter": 'NO_FILTER',
                },
            ),
            ...
        ]

        metadata_field_info = [
            AttributeInfo(
                name="Title", description="The title of the movie", type="string"),
            AttributeInfo(name="Runtime (minutes)",
                          description="The runtime of the movie in minutes", type="integer"),
            AttributeInfo(name="Language",
                          description="The language of the movie", type="string"),
            ...
        ]

        constructor_prompt = get_query_constructor_prompt(
            document_content_description,
            metadata_field_info,
            allowed_comparators=allowed_comparators,
            examples=examples,
        )

        output_parser = StructuredQueryOutputParser.from_components()
        query_constructor = constructor_prompt | query_model | output_parser

        retriever = SelfQueryRetriever(
            query_constructor=query_constructor,
            vectorstore=vectorstore,
            structured_query_translator=PineconeTranslator(),
            search_kwargs={'k': 10}
        )

除了示例之外,模型還必須知道每個(gè)元數(shù)據(jù)字段的描述。這有助于它了解什么是元數(shù)據(jù)過(guò)濾。

最后,我們來(lái)構(gòu)建我們的鏈。這里的query_model是使用OpenAI API的GPT-4 Turbo的一個(gè)實(shí)例。我建議使用GPT-4而不是3.5來(lái)編寫(xiě)這些元數(shù)據(jù)過(guò)濾器查詢(xún),因?yàn)檫@是一個(gè)關(guān)鍵步驟,理由是3.5會(huì)更頻繁地出錯(cuò)。search_kwargs={'k':10}告訴檢索器根據(jù)用戶(hù)查詢(xún)找出十部最相似的電影。

創(chuàng)建聊天模型

最后,在構(gòu)建了自查詢(xún)檢索器之后,我們可以在此基礎(chǔ)上構(gòu)建標(biāo)準(zhǔn)的RAG模型。我們首先定義我們的聊天模型。這就是我所說(shuō)的摘要模型,因?yàn)樗捎蒙舷挛?檢索到的電影+系統(tǒng)消息),并以每個(gè)推薦的摘要作為響應(yīng)。如果你想降低成本,這個(gè)模型可以是GPT-3.5 Turbo;當(dāng)然,如果你想獲得絕對(duì)最佳的結(jié)果,這個(gè)模型也可以是GPT-4 Turbo。

在系統(tǒng)消息中,我告訴機(jī)器人它的目標(biāo)是什么,并提供了一系列建議和限制,其中最重要的是不要推薦自我查詢(xún)檢索器沒(méi)有提供給它的電影。在測(cè)試中,當(dāng)用戶(hù)查詢(xún)沒(méi)有從數(shù)據(jù)庫(kù)中得到電影時(shí),我遇到了問(wèn)題。例如,查詢(xún)“推薦一些由韋斯·安德森執(zhí)導(dǎo)的馬特·達(dá)蒙主演的1980年之前拍攝的恐怖電影”會(huì)導(dǎo)致自我查詢(xún)檢索器無(wú)法檢索到任何電影(因?yàn)楸M管聽(tīng)起來(lái)很棒,但這部電影并不存在)。在沒(méi)有電影數(shù)據(jù)的情況下,該模型會(huì)使用自己的(錯(cuò)誤的)內(nèi)存來(lái)嘗試推薦一些電影。這是不好的行為。我不希望Netflix的推薦人討論數(shù)據(jù)庫(kù)中沒(méi)有的電影。下面的系統(tǒng)消息成功阻止了此行為。我確實(shí)注意到GPT-4比GPT-3.5更善于遵循指令,這是在意料之中的事情。

chat_model = ChatOpenAI(
    model=SUMMARY_MODEL_NAME,
    temperature=0,
    streaming=True,
)

prompt = ChatPromptTemplate.from_messages(
    [
        (
            'system',
            """
            Your goal is to recommend films to users based on their 
            query and the retrieved context. If a retrieved film doesn't seem 
            relevant, omit it from your response. If your context is empty
            or none of the retrieved films are relevant, do not recommend films
            , but instead tell the user you couldn't find any films 
            that match their query. Aim for three to five film recommendations,
            as long as the films are relevant. You cannot recommend more than 
            five films. Your recommendation should be relevant, original, and 
            at least two to three sentences long.
            
            YOU CANNOT RECOMMEND A FILM IF IT DOES NOT APPEAR IN YOUR 
            CONTEXT.

            # TEMPLATE FOR OUTPUT
            - **Title of Film**:
                - Runtime:
                - Release Year:
                - Streaming:
                - (Your reasoning for recommending this film)
            
            Question: {question} 
            Context: {context} 
            """
        ),
    ]
)

def format_docs(docs):
    return "\n\n".join(f"{doc.page_content}\n\nMetadata: {doc.metadata}" for doc in docs)

# Create a chatbot Question & Answer chain from the retriever
rag_chain_from_docs = (
    RunnablePassthrough.assign(
        context=(lambda x: format_docs(x["context"])))
    | prompt
    | chat_model
    | StrOutputParser()
)

rag_chain_with_source = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
).assign(answer=rag_chain_from_docs)

上述代碼中,formatdocs用于格式化提供給模型的信息,使其易于理解和解析。我們向模型提供page_content(概述和關(guān)鍵字)以及元數(shù)據(jù)(所有其他電影屬性);任何它可能需要用來(lái)更好地向用戶(hù)推薦電影的信息。

rag_chain_from_docs是一個(gè)鏈,它獲取檢索到的文檔,并使用format_docs對(duì)其進(jìn)行格式化,然后將格式化的文檔饋送到模型用來(lái)回答問(wèn)題的上下文中。最后,我們創(chuàng)建了rag_chain_with_source,這是一個(gè)RunnableParallel,顧名思義,它并行運(yùn)行兩個(gè)操作:自查詢(xún)檢索器啟動(dòng)以檢索類(lèi)似的文檔,而查詢(xún)只是通過(guò)RunnablePassthrough()函數(shù)傳遞給模型。然后將來(lái)自這兩個(gè)并行組件的結(jié)果進(jìn)行組合,并使用rag_chain_from_docs生成答案。這里的source指的是檢索器,它可以訪問(wèn)所有的“source”文檔。

因?yàn)槲蚁M鸢甘橇魇降?例如,像ChatGPT這樣一塊一塊地呈現(xiàn)給用戶(hù)),所以我們使用了以下代碼:

for chunk in rag_chain_with_source.stream(query):
    for key in chunk:
        if key == 'answer':
            yield chunk[key]

程序展示

現(xiàn)在進(jìn)入有趣的部分:與模型一起玩。Streamlit軟件是一個(gè)用于創(chuàng)建前端和托管應(yīng)用程序的優(yōu)秀工具。當(dāng)然,我不會(huì)在本文中討論所開(kāi)發(fā)軟件的用戶(hù)界面相關(guān)的代碼;有關(guān)此用戶(hù)界面實(shí)現(xiàn)的詳細(xì)信息,請(qǐng)參閱文后所附的原始代碼。當(dāng)然,這些代碼也相當(dāng)簡(jiǎn)單,Streamlit網(wǎng)站(https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps)上還有很多其他的例子可供參考。

電影搜索實(shí)例程序的用戶(hù)界面(作者本人提供圖片)

您可以使用軟件中提供的好幾個(gè)方面的建議,但首先讓我們嘗試使用自己的查詢(xún):

示例查詢(xún)和模型響應(yīng)情況(作者本人提供圖片)

在底層的代碼實(shí)現(xiàn)中,這個(gè)自我查詢(xún)的檢索器確保過(guò)濾掉任何不是法語(yǔ)的電影。然后,它對(duì)“成長(zhǎng)故事”進(jìn)行了相似性搜索,得出了十部在此背景下的電影。最后,機(jī)器人選擇了五部電影進(jìn)行推薦。請(qǐng)注意建議的電影范圍:有些電影的上映日期最早在1959年,最晚在2012年。為了方便起見(jiàn),我確保機(jī)器人提供的信息中包含電影的運(yùn)行時(shí)間、上映年份、流媒體提供商以及機(jī)器人手工制作的簡(jiǎn)短推薦。

(旁注:如果你還沒(méi)有看過(guò)《400拳》( The 400 Blows:https://en.wikipedia.org/wiki/The_400_Blows),請(qǐng)停止你正在做的任何事情,立即去看一看吧。)

值得注意的是,以前在大型語(yǔ)言模型中通常被視為負(fù)面的性質(zhì),例如其響應(yīng)的不確定性,現(xiàn)在被系統(tǒng)認(rèn)為是正面的性質(zhì)。向模型提出同樣的問(wèn)題兩次,你可能會(huì)得到略微不同的建議。

重要的是,要注意當(dāng)前實(shí)施的一些局限性:

  • 無(wú)法保存建議。用戶(hù)可能希望重新訪問(wèn)舊的推薦。
  • 手動(dòng)更新電影數(shù)據(jù)庫(kù)中的原始數(shù)據(jù)。將其自動(dòng)化并每周更新是個(gè)好主意。
  • 自查詢(xún)檢索過(guò)濾的元數(shù)據(jù)不正確。例如,“本·阿弗萊克電影”的查詢(xún)可能會(huì)有問(wèn)題。這可能意味著查詢(xún)本·阿弗萊克主演的電影或本·阿弗萊克執(zhí)導(dǎo)的電影。這是一個(gè)對(duì)查詢(xún)進(jìn)行澄清會(huì)有所幫助的例子。

最后,您可能對(duì)本文項(xiàng)目作出的改進(jìn)之一是,在檢索后對(duì)文檔(https://python.langchain.com/docs/integrations/retrievers/cohere-reranker)進(jìn)行重新排序。另外,提供一個(gè)聊天模型也可能很有趣,因?yàn)槟憧梢栽诙嗷睾系膶?duì)話中與之交談,而不僅僅是一個(gè)QA機(jī)器人。此外,你還可以創(chuàng)建一個(gè)推薦器代理(https://python.langchain.com/docs/integrations/tools/human_tools),以便在查詢(xún)不清楚的情況下向用戶(hù)提示一個(gè)清晰的問(wèn)題。

最后,祝您的電影搜索玩得開(kāi)心!

鏈接參考

  • 自己嘗試電影搜索(需要OpenAI API密鑰):https://platform.openai.com/api-keys
  • 本文位于GitHub的示例代碼鏈接:https://github.com/EdIzaguirre/FilmSearchOpen

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專(zhuān)家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:How to Build a RAG System with a Self-Querying Retriever in LangChain,作者:Ed Izaguirre

鏈接:

https://towardsdatascience.com/how-to-build-a-rag-system-with-a-self-querying-retriever-in-langchain-16b4fa23e9ad。

想了解更多AIGC的內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO AI.x社區(qū)

http://www.scjtxx.cn/aigc/

責(zé)任編輯:姜華 來(lái)源: 51CTO內(nèi)容精選
相關(guān)推薦

2024-08-12 08:28:53

2024-09-02 08:17:53

RAG聊天機(jī)器人人工智能

2024-06-03 09:33:28

2024-05-20 08:31:33

檢索增強(qiáng)生成LLM大型語(yǔ)言模型

2023-09-11 09:00:00

檢索增強(qiáng)生成大數(shù)據(jù)模型自然語(yǔ)言處理

2025-02-06 08:26:21

2024-10-29 11:54:25

2024-08-30 11:27:55

父文檔檢索RAG技術(shù)人工智能

2024-09-11 16:36:39

2024-03-26 00:00:07

2011-04-12 16:00:42

銀行系統(tǒng)周偉然

2025-04-01 09:25:09

2022-12-28 09:30:07

鴻聯(lián)系統(tǒng)開(kāi)發(fā)

2022-09-19 14:13:15

RabbitMQ系統(tǒng)開(kāi)發(fā)

2025-03-28 08:00:00

RAG文本檢索大模型

2024-12-19 08:00:00

人工智能LLMLangChain

2023-10-14 17:46:17

RAG提示工程GPT-3

2012-10-12 10:30:37

PHPOauth

2024-08-05 10:23:36

2025-01-13 10:55:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)