數據是現代應用程式的生命線,驅動著從應用測試到機器學習 (ML) 模型訓練和評估的一切。隨著數據需求的持續上升,生成式人工智慧模型的出現提供了一種創新的解決方案。這些大型語言模型 (LLMs) 在龐大的數據集上進行訓練,具備根據提供的提示和輸入生成新內容的驚人能力,涵蓋文本、音頻和視頻等多種媒介格式,以及各種商業領域。
在這篇文章中,我們將探討如何使用這些 LLMs 和先進的檢索增強生成 (RAG) 技術,為金融領域的使用案例生成高品質的合成數據。您也可以使用相同的技術為其他商業領域的使用案例生成合成數據。在這篇文章中,我們將展示如何生成對手風險 (CR) 數據,這對於場外 (OTC) 衍生品交易非常有幫助,因為這類交易是在兩方之間直接進行的,而不需要通過正式的交易所。
解決方案概述
場外衍生品通常是對手方之間的定制合約,並包括各種金融工具,如遠期合約、期權、掉期和其他結構性產品。對手方是參與金融交易的另一方。在場外衍生品的背景下,對手方指的是與衍生合約簽訂的實體(例如銀行、金融機構、公司或個人)。
例如,在一個場外掉期或期權合約中,一個實體與另一方達成協議,並且每個實體成為對方的對手方。根據合約,這兩個實體之間的責任、義務和風險(如信用風險)是共享的。
隨著金融機構不斷應對複雜的 CR 環境,準確可靠的風險評估模型的需求變得至關重要。在我們的使用案例中,虛構的 ABC 銀行面臨著根據其場外衍生品數據評估給定對手方風險的挑戰。
建立這樣的模型面臨許多挑戰。儘管 ABC 銀行從各種來源收集了大量數據集,並且數據格式各異,但這些數據可能存在偏見、偏斜或缺乏訓練高準確度模型所需的多樣性。主要挑戰在於收集和預處理數據,使其適合用於訓練 ML 模型。部署不適合的模型可能導致錯誤的決策和重大財務損失。
我們提出了一種使用 RAG 方法的生成式人工智慧解決方案。RAG 是一種廣泛使用的方法,通過提供來自原始訓練中未包含的外部數據源的額外信息來增強 LLMs。整個解決方案可以大致分為三個步驟:索引、數據生成和驗證。
數據索引
在索引步驟中,我們使用 Amazon Titan Text Embeddings V2 模型解析、分割並將代表性的 CR 數據轉換為向量格式,並將這些信息存儲在 Chroma 向量數據庫中。Chroma 是一個開源向量數據庫,以其易用性、高效的相似性搜索和對多模態數據及元數據的支持而聞名。它提供內存和持久存儲選項,與流行的 ML 框架集成良好,適合各種 AI 應用。對於較小到中等大小的數據集和需要本地部署或低資源使用的項目特別有利。以下圖示說明了這一架構。
以下是數據索引的步驟:
將示例 CR 數據分割成更小、可管理的塊,以優化嵌入生成。
將這些分割的數據塊傳遞給一個負責生成嵌入並高效存儲的方式。
調用 Amazon Titan Text Embeddings V2 API 從準備好的數據塊生成高品質的嵌入。
然後將生成的嵌入存儲在 Chroma 向量數據庫中,為未來的使用提供高效檢索和相似性搜索。
數據生成
當用戶請求某個場景的數據時,請求會轉換為向量格式,然後在 Chroma 數據庫中查找與存儲數據的匹配。檢索到的數據會與用戶請求和額外提示一起增強,傳遞給 Anthropic 的 Claude Haiku 在 Amazon Bedrock 上。選擇 Anthropic 的 Claude Haiku 主要是因為其速度,每秒處理超過 21,000 個標記,這大大超過了同類產品。此外,Anthropic 的 Claude Haiku 在數據生成方面的效率也非常出色,輸入與輸出標記的比例為 1:5。這意味著它可以從相對少量的輸入或上下文中生成大量數據。這種能力不僅提高了模型的有效性,還使我們的應用在需要從有限示例中生成大量數據樣本時變得具有成本效益。Anthropic 的 Claude Haiku LLM 被迭代調用,以有效管理標記消耗並幫助防止達到最大標記限制。以下圖示說明了這一工作流程。
以下是數據生成的步驟:
用戶根據特定標準發起請求以生成新的合成對手風險數據。
使用 Amazon Titan Text Embeddings V2 LLM 為用戶的請求提示創建嵌入,將其轉換為機器可解釋的格式。
將這些新生成的嵌入轉發給一個專門的模塊,該模塊旨在識別匹配的存儲數據。
查詢 Chroma 向量數據庫,該數據庫存儲著先前存儲的嵌入,以查找與用戶請求密切匹配的數據。
將識別出的匹配數據和原始用戶提示傳遞給一個負責生成新合成數據的模塊。
調用 Anthropic 的 Claude Haiku 3.0 模型,使用匹配的嵌入和用戶提示作為輸入來創建高品質的合成數據。
然後使用 Pydantic 庫將生成的合成數據解析並格式化為 .csv 文件,提供結構化和驗證的輸出。
為了確認生成數據的質量,應用幾種統計方法,包括分位數-分位數 (Q-Q) 圖和關鍵屬性的相關性熱圖,提供全面的驗證過程。
數據驗證
在驗證 LLM 生成的合成 CR 數據時,我們使用 Q-Q 圖和關聯熱圖,重點關注關鍵屬性,如 cp_exposure、cp_replacement_cost 和 cp_settlement_risk。這些統計工具在促進合成數據的質量和代表性方面起著至關重要的作用。通過使用 Q-Q 圖,我們可以評估這些屬性是否遵循正態分佈,這在許多臨床和金融變量中通常是預期的。通過將我們的合成數據的分位數與理論正態分佈進行比較,我們可以識別出顯著的偏差,這可能表明偏見或不現實的數據生成。
同時,相關性熱圖提供了這些屬性與數據集中其他屬性之間關係的可視化表示。這一點特別重要,因為它有助於驗證 LLM 是否保持了在真實 CR 數據中通常觀察到的複雜相互依賴性。例如,我們會期望暴露與替代成本之間,或替代成本與結算風險之間存在某些相關性。通過確保這些相關性在我們的合成數據中得以保留,我們可以更有信心地認為基於這些數據構建的分析或模型將產生適用於現實世界情況的見解。這一嚴格的驗證過程有助於減少引入人工模式或偏見的風險,從而提高我們的合成 CR 數據集在後續研究或建模任務中的可靠性和實用性。
我們創建了一個 Jupyter 筆記本,包含三個部分以實現解決方案的關鍵組件。我們提供了筆記本中的代碼片段以便更好地理解。
前置條件
要設置解決方案並生成測試數據,您應該具備以下前置條件:
必須在您的計算機上安裝 Python 3
我們建議安裝可以運行 Jupyter 筆記本的集成開發環境 (IDE)
您也可以使用 AWS 控制台中的 Amazon SageMaker 創建 Jupyter 筆記本實例並在那裡開發代碼。
您需要擁有一個 AWS 帳戶,並且可以訪問 Amazon Bedrock 和以下啟用的 LLM(請小心不要分享 AWS 帳戶憑證):
Amazon Titan Text Embeddings V2
Anthropic 的 Claude 3 Haiku
設置
以下是設置環境的步驟。
import sys!{sys.executable} -m pip install -r requirements.txt
requirements.txt 的內容如下。
boto3
langchain
langchain-community
streamlit
chromadb==0.4.15
numpy
jq
langchain-aws
seaborn
matplotlib
scipy
以下代碼片段將執行所有必要的導入。
from pprint import pprint
from uuid import uuid4
import chromadb
from langchain_community.document_loaders import JSONLoader
from langchain_community.embeddings import BedrockEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
在 Chroma 數據庫中索引數據
在這一部分,我們展示了如何在 Chroma 數據庫中進行數據索引,作為本地維護的開源向量存儲。這些索引數據用作生成數據的上下文。
以下代碼片段顯示了從文件加載 JSON 數據並將其分割成更小塊的預處理步驟:
def load_using_jsonloaer(path):
loader = JSONLoader(path,
jq_schema=”.[]”,
text_content=False)
documents = loader.load()
return documents
def split_documents(documents):
doc_list = [item for item in documents]
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=0)
texts = text_splitter.split_documents(doc_list)
return texts
以下片段顯示如何創建 Amazon Bedrock 嵌入實例。我們使用的是 Amazon Titan Embeddings V2 模型:
def get_bedrock_embeddings():
aws_region = “us-east-1”
model_id = “amazon.titan-embed-text-v2:0” #查找模型的最新版本
bedrock_embeddings = BedrockEmbeddings(model_id=model_id, region_name=aws_region)
return bedrock_embeddings
以下代碼顯示如何創建嵌入並將其加載到 Chroma 數據庫中:
persistent_client = chromadb.PersistentClient(path=”../data/chroma_index”)
collection = persistent_client.get_or_create_collection(“test_124”)
print(collection)
# 查詢數據庫
vector_store_with_persistent_client = Chroma(collection_name=”test_124″,
persist_directory=”../data/chroma_index”,
embedding_function=get_bedrock_embeddings(),
client=persistent_client)
load_json_and_index(vector_store_with_persistent_client)
生成數據
以下代碼片段顯示了在使用 Amazon Bedrock APIs 調用 LLM 時使用的配置。使用的 LLM 是 Anthropic 的 Claude 3 Haiku:
config = Config(
region_name=”us-east-1″,
signature_version=’v4′,
retries={
‘max_attempts’: 2,
‘mode’: ‘standard’
}
)
bedrock_runtime = boto3.client(‘bedrock-runtime’, config=config)
model_id = “anthropic.claude-3-haiku-20240307-v1:0” #查找模型的最新版本
model_kwrgs = {
“temperature”: 0,
“max_tokens”: 8000,
“top_p”: 1.0,
“top_k”: 25,
“stop_sequences”: [“company-1000”],
}
# 初始化語言模型
llm = ChatBedrock(
model_id=model_id,
model_kwargs=model_kwrgs,
client=bedrock_runtime,
)
以下代碼顯示如何通過查詢 Chroma 數據庫(數據已被索引)來獲取上下文,以查找匹配的嵌入。我們使用相同的 Amazon Titan 模型來生成嵌入:
def get_context(scenario):
region_name=”us-east-1″
credential_profile_name = “default”
titan_model_id = “amazon.titan-embed-text-v2:0”
kb_context = []
be = BedrockEmbeddings(region_name=region_name,
credentials_profile_name=credential_profile_name,
model_id=titan_model_id)
vector_store = Chroma(collection_name=”test_124″, persist_directory=”../data/chroma_index”,
embedding_function=be)
search_results = vector_store.similarity_search(scenario, k=3)
for doc in search_results:
kb_context.append(doc.page_content)
return json.dumps(kb_context)
以下片段顯示了我們如何制定傳遞給 LLM 的詳細提示。我們提供了上下文、場景、起始索引、結束索引、記錄數量和其他參數的示例。提示是主觀的,可以根據實驗進行調整。
# 創建提示模板
prompt_template = ChatPromptTemplate.from_template(
“您是一位金融數據專家,負責生成代表公司 OTC 衍生品數據的記錄,”
“應該足夠好以供投資者和貸款 ML 模型做出決策,”
“數據應準確反映場景: {scenario} \n “
“並且根據上下文中給出的示例: “
“上下文是 {context} “
“上下文中給出的示例僅供參考,生成數據集時請勿使用相同的值。”
“生成具有多樣化樣本的數據集,但記錄應能準確代表給定場景。”
“請確保生成的數據滿足以下標準: “
“數據應多樣且現實,反映各種行業、”
“公司規模、財務指標。 “
“確保生成的數據遵循特徵之間的邏輯關係和相關性 “
“(例如,較高的收入通常對應於更多的員工、”
“更好的信用評級和較低的風險)。 “
“並生成 {count} 條記錄,從索引 {start_index} 開始。 “
“僅生成 JSON,並且在 JSON 之前或之後不包括任何文本或消息。 “
“{format_instruction} \n”
“如果繼續,請在此記錄之後開始: {last_record}\n”
“如果停止,請不要將此記錄包含在輸出中。”
“請確保生成的數據格式良好且一致。”
)
以下代碼片段顯示了生成合成數據的過程。您可以以迭代方式調用此方法以生成更多記錄。輸入參數包括場景、上下文、計數、起始索引和最後記錄。響應數據也使用以下提供的指令格式化為 CSV 格式:
output_parser.get_format_instructions():
def generate_records(start_index, count, scenario, context, last_record=””):
try:
response = chain.invoke({
“count”: count,
“start_index”: start_index,
“scenario”: scenario,
“context”: context,
“last_record”: last_record,
“format_instruction”: output_parser.get_format_instructions(),
“data_set_class_schema”: DataSet.schema_json()
})
return response
except Exception as e:
print(f”generate_records 中出錯: {e}”)
raise e
解析 LLM 生成的輸出並將其表示為 CSV 是相當具有挑戰性的。我們使用 Pydantic 解析器來解析 LLM 生成的 JSON 輸出,如以下代碼片段所示:
class CustomPydanticOutputParser(PydanticOutputParser):
def parse(self, text: str) -> BaseModel:
# 從文本中提取 JSON
try:
# 找到第一個 ‘{‘ 的出現
start = text.index(‘{‘)
# 找到最後一個 ‘}’ 的出現
end = text.rindex(‘}’) + 1
json_str = text[start:end]
# 解析 JSON 字符串
parsed_json = json.loads(json_str)
# 使用父類將其轉換為 Pydantic 對象
return super().parse_with_cls(parsed_json)
except (ValueError, json.JSONDecodeError) as e:
raise ValueError(f”解析輸出失敗: {e}”)
以下代碼片段顯示了如何以迭代方式生成記錄,每次調用 LLM 生成 10 條記錄:
def generate_full_dataset(total_records, batch_size, scenario, context):
dataset = []
total_generated = 0
last_record = “”
batch: DataSet = generate_records(total_generated,
min(batch_size, total_records – total_generated),
scenario, context, last_record)
# print(f”batch: {type(batch)}”)
total_generated = len(batch.records)
dataset.extend(batch.records)
while total_generated < total_records:
try:
batch = generate_records(total_generated,
min(batch_size, total_records – total_generated),
scenario, context, batch.records[-1].json())
processed_batch = batch.records
if processed_batch:
dataset.extend(processed_batch)
total_generated += len(processed_batch)
last_record = processed_batch[-1].start_index
print(f”生成了 {total_generated} 條記錄。”)
else:
print(“生成了一個空或無效的批次。重試中…”)
time.sleep(10)
except Exception as e:
print(f”發生錯誤: {e}。重試中…”)
time.sleep(5)
return dataset[:total_records] # 確保生成的記錄數量與請求的數量完全相符
驗證生成數據的統計特性
我們為生成數據的關鍵屬性 cp_exposure、cp_replacement_cost 和 cp_settlement_risk 生成了 Q-Q 圖,如以下截圖所示。Q-Q 圖比較數據分佈的分位數與正態分佈的分位數。如果數據不偏斜,點應大致沿著對角線排列。
作為驗證的下一步,我們創建了以下屬性的相關性熱圖:cp_exposure、cp_replacement_cost、cp_settlement_risk 和風險。該圖完美平衡,對角元素顯示值為 1。值為 1 表示該列與自身完全相關。以下截圖是相關性熱圖。
清理
作為最佳實踐,清理您在本篇文章中創建的資源,以防止不必要的成本和潛在的安全風險是非常重要的。如果您在 SageMaker 中創建了 Jupyter 筆記本實例,請完成以下步驟:
保存並關閉筆記本: # 首先保存您的工作
# 然後通過點擊文件 -> 關閉和停止來關閉所有打開的筆記本
清除輸出(如果在保存之前需要): # 選項 1:使用筆記本菜單
# 核心 -> 重啟並清除輸出
# 選項 2:使用代碼
from IPython.display import clear_output
clear_output()
停止並刪除在 SageMaker 中創建的 Jupyter 筆記本實例: # 選項 1:使用 aws cli
# 當不使用時停止筆記本實例
aws sagemaker stop-notebook-instance –notebook-instance-name <your-notebook-name>
# 如果您不再需要該筆記本實例
aws sagemaker delete-notebook-instance –notebook-instance-name <your-notebook-name>
# 選項 2:使用 Sagemager 控制台
# Amazon Sagemaker -> 筆記本
# 選擇筆記本並點擊操作下拉菜單,然後點擊停止。
點擊操作下拉菜單並點擊刪除
負責任地使用 AI
在金融應用中使用 AI 時,負責任的 AI 使用和數據隱私至關重要。雖然合成數據生成可以是一種強大的工具,但確保未經適當授權和徹底匿名化的真實客戶信息不被使用是至關重要的。組織必須優先考慮數據保護,實施強有力的安全措施,並遵守相關法規。此外,在開發和部署 AI 模型時,考慮倫理影響、潛在偏見和更廣泛的社會影響也至關重要。負責任的 AI 實踐包括定期審計、決策過程的透明度和持續監控,以幫助防止意外後果。通過在創新與倫理考量之間取得平衡,金融機構可以利用 AI 的好處,同時保持信任並保護個人隱私。
結論
在這篇文章中,我們展示了如何生成一個平衡良好的合成數據集,代表各種對手數據的各個方面,使用基於 RAG 的提示工程與 LLMs。對手數據分析對於在兩個對手之間進行 OTC 交易至關重要。由於這一領域的實際商業數據不易獲得,使用這種方法您可以以最低的成本在幾分鐘內生成合成訓練數據供您的 ML 模型使用。在訓練模型後,您可以用它來在進行 OTC 衍生品交易之前做出明智的決策。
有關此主題的更多信息,請參考以下資源:
關於作者
Santosh Kulkarni 是一位資深的審核架構師,擁有超過 16 年的經驗,專注於為各個領域的客戶開發無伺服器、基於容器和數據架構。Santosh 的專業知識擴展到機器學習,並且是 AWS ML 認證專家。目前,他參與多個利用 AWS Bedrock 和託管基礎模型的項目。
Joyanta Banerjee 是 AWS ProServe 的資深現代化架構師,專注於為來自不同行業的客戶構建安全和可擴展的雲原生應用。他對 AI/ML 領域產生了興趣,特別是利用 Amazon Bedrock 上可用的生成 AI 能力。
Mallik Panchumarthy 是 AWS 的生成 AI 和機器學習資深專家解決方案架構師。Mallik 與客戶合作,幫助他們架構高效、安全和可擴展的 AI 和機器學習應用。Mallik 專注於生成 AI 服務 Amazon Bedrock 和 Amazon SageMaker。
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!