<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      RAG知識庫之多表示索引

            在樸素RAG中通常會對文檔、文本進行分塊后進行文檔嵌入,對所有文件、文本都沒有經過采用Chunk方法可能有時候效果不是和好,盡管有著各種分塊策略有針對大文件的、針對小文件的策略,但都難免可能會造成上下文語義丟失。
            分塊通常有兩個非常重要的參數chunk_sizechunk_overlap,分別代表塊大小與塊與塊之間的重疊量,并不好確定這兩個值的具體數字,只能通過不斷實驗確定該值。

      基本原理

            在分塊效果不好時或許可以試試多表示索引(Multi-representation indexing),在多表示索引中并不會對整個文檔分塊后進行文檔嵌入。而是通過為每個文檔都生成一個文檔摘要,為每個文檔摘要與文檔生成一個唯一ID,將摘要與ID關聯嵌入到Vectorstore中,將ID與文檔關聯存儲到獨立文檔存儲中。

            在用戶提問時會先根據提出的問題先在多向量檢索器中檢索相似度最高的文檔摘要,獲取的文檔摘要后也得到了所關聯的id,再拿文檔id到文檔存儲中獲取所對應的完整文檔。
            此文檔作為用戶提問問題的上下文,同時將問題與文檔上下文提交到LLM。

            經過多表示索引的使用嵌入空間大小下降很多,相似度搜索性能也會提升,使用完整文檔用作上下文LLM響應的準確性也會有所提高。

            適用于小文檔結構,當文檔太大時會超出LLM上下文長度,超大文檔并不適用多表示索引。

      代碼示例

      def loadDocs():
          loader = WebBaseLoader("https://www.hinews.cn/news/system/2024/07/04/033173743.shtml")
          docs = loader.load()
          loader = WebBaseLoader("https://www.hinews.cn/news/system/2024/07/04/033173745.shtml")
          docs.extend(loader.load())
          return docs
      	
      def processSummaries():
          chain = (
          {"doc": lambda x: x.page_content}
          | ChatPromptTemplate.from_template("請總結以下文檔:\n\n{doc}")
          | llm
          | StrOutputParser())
          docs=loadDocs()
          summaries = chain.batch(docs, {"max_concurrency": 5})
          return summaries,docs
      
      def get_retriever():
          summaries, docs= processSummaries()
          docstore = init_docstore() 
          vectorstore = Chroma(collection_name="summaries", embedding_function=initEmbedding())
          #創建用于映射概要與文檔的id數組
          doc_ids = [str(uuid.uuid4()) for _ in docs]
          #創建概要文檔并關聯ID 
          summary_docs = [Document(page_content=s, metadata={"doc_id": doc_id}) for s, doc_id in zip(summaries, doc_ids)]
          #創建多向量檢索器
          retriever = MultiVectorRetriever(
              vectorstore=vectorstore,
              byte_store=docstore,
              id_key="doc_id",
              search_kwargs={'k': 1}
          )
          #將概要文檔添加到向量存儲
          retriever.vectorstore.add_documents(summary_docs)
          #文檔與id關聯
          lists = list(zip(doc_ids, docs))
      
          #文檔添加到檢索器的文檔存儲中
          retriever.docstore.mset(lists)
      
          return retriever
      
      

            創建好多向量檢索器后即可使用該檢索器,或配合RetrievalQA使用:

      query="機場在哪里"
      retriever= get_retriever()
      retriever.invoke(query)
      
      #問答鏈
      qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever, chain_type_kwargs={"prompt": PROMPT})
      resp =qa_chain.invoke(query)
      

            從多向量檢索器的實現源碼可看到,其先從vectorstore中查詢到相似度最高的N個概要文檔,然后獲取概要文檔ID,根據ID去查詢完整文檔。

      sub_docs = await self.vectorstore.asimilarity_search(
                      query, **self.search_kwargs
                  )
      ids = []
      for d in sub_docs:
          if self.id_key in d.metadata and d.metadata[self.id_key] not in ids:
              ids.append(d.metadata[self.id_key])
      docs = await self.docstore.amget(ids)
      
      
      posted @ 2024-07-08 08:42  AiFly  閱讀(357)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美日产国产精品日产| 亚洲成av人最新无码不卡短片| 日韩av中文字幕有码| 亚洲精品成人片在线播放| 欧美在线人视频在线观看| 日本公妇乱偷中文字幕| 国产深夜福利视频在线| 亚洲精品日韩久久精品| 精品国产三级a∨在线欧美| 久久中文字幕国产精品| 99riav国产精品视频| 东京热一精品无码av| 白嫩少妇激情无码| 综合偷自拍亚洲乱中文字幕| 三上悠亚精品一区二区久久| 欧美交A欧美精品喷水| 男女啪啪永久免费观看网站| 国产电影无码午夜在线播放| 精品国产成人午夜福利| 国产亚洲欧洲AⅤ综合一区| 高清自拍亚洲精品二区| 国产一区二区黄色在线观看| 亚洲精品欧美综合二区| 欧美日韩精品一区二区视频| 东京热无码av男人的天堂| 国产亚洲中文字幕久久网| 欧美野外伦姧在线观看| 南康市| 乱中年女人伦av三区| 亚洲红杏AV无码专区首页| 自拍亚洲综合在线精品| 亚洲国产美女精品久久久| 城口县| 国产一区二区三区小说| 亚洲乱码中文字幕小综合 | 国产亚洲欧美日韩俺去了| 国产精品一区二区传媒蜜臀| 三级国产三级在线| 精品国产一区二区在线视| 久热在线中文字幕色999舞| 国产精品不卡一区二区视频|