如果把AI看作一个学生,那么有个最大的缺点,就是只掌握了学习过的知识(Trainning的材料),如果问AI一些知识范围外的问题,或者具有实时性的问题,AI无法回答。
例如,问AI当天的天气情况,AI不能给出答案:

但是,我们可以给AI接入一个搜索引擎,让AI可以自主去网上搜索相关知识,即AI的Grounding功能。
基于google search的Grounding
GCP直接提供基于google search的Grounding,可以在console直接启用,也可以在code中使用。
console
Console使用非常简单,在右边工具栏打开google search开关即可:

现在提问,AI就可以给出适时信息的回答,以及答案的来源:

code
Sample Code如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import base64 import vertexai from vertexai.preview.generative_models import GenerativeModel, Part, SafetySetting, Tool from vertexai.preview.generative_models import grounding
def generate(): vertexai.init(project="ai-demo-440003", location="us-central1") model = GenerativeModel( "gemini-1.5-flash-002", tools=tools, ) responses = model.generate_content( ["""今天北京的天气怎么样"""], generation_config=generation_config, safety_settings=safety_settings, stream=True, )
for response in responses: if not response.candidates or not response.candidates[0].content.parts: continue print(response.text, end="")
generation_config = { "max_output_tokens": 8192, "temperature": 1, "top_p": 0.95, }
safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=SafetySetting.HarmBlockThreshold.OFF ), ]
tools = [ Tool.from_google_search_retrieval( google_search_retrieval=grounding.GoogleSearchRetrieval() ), ]
generate()
|
Grounding相关的code如下:
- 定义一个tools,内容为Grounding
1 2 3 4 5
| tools = [ Tool.from_google_search_retrieval( google_search_retrieval=grounding.GoogleSearchRetrieval() ), ]
|
- 在模型定义中除了基础模型,加上tools
1 2 3 4
| model = GenerativeModel( "gemini-1.5-flash-002", tools=tools, )
|
自定义Grouding
有些场景下,我们希望AI能根据指定内容回答,把Grounding的范围封闭在一个自定义的数据集,而不是开放的搜索引擎(例如客服)。Gemini同样也提供此类型的Grounding。
建立数据集
Gemini支持多种数据集(包括结构化、非结构化数据,网站、app应用等)。本文以非结构化数据为例,示范一个简单的pdf文件(demo.pdf),内容为姓名和学号的对应:

将此文件上传到一个GCS的bucket:

进入Agent Builder,选择Data Store:

点击Create Data Store开始创建:

选择Cloud Storage,根据上传的数据类型做对应选择并定位到对应的bucket,如果数据会时常更新,可以选择Periodic方式(周期可选择1、3、5天),这里为了测试直接选择One Time:

最后选择区域和给Data Store命名即可:

完成创建如下,此处需要记下Location和ID共AI调用:

需要稍等后台处理数据(embedding),根据数据量会需要不同的时间。
使用私有数据集进行Grounding
首先文档里有一处错误:

实际在console还没有整合此功能:

仍然需要通过code来实现,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import base64 import vertexai from vertexai.preview.generative_models import GenerativeModel, Part, SafetySetting, Tool from vertexai.preview.generative_models import grounding
def generate(): vertexai.init(project="ai-demo-440003", location="us-central1") model = GenerativeModel( "gemini-1.5-flash-002", tools=tools, ) responses = model.generate_content( ["""李四的学号是多少"""], generation_config=generation_config, safety_settings=safety_settings, stream=True, )
for response in responses: if not response.candidates or not response.candidates[0].content.parts: continue print(response.text, end="")
generation_config = { "max_output_tokens": 8192, "temperature": 1, "top_p": 0.95, }
safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=SafetySetting.HarmBlockThreshold.OFF ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=SafetySetting.HarmBlockThreshold.OFF ), ]
tools = [ Tool.from_retrieval( grounding.Retrieval( grounding.VertexAISearch( datastore='grounding-ds-001_1735128749407', project="ai-demo-440003", location='global' ) ) ) ]
generate()
|
运行结果如下:

AI根据创建的数据集正确回答出问题。
对比使用google search的Grounding,可以看到主要的区别在tools的定义:
1 2 3 4 5 6 7 8 9 10 11
| tools = [ Tool.from_retrieval( grounding.Retrieval( grounding.VertexAISearch( datastore='grounding-ds-001_1735128749407', project="ai-demo-440003", location='global' ) ) ) ]
|
这里不再是直接引入google search,而是用自己创建的数据集替代,可以更自由的掌控AI生成的结果。
小结
通过Grounding可以让AI更加个性化,在一些特定场景,能帮用户打造自己的AI。Grounding的使用很简单,希望能有帮助