日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

文檔檢索和LLM集成

本文介紹AnalyticDB PostgreSQL版如何通過Python代碼進行文本檢索及在LangChain中實現問答系統。

文檔檢索

本章節以使用純文本檢索為例,示例代碼如下:

def query_content(namespace, namespace_password, collection, top_k,
                  content,
                  filter_str: str = None,
                  metrics: str = None,
                  use_full_text_retrieval: bool = None):
      request = gpdb_20160503_models.QueryContentRequest(
          region_id=ADBPG_INSTANCE_REGION,
          dbinstance_id=ADBPG_INSTANCE_ID,
          namespace=namespace,
          namespace_password=namespace_password,
          collection=collection,
          content=content,
          filter=filter_str,
          top_k=top_k,
          metrics=metrics,
          use_full_text_retrieval=use_full_text_retrieval,
      )
      response = get_client().query_content(request)
      print(f"query_content response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    query_content('ns1', 'Ns1password', 'dc1', 10, 'ADBPG是什么?')


# output: body:
# {
#   "Matches": 
#      {
#        "MatchList": 
#          [{
#            "Content": "ADBPG...",
#            "FileName": "test.pdf", 
#            "Id": "9368a9aa-8a26-4200-b84b-cab4e06dbbd4_20"
#            "LoaderMetadata": "\"page\":1.0,\"total_pages\":15.0,\"format\":\"PDF 1.4\",\"title\":\"\",\"author\":\"\",\"subject\":\"\",\"keywords\":\"\",\"creator\":\"Chromium\",\"producer\":\"Skia/PDF m93\",\"creationDate\":\"D:20231213060903+00\\u002700\\u0027\",\"modDate\":\"D:20231213060903+00\\u002700\\u0027\",\"trapped":\"\"}", 
#            "Metadata": {}, 
#            "RetrievalSource": 1, 
#            "Score": 0.7038057130604151
#          },....]
#      }
# }

其中query_content參數說明如下:

  • namespace:文檔庫所在的Namespace名稱。

  • namespace_password:Namespace的密碼。

  • collection:文檔庫名稱。

  • top_k:返回相似度最高的檢索結果數量。

  • content:要檢索的文本內容。

  • filter_str:檢索前的過濾語句。

  • metrics:向量距離算法,建議不設置,會按照創建索引時的算法計算。

  • use_full_text_retrieval:是否使用全文檢索,取值說明如下:

    • true:使用全文檢索。

    • false(默認):不使用全文檢索。

返回的檢索結果列表包含以下信息:

  • Id:切分后的Chunk對應的UUID。

  • FileName:文檔名稱。

  • Content:檢索的內容,即切分后的一條Chunk。

  • LoaderMetadata:在文檔上傳時產生的Metadata數據。

  • Metadata:用戶自定義的Metadata數據。

  • RetrievalSource:檢索來源,取值說明如下:

    • 1:向量檢索命中。

    • 2:全文檢索命中。

    • 3:向量檢索和全文檢索雙路命中。

  • Score:按照指定的相似度算法得到的相似度分數。

集成LangChain

LangChain是一套基于大語言模型(LLM)構建應用的開源框架,可實現通過一整套接口和工具將模型和外部數據連接。下文將展示如何將AnalyticDB PostgreSQL版的檢索能力集成到LangChain中實現一個問答系統。

安裝模塊

pip install --upgrade langchain openai tiktoken

構建AdbpgRetriever

from langchain_core.retrievers import BaseRetriever
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document


class AdbpgRetriever(BaseRetriever):
    namespace: str = None
    namespace_password: str = None
    collection: str = None
    top_k: int = None
    use_full_text_retrieval: bool = None

    def query_content(self, content) -> List[gpdb_20160503_models.QueryContentResponseBodyMatchesMatchList]:
        request = gpdb_20160503_models.QueryContentRequest(
            region_id=ADBPG_INSTANCE_REGION,
            dbinstance_id=ADBPG_INSTANCE_ID,
            namespace=self.namespace,
            namespace_password=self.namespace_password,
            collection=self.collection,
            content=content,
            top_k=self.top_k,
            use_full_text_retrieval=self.use_full_text_retrieval,
        )
        response = get_client().query_content(request)
        return response.body.matches.match_list

    def _get_relevant_documents(
            self, query: str, *, run_manager: CallbackManagerForRetrieverRun
    ) -> List[Document]:
        match_list = self.query_content(query)
        return [Document(page_content=i.content) for i in match_list]

創建Chain

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

OPENAI_API_KEY = "YOUR_OPENAI_API_KEY"
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

template = """Answer the question based only on the following context:

{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()


def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])

retriever = AdbpgRetriever(namespace='ns1', namespace_password='Ns1password', collection='dc1', top_k=10, use_full_text_retrieval=True)
chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

問答

chain.invoke("AnalyticDB PostgreSQL是什么?")

# 回答:
# AnalyticDB PostgreSQL是阿里云提供的一種云原生在線分析處理(OLAP)服務,它基于開源的PostgreSQL數據庫擴展,提供了高性能、高容量的數據倉庫解決方案。
# 它結合了PostgreSQL的靈活性和兼容性以及用于數據分析和報告的高并發和高速查詢能力。
#
# AnalyticDB PostgreSQL特別適合處理大規模數據集,支持實時分析和決策支持,是企業進行數據挖掘、商業智能(BI)、報告和數據可視化的有力工具。
# 作為一種托管服務,它簡化了數據倉庫的管理和運維,讓用戶能夠專注于數據分析而不是底層基礎設施。
# 主要特點包括:
# 
# 高性能分析 - 使用列式存儲和大規模并行處理(MPP)架構來快速查詢和分析大量數據。
# 易于擴展 - 根據數據量和查詢性能要求,容易橫向和縱向擴展資源。
# 兼容 PostgreSQL - 支持PostgreSQL SQL語言和生態系統中的大部分工具,便于現有 PostgreSQL 用戶遷移和適應。
# 安全和可靠 - 提供數據備份、恢復和加密等功能,確保數據的安全性和可靠性。
# 云原生集成 - 與阿里云的其他服務如數據集成、數據可視化工具等緊密集成。
# 總之,AnalyticDB PostgreSQL是一個高性能、可擴展的云數據倉庫服務,允許企業在云環境中進行復雜的數據分析和報告。