思路
- 调用谷歌搜索 API,获取搜索结果
- 将前3条搜索结果作为 RAG 的数据源
- 将用户输入的问题和搜索结果转换成 prompt
- 将 prompt 输入到LLM中,生成结果
流程图
准备事项
1. 准备Google搜索API
- 建立Custom Search Engine
为了得到 search engine ID,需要先建立 Custom Search Engine。
https://programmablesearchengine.google.com/controlpanel/all
接着我们还需要获取 API Key,这个 API Key 用于调用Google Custom Search API。
https://developers.google.com/custom-search/v1/overview?hl=zh-cn
获取到 API Key 和 search engine ID 后,我们可以通过 curl 测试一下。
1 | curl --location 'https://www.googleapis.com/customsearch/v1?key=<api_key>&cx=<search_engine_id>&q=<query> |
测试成功之后我们可以通过 langchain 的工具库来调用 Google Custom Search API。
1 | import os |
2. 如何抓取页面正文内容,并尽可能减少的垃圾内容
我们可以使用BeautifulSoup库来解析HTML页面,然后提取页面的标题和正文内容。
这里我们只提取了p
标签的内容,如果提取所有文本内容,可能会包含一些垃圾内容,比如广告、导航等。
(但是这里确实是一个很重要需要优化的点,如何更好的获取的文章正文,我们后续再深入研究,本次只追求快速落地原型)
1 | def get_title_and_text_from_url(url: str, length: int) -> tuple[str, str]: |
3. 调试一个稳定可靠的prompt模板
测试了几个模板,这个效果暂且还算稳定,后续我们可以再优化。
1 | main_prompt = f""" |
4. 输入大语言模型
用户问题经过搜索引擎搜索后,我们将问题和搜索结果转换成 prompt,然后输入到大语言模型中,生成结果。
(至于如何获取到OPENAI_API_KEY,如果你没有美国信用卡,推荐使用Fomepay,好用👍)
1 | import os |
成果
finally,我们实现了一个通过RAG技术增强谷歌搜索能力的原型。
在测试的过程中发现,这个原型还是有一些问题,比如搜索结果的质量不高,正文提取不准确等。
后续我们可以继续优化,比如提取更准确的正文内容,优化prompt模板等。