文檔檢索和LLM集成
本文介紹AnalyticDB PostgreSQL版如何通過Python代碼進行文本檢索及在LangChain中實現(xiàn)問答系統(tǒng)。
文檔檢索
本章節(jié)以使用純文本檢索為例,示例代碼如下:
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參數(shù)說明如下:
namespace:文檔庫所在的Namespace名稱。
namespace_password:Namespace的密碼。
collection:文檔庫名稱。
top_k:返回相似度最高的檢索結(jié)果數(shù)量。
content:要檢索的文本內(nèi)容。
filter_str:檢索前的過濾語句。
metrics:向量距離算法,建議不設置,會按照創(chuàng)建索引時的算法計算。
use_full_text_retrieval:是否使用全文檢索,取值說明如下:
true:使用全文檢索。
false(默認):不使用全文檢索。
返回的檢索結(jié)果列表包含以下信息:
Id:切分后的Chunk對應的UUID。
FileName:文檔名稱。
Content:檢索的內(nèi)容,即切分后的一條Chunk。
LoaderMetadata:在文檔上傳時產(chǎn)生的Metadata數(shù)據(jù)。
Metadata:用戶自定義的Metadata數(shù)據(jù)。
RetrievalSource:檢索來源,取值說明如下:
1:向量檢索命中。
2:全文檢索命中。
3:向量檢索和全文檢索雙路命中。
Score:按照指定的相似度算法得到的相似度分數(shù)。
集成LangChain
LangChain是一套基于大語言模型(LLM)構(gòu)建應用的開源框架,可實現(xiàn)通過一整套接口和工具將模型和外部數(shù)據(jù)連接。下文將展示如何將AnalyticDB PostgreSQL版的檢索能力集成到LangChain中實現(xiàn)一個問答系統(tǒng)。
安裝模塊
pip install --upgrade langchain openai tiktoken
構(gòu)建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]
創(chuàng)建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數(shù)據(jù)庫擴展,提供了高性能、高容量的數(shù)據(jù)倉庫解決方案。
# 它結(jié)合了PostgreSQL的靈活性和兼容性以及用于數(shù)據(jù)分析和報告的高并發(fā)和高速查詢能力。
#
# AnalyticDB PostgreSQL特別適合處理大規(guī)模數(shù)據(jù)集,支持實時分析和決策支持,是企業(yè)進行數(shù)據(jù)挖掘、商業(yè)智能(BI)、報告和數(shù)據(jù)可視化的有力工具。
# 作為一種托管服務,它簡化了數(shù)據(jù)倉庫的管理和運維,讓用戶能夠?qū)W⒂跀?shù)據(jù)分析而不是底層基礎設施。
# 主要特點包括:
#
# 高性能分析 - 使用列式存儲和大規(guī)模并行處理(MPP)架構(gòu)來快速查詢和分析大量數(shù)據(jù)。
# 易于擴展 - 根據(jù)數(shù)據(jù)量和查詢性能要求,容易橫向和縱向擴展資源。
# 兼容 PostgreSQL - 支持PostgreSQL SQL語言和生態(tài)系統(tǒng)中的大部分工具,便于現(xiàn)有 PostgreSQL 用戶遷移和適應。
# 安全和可靠 - 提供數(shù)據(jù)備份、恢復和加密等功能,確保數(shù)據(jù)的安全性和可靠性。
# 云原生集成 - 與阿里云的其他服務如數(shù)據(jù)集成、數(shù)據(jù)可視化工具等緊密集成。
# 總之,AnalyticDB PostgreSQL是一個高性能、可擴展的云數(shù)據(jù)倉庫服務,允許企業(yè)在云環(huán)境中進行復雜的數(shù)據(jù)分析和報告。