文档菜单
文档主页
/
MongoDB地图集
//

语义内核集成入门

在本页上

  • 背景
  • 前提条件
  • 设置环境
  • 将自定义数据存储在阿特拉斯
  • 创建地图集矢量搜索索引
  • 运行矢量搜索查询
  • 回答有关数据的问题
  • 接下来的步骤

注释

本教程使用语义内核Python库语义内核也支持C#。要了解更多信息,请参阅这个C#库

您可以将Atlas Vector Search与Microsoft集成语义内核构建AI应用程序并实施检索增强生成(RAG)。本教程演示如何开始使用带有语义内核的Atlas Vector Search来执行对数据进行语义搜索并构建RAG公司实施。具体来说,您可以执行以下操作:

  1. 设置环境。

  2. 将自定义数据存储在阿特拉斯

  3. 在数据上创建Atlas Vector Search索引。

  4. 对您的数据运行语义搜索查询。

  5. 实施RAG公司使用Atlas Vector Search回答有关数据的问题。

语义内核是一个开源SDK,允许您将各种AI服务和插件与您的应用程序相结合。您可以将语义内核用于各种AI用例,包括RAG公司

通过集成Atlas Vector Search和Semantic Kernel,您可以使用阿特拉斯作为向量数据库,并使用Atlas vector Search实施RAG公司通过检索语义相似的文档根据您的数据。了解更多RAG公司,看见关键概念

要完成本教程,您必须具备以下条件:

  • 阿特拉斯运行MongoDB 6.0.11、7.0.2或更高版本的集群(包括随机对照).

  • OpenAI API密钥。你必须有一个付费的OpenAI帐户,并有信用可用于API请求。

  • 运行Python项目的笔记本,例如科拉布

您必须首先为本教程设置环境。要设置环境,请复制并粘贴以下是笔记本中的代码片段。

1
  1. 在笔记本中运行以下命令,以便在您的环境中安装语义内核。

python-m pip安装语义内核openai
  1. 运行以下代码以导入所需的包:

进口获得通行证,openai
进口语义_内核作为sk公司
semantic_kernel.connectors.ai.open_ai进口(OpenAIChatCompletion,OpenAITextEmbedding)
semantic_kernel.connectors.memory.mongodb_atlas进口MongoDBAtlasMemoryStore
semantic_kernel.core_plugins.text_内存plugin进口文本内存插件
语义_内核.内存.语义_文本_内存进口语义文本记忆
语义内核.prompt_template.input_variable进口输入变量
语义内核.prompt_template.prompt.template_config进口提示模板配置
2

运行以下代码,并在出现提示时提供以下内容:

OPENAI_API_KEY=获取通行证(“OpenAI API密钥:”)
ATLAS_CONNECTION_STRING=获取通行证(“MongoDB Atlas SRV连接字符串:”)

注释

连接字符串应使用以下格式:

mongodb+srv://<用户名>:<密码>@<群集名称><主机名>.mongodb.net

在本节中,您可以初始化内核,哪一个是用于管理您的应用程序的服务和插件。通过内核,您可以配置AI服务,实例化阿特拉斯作为向量数据库(也称为内存存储),并将自定义数据加载到阿特拉斯集群。

将自定义数据存储在阿特拉斯、粘贴和在笔记本中运行以下代码段:

1

运行以下代码来初始化内核。

kernel=sk.kernel()
2

运行以下代码配置OpenAI嵌入模型并本教程中使用的聊天模型,并将这些服务添加到内核中。此代码指定以下内容:

  • OpenAI的文本嵌入-ada-002作为用于将文本转换为向量嵌入。

  • OpenAI的gpt-3.5涡轮增压作为用于生成响应的聊天模型。

chat_service=OpenAIChatCompletion(
服务id=“聊天”,
ai模型id=“gpt-3.5-涡轮”,
api_key=OPENAI_api_key
)
embedding_service=OpenAITextEmbedding(
ai模型id=“文本嵌入-ada-002”,
api_key=OPENAI_api_key
)
kernel.add_service(聊天服务)
kernel.add_service(嵌入服务)

运行以下代码以实例化阿特拉斯作为内存存储和将其添加到内核中。此代码建立与您的阿特拉斯并指定以下内容:

  • 语义内核db作为阿特拉斯用于存储文档的数据库。

  • 向量_索引作为用于运行语义搜索查询的索引。

它还进口插件打电话文本内存插件,它提供了一组本机函数帮助您在内存中存储和检索文本。

mongodb_atlas_memory_store=MongoDBAtlasMemoryStore(
connection_string=ATLAS_connection_string,
数据库名称=“semantic_kernel_db”,
索引名称=“矢量_索引”
)
memory=语义文本内存(
存储=mongodb_atlas_memory_store,
embeddings_generator=嵌入服务
)
kernel.import_plugin_from_object(文本内存插件(内存),“文本内存插件”)
4

此代码定义并运行一个函数来填充semantic_kernel_db.test测试收集一些样本文档。这些文件包含个性化数据法学硕士最初无权访问。

异步 定义 人口内存(_M)(kernel:sk.kernel)->以下为:
等待内存保存信息(
集合=“测试”,身份证件=“1”,文本=“我是开发人员”
)
等待内存保存信息(
集合=“测试”,身份证件="2",文本=“我两年前开始使用MongoDB”
)
等待内存.保存信息(
集合=“测试”,身份证件="3",文本=“我正在使用带有语义内核的MongoDB矢量搜索来实现RAG”
)
等待内存.保存信息(
集合=“测试”,身份证件="4",文本=“我喜欢咖啡”
)
打印(“正在填充内存…”)
等待populate_memory(内核)
打印(内核)
正在填充内存。。。
plugins=KernelPluginCollection(plugins={'TextMemoryPlugin':内核插件(name='TextMemoriyPlugin',description=None,functions={'recall’:内核函数FromMethod(name='ask',description='要检索的信息',default_value=None,type_='str',is_required=True,type_object=<class'str'>),内核参数元数据,KernelParameterMetadata(name='relevance',description='相关性得分,从0.0到1.0;1.0表示完全匹配',default_value=0.75,type_='float',is_required=False,type_object=<class'float'>),KernelParameterMetadata(name='limit',description='要调用的相关内存的最大数量',default_value=1,type_='int',is_required=False,type_object=<class'int'>)],is_prompt=False,is_asynchronous=True,return_parameter=KernelParameterMetadata(name='return',description='',default_value=None,type_='str',is_required=True,type_object=None),方法=<绑定方法TextMemoryPlugin.recall of TextMemory插件(memory=SemanticTextMemory())>,stream_method=None,“save”:KernelFunctionFromMethod(metadata=KernelFunctionMetadata(name='save',plugin_name='TextMemoryPlugin',description='将信息保存到语义内存',parameters=[KernelParameterMetadata,name='text',destition='要保存的信息',default_value=None,type_='str',is_required=True,type_object=<class'str'>),KernelParameterMetadata(name='key',description='与信息关联的唯一键。',default_value=None,type_='str',is_required=True,type_object=<class'str'>),KernelParameterMetadata(name='collection',description='保存信息的集合',default_value='generic',type_='str',is_required=False,type_object=<class'str'>)],is_prompt=False;is_asynchronous=True,return_parameter=KernelParameterMetadata(name='return',description='',default_value=None,type_='',is_required=True,type_object=None),方法=<绑定方法TextMemoryPlugin.save of TextMemory插件(memory=SemanticTextMemory())>,stream_method=None)})},“text-embedding-ada-002”:OpenAITextEmbedding(ai_model_id='text-embeadding-ada-1002',service_id='ext-embedding-ada-002',client=<openai.AsyncOpenAI object at 0x7999971c8fd0>,ai_modell_type=<OpenAIModelTypes.embedding:“embedding”>,prompt_tokens=32,completion_tokens=0,total_tokens=32)}ai_service_selector=<semantic_kernel.services.ai_service选择程序。位于0x7999971cad70>retry_mechanism=PassThroughWithoutRetry()function_invoking_handlers={}的AIServiceSelector对象

提示

运行示例代码后,您可以查看向量嵌入在Atlas UI中通过导航到semantic_kernel_db.test测试集群中的集合。

要在向量存储上启用向量搜索查询,在上创建Atlas矢量搜索索引semantic_kernel_db.test测试收藏。

要创建Atlas Vector Search索引,必须项目数据访问管理员或更高的访问权限阿特拉斯项目。

1
  1. 如果尚未显示,请选择包含来自的所需项目 组织机构菜单在中导航栏。

  2. 如果尚未显示,请选择所需的项目来自项目导航栏中的菜单。

  3. 如果集群页面不是已显示,单击数据库在侧边栏中。

2
  1. 单击集群的名称。

  2. 单击地图集搜索选项卡。

  1. 点击创建搜索索引

  2. 低于地图集矢量搜索,选择JSON编辑器然后单击下一步

  3. 数据库和集合部分,查找语义核心数据库数据库,然后选择测试收藏。

  4. 索引名称字段,输入向量_索引

  5. 用以下索引替换默认定义定义,然后单击下一步

    此索引定义指定对以下字段进行索引在的索引中矢量搜索类型:

    • 嵌入字段作为矢量类型。这个嵌入领域包含使用OpenAI创建的嵌入文本嵌入-ada-002嵌入模型。索引定义指定1536矢量尺寸和使用度量相似性余弦

    1{
    2 “字段”以下为: [
    {
    4 “类型”以下为: “矢量”,
    5 “路径”以下为: “嵌入”,
    6 “numDimensions”以下为: 1536,
    7 “相似性”以下为: “余弦”
    8 }
    9 ]
    10}
4

将显示一个模式窗口,让您知道正在构建索引。

5

建立索引大约需要一分钟。尽管如此生成状态列读取首字母同步。建造完成后状态读取活动

一次阿特拉斯构建索引,可以运行矢量搜索查询您的数据。

在笔记本中,运行以下代码以执行基本语义搜索字符串我的职称是什么?。打印次数最多相关文件和相关性得分之间01

结果=等待内存.搜索(“测试”,“我的职称是什么?”)
打印(f“检索到的文档:{结果[0].text},{结果[0].相关性}")
检索到的文档:我是开发人员,0.8991971015930176

本节显示了一个示例RAG公司实施使用Atlas Vector Search和语义内核。现在您已经使用了Atlas Vector Search要检索语义相似的文档,请运行以下代码示例提示法学硕士根据这些文件回答问题。

以下代码定义了促使指示法学硕士将检索到的文档用作查询的上下文。在本例中,您将提示法学硕士使用示例查询我什么时候开始使用MongoDB的?。因为你增加了的知识库法学硕士使用自定义数据,聊天模型能够生成更准确的,上下文软件响应。

服务id=“聊天”
settings=kernel.get_service(service_id).instance_prompt_execution_settings(
服务id=服务id
)
提示_模板="""
根据给定的上下文回答以下问题。
问题:{{$input}}
上下文:{{$Context}}
"""
chat_prompt_template_config=提示模板配置(
execution_settings=设置,
输入变量=[
InputVariable(名称=“输入”),
InputVariable(名称=“上下文”)
],
template=提示模板
)
prompt=内核.create_function_from_prompt(
函数_名称=“RAG”(RAG),
插件名称=“文本内存插件”,
prompt_template_config=聊天室提示模板配置,
)
问题=“我什么时候开始使用MongoDB的?”
结果=等待内存.搜索(“测试”,问题)
retrieved_document=结果[0].text(文本)
回答=等待提示invoke(
kernel=内核,输入=问题,上下文=检索的文档
)
打印(回答)
您两年前开始使用MongoDB。

MongoDB还提供以下开发人员资源:

提示

另请参阅:

 LlamaIndex集成入门