打造智能研究員:一步步教你用AI搜索和解析信息指南
其中一个最成功的例子是AI包装器Perplexity。它帮助用户研究并找到相关信息,然后由大型语言模型总结并解释,给出用户查询的答案。
本文将解释如何创建一个属于你自己的AI助手,让它从网上找到相关的内容并给出恰当的回答。
构建可靠的文字转SQL管道指南:一步一个脚印的指南,第一部分我们如何开发可靠的文字转SQL方案为此,我们为客户提供可靠的文字转SQL方案。 技术栈这里有许多工具,但我为这个博客用了下面这些技术栈:
- DSPy — 一个内置提示优化功能的AI框架。它简单、模块化且易于使用。更多详情请访问这里。
- Exa — 提供了一个易于使用的API来搜索网络、查找相关信息并传递给大语言模型。
Exa 是如何解释他们正在构建搜索系统的过程——图片来自他们的博客([https://exa.ai/blog/how-to-build-nextgen-search])
搜索引擎通过索引互联网上的信息来工作。简单来说,它们就像从网页和链接中检索信息的工具。它们的不同之处在于它们索引的效果。这就是它们的主要“不同之处”。例如,Perplexity API 和 Exa 以不同的方式组织和检索网络内容。
下面是一个简化版的Exa底层索引和搜索技术的简化说明。
Exa 是一个结合了神经网络和关键词搜索技术的搜索引擎,它将两者结合起来。它不仅仅依赖于关键词匹配,还利用文本的向量表示(即嵌入)来进行语义搜索,在其索引的网页内容中搜索。这使它能够返回即使不完全包含查询词,但仍然与查询语义相关的结果。
核心的方法是一种叫做链接预测的技术,该模型基于查询和索引文档的语义内容预测哪些文档或链接与查询最为相关。这种方法对于用户不确定使用哪些确切术语时特别有用,特别是在处理不明确或探索性查询时。
不过,在精确匹配很重要的情况下,例如专有名词、技术术语或已知关键词,Exa也支持传统的关键词查找。这两种搜索方式都集成在一个名为Auto Search的系统中,该系统使用一个轻量级分类器来决定将查询导向神经搜索、关键词搜索,或者两者一起处理。
这种混合配置使得Exa能够处理各种查询类型,同时平衡语义相关性和准确性。
我们已经为13多家客户提供了服务,从初创公司到大企业,需要帮助处理AI相关问题吗?请点击下面的链接了解更多信息
点击这里
想知道如何使用Exa的API(应用程序接口)吗?
现在来看看如何用这个API来搜索相关的信息,这部分很有趣。API提供了三个关键的搜索方法,
Exa 在网上找到你正在寻找的内容,具有以下三大核心功能:
搜索: 使用 Exa 的嵌入式搜索或像 Google 一样的关键词搜索来搜索网页。
from exa_py import Exa
exa = Exa('YOUR_EXA_API_KEY')
results = exa.search_and_contents(
"Find blogs by FireBirdTech",
type="auto",# 类型为 'auto',# 可以是 'neural' 或 'keyword',根据你的偏好来
numResults=30, # 返回多少个结果,比如30个
)
print(results)
内容:
获取来自Exa的干净、最新的已解析HTML。
from exa_py import Exa
exa = Exa('YOUR_EXA_API_KEY')
# the following code crawls and gets the content of the specified webpage
results = exa.get_contents(
urls=["https://firebird-technologies.com"],
text=True
)
print(results)
找找类似的链接
根据这个链接,搜索并返回相似的页面。
from exa_py import Exa
exa = Exa('YOUR_EXA_API_KEY')
# 获取页面内容
results = exa.find_similar_and_contents(
url="www.firebird-technologies.com",
text=True
)
print(results)
搜索功能既简单又易于使用,要全面了解API的所有功能,可以查看Exa的API参考文档这里
AI研究员的角色设计展示系统是如何运作的流程图
我设计了一个三步流程,这样研究人员就可以同时使用多个API。具体操作如下:
1. API 路由器(API Router): 这一部分决定使用这三个 API 中的哪一个来处理查询。大多数查询只需要搜索 API 即可,但也提供获取内容或查找相似链接的功能,使操作更灵活。
2.API代理程序: 有三个代理程序,每个都配备了特别的提示,最适合与一个特定的API配合。
3. 回答层: 这里就是所有东西汇总的地方。系统会把信息汇总分析,给出用户一个最终答案。
需要有人能为你的团队开发AI解决方案吗?点击下面的链接:__ https://tally.so/r/3x9bgo
API 路由
以下为API路由器的指令
class api_router(dspy.Signature):
"""你是一个智能路由,负责决定调用哪些Exa API来回答用户的问题。选择最少的API来产生相关且有用的结果。
可用的三个API有:
search: 在寻找基于主题、关键词或研究问题的新文档时使用此API。
contents: 当用户提供了已知URL并需要全文、摘要或高亮时使用此API。
findSimilar: 当用户提供一个URL并需要找到相关链接时使用此API。
如果需要,您也可以将API按顺序组合使用,尽量使用最少数量的调用。
返回API的选择列表,并为每个API提供简短说明。
示例:
查询:总结这篇论文:https://arxiv.org/abs/2307.06435
api_selection: contents
selection_reason: 获取提供的论文的摘要和高亮。
查询:在可扩展的大规模语言模型训练方面,最新的趋势是什么?
api_selection: search
查询:找到与此文章相关的博客文章:[URL]
api_selection: findSimilar
selection_reason: 根据URL找到相关的内容。
查询:给我关于小样本学习新论文的摘要
api_selection: search, contents
selection_reason: 用户想要关于小样本学习新论文的摘要。
仅当提供URL并且用户希望找到相关链接时才使用findSimilar。
"""
query = dspy.InputField(description="用户想要搜索的查询")
api_selection = dspy.OutputField(description="用于查询的API - search, contents 或 findSimilar")
selection_reason = dspy.OutputField(description="API选择的原因")
# 使用链式思维引导提示
api_router_agent = dspy.ChainOfThought(api_router)
response = api_router_agent(query = "查找FireBirdTech的相关博客文章")
程序响应
API路由器的回应,理由和选择用于提供更佳的答案,但所需输出只是api_selection。
API代理
这三个 API 代理有类似的结构,它们接收 Exa 的 Python 文档。
他们有一个输入(查询请求)和一个输出(设置)。
class search_api_agent(dspy.Signature):
"""
你是一个智能API助手,负责生成调用Exa `/search`端点的结构化设置。
你的任务是解读用户的查询和意图,并返回一个完整的Python字典,代表请求的JSON负载。`/search`端点的参数如下:
**基本参数**
以下信息以**表格**格式展示,便于理解:
| **输入参数** | **类型** | **描述** | **默认值** |
|----------------------------|----------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|
| `query` | `str` | 输入查询字符串。 | 必填 |
| `text` | `Union[TextContentsOptions, Literal[True]]` | 如果提供,结果中将包含内容的全文。 | 无 |
| `highlights` | `Union[HighlightsContentsOptions, Literal[True]]` | 如果提供,结果中将包含内容的摘要部分。 | 无 |
| `num_results` | `Optional[int]` | 要返回的搜索结果数量。 | 10 |
| `include_domains` | `Optional[List[str]]` | 搜索时要包含的域名列表。 | 无 |
| `exclude_domains` | `Optional[List[str]]` | 搜索时要排除的域名列表。 | 无 |
| `start_crawl_date` | `Optional[str]` | 结果中仅包含该日期之后抓取的链接。 | 无 |
| `end_crawl_date` | `Optional[str]` | 结果中仅包含在该日期之前抓取的链接。 | 无 |
| `start_published_date` | `Optional[str]` | 结果中仅包含发布日期在该日期之后的链接。 | 无 |
| `end_published_date` | `Optional[str]` | 结果中仅包含发布日期在该日期之前的链接。 | 无 |
| `type` | `Optional[str]` | 搜索类型可以是 "keyword" 或 "neural"。 | "auto" |
| `category` | `Optional[str]` | 搜索时要重点关注的数据类别(例如:公司、研究论文、新闻等)。 | 无 |
---
**你的任务:**
给定用户的查询和任何已知的偏好(例如:更偏好研究论文、只想要摘要、排除新闻等),生成一个兼容JSON的Python字典,表示POST请求到`/search`的请求体。
💡 示例输入:
> 查询: "最新LLM能力的发展"
✅ 示例输出:
```python
{
"query": "最新LLM能力的发展",
"type": "auto",
"category": "研究论文",
"numResults": 25,
"contents": {
"text": True,
"summary": True,
"highlights": False,
"livecrawl": "fallback",
"livecrawlTimeout": 10000,
"subpages": 0,
"extras": {
"links": 0,
"imageLinks": 0
}
}
}
summary始终设为True,除非另有说明
"""
query = dspy.InputField(description="用户希望搜索的查询")
api_settings = dspy.OutputField(description="搜索API的设置,以Python字典格式输出")
# 使用ChainOfThought提示以获得更好的回应
search_api_AI = dspy.ChainOfThought(search_api_agent)
API代理返回API的配置,你可以将这些配置以字典形式提供给API以获得响应。
其他的两个构建方式一样,唯一不同的是所使用的API文档。
回答助手
class answer_summarize_analyze(dspy.Signature):
"""
你是一个研究助理AI。你的任务是阅读一组网站内容,并根据用户的查询生成有用的摘要。
### 用户查询:
{query}
### 源数据:
{web_data}
---
指令:
- 分析提供的所有web_data。
- 仅关注与查询相关的部分。
- 提供简洁明了的总结。
- 如果涉及多个博客或来源,请清晰地分组或列出。
- 不要包括无关的元数据(如评分、加载GIF等)。
- 当有帮助时,提供到原始帖子的链接。
- 保持语气准确、中立且专业。
仅用分析、总结和回答用户查询!
---
### 👇 使用你提供的输入示例:
**查询:**
> 查找有关FireBirdTech的博客文章并告诉我它们包含的内容。
**AI响应:**
以下是有关FireBirdTech的一些近期博客文章:
1. **[Jaybird 5.0.5 发布](https://www.firebirdnews.org/jaybird-5-0-5-released/)**
一个新的Jaybird JDBC驱动程序修复了一些问题并做了一些小的改进:
- 修复了`NUMERIC`和`DECIMAL`列的精度问题。
- 改进了对自动增量列和元数据查询的支持。
- 添加了对Firebird 5.0功能的支持,并更新了Java版本兼容性。
2. **[Firebird Monitor Tool – 版本2](https://www.firebirdnews.org/real-time-firebird-monitor-for-firebird-server-2-5-3-0-4-0-5-0-2/)**
一个具有跟踪和审核功能的实时数据库监控工具。截至2024年6月提供10%的折扣。
3. **[Database Workbench 6.5.0 发布](https://www.firebirdnews.org/database-workbench-6-5-0-released/)**
新功能包括对Firebird 5、MySQL 8.3和PostgreSQL 16的支持。新引入了一个SQLite模块来增强兼容性。
4. **[DBD::Firebird Perl 扩展 v1.38](https://www.firebirdnews.org/perl-extension-dbdfirebird-version-1-38-is-released/)**
更新包括支持Firebird的BOOLEAN数据类型以及对较旧版本Perl和Firebird的改进兼容性。
5. **[Kotlin Multiplatform Firebird SQL 客户端库](https://www.firebirdnews.org/firebird-sql-client-library-for-kotlin-multiplatform/)**
一个在JVM、Android和原生环境中访问Firebird数据库的客户端库。
6. **[IBProvider v5.37 发布](https://www.firebirdnews.org/release-of-ibprovider-v5-37/)**
一个具有改进错误消息处理、ICU更改和线程池改进的新版本Firebird数据库提供程序。
7. **[Firebird Export Tool](https://www.firebirdnews.org/firebird-export/)**
一个开源工具,可将Firebird数据库导出为CSV和JSON等格式,并支持选择性导出和Blob数据处理。
8. **[RedExpert 2024.04 发布](https://www.firebirdnews.org/redexpert-2024-04-has-been-released/)**
一个用于管理和开发Firebird数据库的新版本RedExpert工具。
9. **[libpthread 兼容性问题与Firebird 2.5](https://www.firebirdnews.org/libpthread-compatibility-problem-with-firebird-2-5/)**
在Linux上发现较新的libpthread版本与Firebird 2.5之间的兼容性问题,建议修补或升级版本。
10. **[Hopper Debugger v2.3 发布](https://www.firebirdnews.org/stored-routine-debugger-hopper-v2-3-released/)**
一个用于存储过程的调试工具,具有对Firebird 5的支持和一些常规错误修复。
"""
query = dspy.InputField(description="用户想要获取的内容的查询")
web_data = dspy.InputField(description="用户想要获取的内容的网络数据")
answer = dspy.OutputField(description="对用户查询的回答")
answer_summarize_analyze = dspy.ChainOfThought(answer_summarize_analyze)
response = answer_summarize_analyze(query = "查找有关FireBirdTech的博客文章并告诉我它们包含的内容", web_data = result.results[1].text)
来自回答助手的回复,类似于Perplexity这样的工具,它会给出来源和答案。
构建“Auto-Analyst”——一个数据智能分析的人工智能系统的技术指南:www.firebird-technologies.com 将所有组件结合在一起现在我们只需把所有东西整合到一个系统中,来回答用户的问题。
class research_agent(dspy.Module):
"""一个研究代理人,它将查询路由到适当的API并返回分析结果"""
def __init__(self):
# 初始化API组件
self.api_router = api_router_agent # 路由查询到适当的API
self.search_api = search_api_AI # 处理搜索API请求
self.contents_api = content_api_AI # 处理内容API请求
self.find_similar_api = find_similar_api_AI # 处理相似性搜索API请求
self.answer_summarize_analyze = answer_summarize_analyze # 分析结果
def forward(self, query):
"""
通过适当的API处理查询并返回分析结果
Args:
query (str): 用户的查询
Returns:
str: 基于API结果分析和总结的答复
"""
# 路由查询以确定要使用的API
route = self.api_router(query=query)
api_result = []
for api_selection in route.api_selection.split(','):
print(api_selection)
if "search" in api_selection:
# 处理搜索API请求
api_settings = self.search_api(query=query)
# 将API设置字符串转换为字典
api_settings = api_settings.api_settings
api_settings = json.loads(api_settings.replace("'", '"').replace("True", "true").replace("False", "false"))
print(api_settings)
api_result.append(exa.search_and_contents(**api_settings))
elif "contents" in api_selection:
# 处理内容API请求
api_settings = self.contents_api(query=query)
api_settings = api_settings.api_settings
api_settings = json.loads(api_settings.replace("'", '"').replace("True", "true").replace("False", "false"))
print(api_settings)
api_result.append(exa.get_contents(**api_settings))
elif "findSimilar" in api_selection:
# 处理相似性搜索API请求
api_settings = self.find_similar_api(query=query)
api_settings = api_settings.api_settings
api_settings = json.loads(api_settings.replace("'", '"').replace("True", "true").replace("False", "false"))
print(api_settings)
api_result.append(exa.find_similar(**api_settings))
# 收集并分析结果
answers = []
for result in api_result:
answers.append(result)
# 生成最终分析答复
answer = self.answer_summarize_analyze(query=query, web_data = str(answers))
return answer.answer
researcher = research_agent()
result = researcher(query="自2020年以来,特斯拉的股票表现如何?请给我最新的文章和新闻稿链接")
由我们的AI研究员生成的回答,附带来源哦!
这里是系统在使用类似的链接接口
查找与提到的文章相关的文章的响应。
哦,感谢您的阅读!接下来,我打算给这个系统加个‘深入研究’功能哦。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章