Add Amazon Bedrock Embedding function#1361
Conversation
Reviewer ChecklistPlease leverage this checklist to ensure your code review is thorough before approving Testing, Bugs, Errors, Logs, Documentation
System Compatibility
Quality
|
beggers
left a comment
There was a problem hiding this comment.
This is sick, thanks for expanding Chroma's functionality. I have a few notes but once we get them sorted I will be very happy to merge this in.
| Returns: | ||
| Embeddings: The embeddings for the texts. | ||
|
|
||
| Example: |
There was a problem hiding this comment.
Could we move this example into the docstring for the class instead of its __call__ method?
| embeddings.append(self._invoke(text)) | ||
| return embeddings | ||
|
|
||
| def _invoke( |
There was a problem hiding this comment.
I don't think we need __call__() to be a thin wrapper around _invoke(). Would you mind moving this logic into __call__ directly?
| contentType=content_type, | ||
| ) | ||
| embedding = json.load(response.get("body")).get("embedding") | ||
| except Exception as e: |
There was a problem hiding this comment.
Could we remove this and the re-throw? I want clients to be able to handle exceptions differently depending on the type of exception, e.g. trying again in the case of a timeout.
| self, | ||
| profile_name: Optional[str] = None, | ||
| region: Optional[str] = None, | ||
| model_name: str = "amazon.titan-embed-text-v1", |
There was a problem hiding this comment.
I think there's a cleaner API boundary here and I'd like to hear your thoughts.
This constructor could accept a boto3.Session and optional kwargs to pass into the client() call. That way we give users full access to the configuration options for both their Session and their client, and we have less code to maintain (we don't need to read from os.environ for example). I may be missing something here -- is there a reason we need to accept these and construct the Session ourselves? If not could we accept a Session and config kwargs?
There was a problem hiding this comment.
I'm okay with just passing a boto3.Session and necessary kwargs for the client() call instead of creating a session within the class.
I don't have a specific reason to create a boto3.Session inside the class. I tried to align with the existing codes. Looking at the other classes creates a client internally, and HuggingFaceEmbeddingFunction creates requests.Session within the class.
There was a problem hiding this comment.
btw, do you think we should support all the possible config kwargs as much as possible?
Looking at the boto3 document, I think most of the kwargs are covered by the session, so we may need to pass api_version, use_ssl, verify, and endpoint_url, at least. Or, we may postpone introducing those arguments at this moment.
There was a problem hiding this comment.
Tentatively, I removed most of the redundant arguments without adding client-specific arguments. Let me know your thoughts on it.
eedf49d
There was a problem hiding this comment.
This is already looking way better -- thank you!
One more small ask and then we can check it in: could we have the constructor accept **kwargs and pass them directly to the client() we create? That would give us three wins:
1 - We don't have to manage the retry_config which I imagine some folks will want control over.
2 - Users can specify whatever they want to override in their Session config without us needing to make any code changes.
3 - We don't need to import boto3 in this codebase anymore.
There was a problem hiding this comment.
Fair point. Fixed by using **kwargs a53e415
- Remove unnecessary function - Remove re-throw an exception - Move comment to the right under the class
|
@chezou, it would be really nice if you can raise a PR against the docs repo - https://github.com/chroma-core/docs/pulls to update the embedding functions and how to use them - https://docs.trychroma.com/embeddings |
| >>> texts = ["Hello, world!", "How are you?"] | ||
| >>> embeddings = bedrock(texts) | ||
| """ | ||
|
|
There was a problem hiding this comment.
@chezou, it would be nice to check if boto3 package is installed and if not guide to user with appropriate error message. Check other EFs as ref.
There was a problem hiding this comment.
I originally did checking it, but I followed @beggers suggestion to remove the dependency of boto3 from chroma itself.
See also #1361 (comment)
| ) | ||
|
|
||
| def __call__(self, input: Documents) -> Embeddings: | ||
| import json |
There was a problem hiding this comment.
Do we need to import json here instead of at top-level?
|
@chezou, on second thought it'd be absolutely awesome if you can also add the JS client equivalent of the EF. |
|
@tazarov I made a PR for the docs repo. Please have a look when your team has a chance chroma-core/docs#204 For JS client, I'm not familiar with the JS AWS client, so it may take a while. [edit] I made a PR for JS client #1659 |
https://docs.aws.amazon.com/bedrock/latest/userguide/embeddings.html
Description of changes
Test plan
pytestfor python,yarn testfor jsTested locally by given profile_name with appropreate
~/.aws/configDocumentation Changes
Written docstrings as much as possible.