mirror of
https://github.com/hwchase17/langchain.git
synced 2025-05-06 15:48:39 +00:00
## Amazon Personalize support on Langchain This PR is a successor to this PR - https://github.com/langchain-ai/langchain/pull/13216 This PR introduces an integration with [Amazon Personalize](https://aws.amazon.com/personalize/) to help you to retrieve recommendations and use them in your natural language applications. This integration provides two new components: 1. An `AmazonPersonalize` client, that provides a wrapper around the Amazon Personalize API. 2. An `AmazonPersonalizeChain`, that provides a chain to pull in recommendations using the client, and then generating the response in natural language. We have added this to langchain_experimental since there was feedback from the previous PR about having this support in experimental rather than the core or community extensions. Here is some sample code to explain the usage. ```python from langchain_experimental.recommenders import AmazonPersonalize from langchain_experimental.recommenders import AmazonPersonalizeChain from langchain.llms.bedrock import Bedrock recommender_arn = "<insert_arn>" client=AmazonPersonalize( credentials_profile_name="default", region_name="us-west-2", recommender_arn=recommender_arn ) bedrock_llm = Bedrock( model_id="anthropic.claude-v2", region_name="us-west-2" ) chain = AmazonPersonalizeChain.from_llm( llm=bedrock_llm, client=client ) response = chain({'user_id': '1'}) ``` Reviewer: @3coins
196 lines
7.7 KiB
Python
196 lines
7.7 KiB
Python
from typing import Any, List, Mapping, Optional, Sequence
|
|
|
|
|
|
class AmazonPersonalize:
|
|
"""Amazon Personalize Runtime wrapper for executing real-time operations:
|
|
https://docs.aws.amazon.com/personalize/latest/dg/API_Operations_Amazon_Personalize_Runtime.html
|
|
|
|
Args:
|
|
campaign_arn: str, Optional: The Amazon Resource Name (ARN) of the campaign
|
|
to use for getting recommendations.
|
|
recommender_arn: str, Optional: The Amazon Resource Name (ARN) of the
|
|
recommender to use to get recommendations
|
|
client: Optional: boto3 client
|
|
credentials_profile_name: str, Optional :AWS profile name
|
|
region_name: str, Optional: AWS region, e.g., us-west-2
|
|
|
|
Example:
|
|
.. code-block:: python
|
|
|
|
personalize_client = AmazonPersonalize (
|
|
campaignArn='<my-campaign-arn>' )
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
campaign_arn: Optional[str] = None,
|
|
recommender_arn: Optional[str] = None,
|
|
client: Optional[Any] = None,
|
|
credentials_profile_name: Optional[str] = None,
|
|
region_name: Optional[str] = None,
|
|
):
|
|
self.campaign_arn = campaign_arn
|
|
self.recommender_arn = recommender_arn
|
|
|
|
if campaign_arn and recommender_arn:
|
|
raise ValueError(
|
|
"Cannot initialize AmazonPersonalize with both "
|
|
"campaign_arn and recommender_arn."
|
|
)
|
|
|
|
if not campaign_arn and not recommender_arn:
|
|
raise ValueError(
|
|
"Cannot initialize AmazonPersonalize. Provide one of "
|
|
"campaign_arn or recommender_arn"
|
|
)
|
|
|
|
try:
|
|
if client is not None:
|
|
self.client = client
|
|
else:
|
|
import boto3
|
|
import botocore.config
|
|
|
|
if credentials_profile_name is not None:
|
|
session = boto3.Session(profile_name=credentials_profile_name)
|
|
else:
|
|
# use default credentials
|
|
session = boto3.Session()
|
|
|
|
client_params = {}
|
|
if region_name:
|
|
client_params["region_name"] = region_name
|
|
|
|
service = "personalize-runtime"
|
|
session_config = botocore.config.Config(user_agent_extra="langchain")
|
|
client_params["config"] = session_config
|
|
self.client = session.client(service, **client_params)
|
|
|
|
except ImportError:
|
|
raise ModuleNotFoundError(
|
|
"Could not import boto3 python package. "
|
|
"Please install it with `pip install boto3`."
|
|
)
|
|
|
|
def get_recommendations(
|
|
self,
|
|
user_id: Optional[str] = None,
|
|
item_id: Optional[str] = None,
|
|
filter_arn: Optional[str] = None,
|
|
filter_values: Optional[Mapping[str, str]] = None,
|
|
num_results: Optional[int] = 10,
|
|
context: Optional[Mapping[str, str]] = None,
|
|
promotions: Optional[Sequence[Mapping[str, Any]]] = None,
|
|
metadata_columns: Optional[Mapping[str, Sequence[str]]] = None,
|
|
**kwargs: Any,
|
|
) -> Mapping[str, Any]:
|
|
"""Get recommendations from Amazon Personalize:
|
|
https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html
|
|
|
|
Args:
|
|
user_id: str, Optional: The user identifier
|
|
for which to retrieve recommendations
|
|
item_id: str, Optional: The item identifier
|
|
for which to retrieve recommendations
|
|
filter_arn: str, Optional: The ARN of the filter
|
|
to apply to the returned recommendations
|
|
filter_values: Mapping, Optional: The values
|
|
to use when filtering recommendations.
|
|
num_results: int, Optional: Default=10: The number of results to return
|
|
context: Mapping, Optional: The contextual metadata
|
|
to use when getting recommendations
|
|
promotions: Sequence, Optional: The promotions
|
|
to apply to the recommendation request.
|
|
metadata_columns: Mapping, Optional: The metadata Columns to be returned
|
|
as part of the response.
|
|
|
|
Returns:
|
|
response: Mapping[str, Any]: Returns an itemList and recommendationId.
|
|
|
|
Example:
|
|
.. code-block:: python
|
|
|
|
personalize_client = AmazonPersonalize(campaignArn='<my-campaign-arn>' )\n
|
|
response = personalize_client.get_recommendations(user_id="1")
|
|
|
|
"""
|
|
if not user_id and not item_id:
|
|
raise ValueError("One of user_id or item_id is required")
|
|
|
|
if filter_arn:
|
|
kwargs["filterArn"] = filter_arn
|
|
if filter_values:
|
|
kwargs["filterValues"] = filter_values
|
|
if user_id:
|
|
kwargs["userId"] = user_id
|
|
if num_results:
|
|
kwargs["numResults"] = num_results
|
|
if context:
|
|
kwargs["context"] = context
|
|
if promotions:
|
|
kwargs["promotions"] = promotions
|
|
if item_id:
|
|
kwargs["itemId"] = item_id
|
|
if metadata_columns:
|
|
kwargs["metadataColumns"] = metadata_columns
|
|
if self.campaign_arn:
|
|
kwargs["campaignArn"] = self.campaign_arn
|
|
if self.recommender_arn:
|
|
kwargs["recommenderArn"] = self.recommender_arn
|
|
|
|
return self.client.get_recommendations(**kwargs)
|
|
|
|
def get_personalized_ranking(
|
|
self,
|
|
user_id: str,
|
|
input_list: List[str],
|
|
filter_arn: Optional[str] = None,
|
|
filter_values: Optional[Mapping[str, str]] = None,
|
|
context: Optional[Mapping[str, str]] = None,
|
|
metadata_columns: Optional[Mapping[str, Sequence[str]]] = None,
|
|
**kwargs: Any,
|
|
) -> Mapping[str, Any]:
|
|
"""Re-ranks a list of recommended items for the given user.
|
|
https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetPersonalizedRanking.html
|
|
|
|
Args:
|
|
user_id: str, Required: The user identifier
|
|
for which to retrieve recommendations
|
|
input_list: List[str], Required: A list of items (by itemId) to rank
|
|
filter_arn: str, Optional: The ARN of the filter to apply
|
|
filter_values: Mapping, Optional: The values to use
|
|
when filtering recommendations.
|
|
context: Mapping, Optional: The contextual metadata
|
|
to use when getting recommendations
|
|
metadata_columns: Mapping, Optional: The metadata Columns to be returned
|
|
as part of the response.
|
|
|
|
Returns:
|
|
response: Mapping[str, Any]: Returns personalizedRanking
|
|
and recommendationId.
|
|
|
|
Example:
|
|
.. code-block:: python
|
|
|
|
personalize_client = AmazonPersonalize(campaignArn='<my-campaign-arn>' )\n
|
|
response = personalize_client.get_personalized_ranking(user_id="1",
|
|
input_list=["123,"256"])
|
|
|
|
"""
|
|
|
|
if filter_arn:
|
|
kwargs["filterArn"] = filter_arn
|
|
if filter_values:
|
|
kwargs["filterValues"] = filter_values
|
|
if user_id:
|
|
kwargs["userId"] = user_id
|
|
if input_list:
|
|
kwargs["inputList"] = input_list
|
|
if context:
|
|
kwargs["context"] = context
|
|
if metadata_columns:
|
|
kwargs["metadataColumns"] = metadata_columns
|
|
kwargs["campaignArn"] = self.campaign_arn
|
|
|
|
return self.client.get_personalized_ranking(kwargs)
|