组件:知识检索器
知识检索器(Knowledge Retriever)组件允许插件为 LangBot 提供外部知识库检索能力。当用户在 LangBot 中创建外部知识库时,可以选择由插件提供的知识检索器来检索知识。

添加知识检索器组件
单个插件中能添加任意数量的知识检索器,请在插件目录执行命令lbp comp KnowledgeRetriever,并根据提示输入知识检索器的配置。
bash
➜ FastGPTRetriever > lbp comp KnowledgeRetriever
Generating component KnowledgeRetriever...
KnowledgeRetriever name: fastgpt
KnowledgeRetriever description: Retrieve knowledge from FastGPT knowledge bases
Component KnowledgeRetriever generated successfully.
组件 KnowledgeRetriever 生成成功。现在即会在components/knowledge_retriever/目录下生成fastgpt.yaml和fastgpt.py文件,.yaml定义了知识检索器的基础信息和配置参数,.py是该知识检索器的处理程序:
bash
➜ FastGPTRetriever > tree
...
├── components
│ ├── __init__.py
│ └── knowledge_retriever
│ ├── __init__.py
│ ├── fastgpt.py
│ └── fastgpt.yaml
...清单文件:知识检索器
yaml
apiVersion: v1 # 请勿修改
kind: KnowledgeRetriever # 请勿修改
metadata:
name: fastgpt # 知识检索器名称,用于标识该检索器
label:
en_US: FastGPT Knowledge Base # 检索器显示名称,用于显示在 LangBot 的 UI 上,支持多语言
zh_Hans: FastGPT 知识库
ja_JP: FastGPT ナレッジベース
description:
en_US: 'Retrieve knowledge from FastGPT knowledge bases' # 检索器描述,用于显示在 LangBot 的 UI 上,支持多语言。可选
zh_Hans: '从 FastGPT 知识库中检索知识'
ja_JP: 'FastGPT ナレッジベースから知識を取得'
icon: assets/icon.svg # 检索器图标,会被展示在外部知识库配置页面
spec:
config: # 检索器配置参数,用户在创建外部知识库时需要填写这些参数
- name: api_base_url # 参数名称
type: string # 参数类型:string, number, boolean, select
label:
en_US: API Base URL
zh_Hans: API 基础地址
ja_JP: API ベース URL
description:
en_US: 'Base URL for FastGPT API'
zh_Hans: 'FastGPT API 基础地址'
ja_JP: 'FastGPT API ベース URL'
default: 'http://localhost:3000' # 参数默认值
required: true # 是否必填
- name: api_key
type: string
label:
en_US: FastGPT API Key
zh_Hans: FastGPT API Key
ja_JP: FastGPT API キー
description:
en_US: 'API key from your FastGPT instance'
zh_Hans: '从您的 FastGPT 实例获取的 API Key'
ja_JP: 'FastGPT インスタンスから取得した API Key'
default: ''
required: true
- name: search_mode # select 类型参数示例
type: select
label:
en_US: Search Mode
zh_Hans: 搜索模式
ja_JP: 検索モード
description:
en_US: 'The search method to use'
zh_Hans: '使用的搜索方法'
ja_JP: '使用する検索方法'
default: 'embedding'
options: # select 类型参数需要定义选项列表
- name: 'embedding'
label:
en_US: 'Embedding Search'
zh_Hans: '向量搜索'
ja_JP: '埋め込み検索'
- name: 'fullTextRecall'
label:
en_US: 'Full-Text Recall'
zh_Hans: '全文检索'
ja_JP: '全文検索'
- name: using_rerank # boolean 类型参数示例
type: boolean
label:
en_US: Use Re-ranking
zh_Hans: 使用重排序
ja_JP: リランキングを使用
description:
en_US: 'Whether to use re-ranking'
zh_Hans: '是否使用重排序'
ja_JP: 'リランキングを使用するかどうか'
default: false
required: false
execution:
python:
path: fastgpt.py # 检索器处理程序,请勿修改
attr: FastGPT # 检索器处理程序的类名,与 fastgpt.py 中的类名一致配置项格式可参考:插件清单配置项格式
插件处理
默认会生成如下代码(components/knowledge_retriever/<检索器名称>.py),您需要在FastGPT类的retrieve方法中实现知识检索逻辑。完整代码可在langbot-plugin-demo中找到。
python
# Auto generated by LangBot Plugin SDK.
# Please refer to https://docs.langbot.app/en/plugin/dev/tutor.html for more details.
...
class FastGPT(KnowledgeRetriever):
async def retrieve(self, context: RetrievalContext) -> list[RetrievalResultEntry]:
"""Retrieve knowledge from FastGPT knowledge base"""
# 1. 获取配置参数
api_base_url = self.config.get('api_base_url', 'http://localhost:3000')
api_key = self.config.get('api_key')
dataset_id = self.config.get('dataset_id')
search_mode = self.config.get('search_mode', 'embedding')
using_rerank = self.config.get('using_rerank', False)
# 2. 参数验证
if not api_key or not dataset_id:
logger.error("Missing required configuration: api_key or dataset_id")
return []
# 3. 构建 API 请求
url = f"{api_base_url.rstrip('/')}/api/core/dataset/searchTest"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"datasetId": dataset_id,
"text": context.query, # 从 RetrievalContext 获取查询文本
"searchMode": search_mode,
"usingReRank": using_rerank,
}
try:
# 4. 调用外部 API
async with httpx.AsyncClient() as client:
response = await client.post(url, json=payload, headers=headers, timeout=30.0)
response.raise_for_status()
result = response.json()
# 5. 解析响应并转换为 RetrievalResultEntry
results = []
for record in result.get('data', []):
# 合并主要数据和辅助数据作为内容
content_text = '\n'.join([
record.get('q', ''),
record.get('a', '')
]).strip()
# 创建检索结果条目
entry = RetrievalResultEntry(
id=record.get('id', ''),
content=[ContentElement.from_text(content_text)],
metadata={
'dataset_id': record.get('datasetId', ''),
'source_name': record.get('sourceName', ''),
'score': record.get('score', 0.0),
},
# 将相似度分数转换为距离(分数越高,距离越小)
distance=1.0 - float(record.get('score', 0.0)),
)
results.append(entry)
logger.info(f"Retrieved {len(results)} chunks from FastGPT dataset {dataset_id}")
return results
except httpx.HTTPStatusError as e:
logger.error(f"HTTP error from FastGPT API: {e.response.status_code} - {e.response.text}")
return []
except httpx.RequestError as e:
logger.error(f"Request error when calling FastGPT API: {str(e)}")
return []
except Exception as e:
traceback.print_exc()
logger.error(f"Unexpected error during retrieval: {str(e)}")
return []检索上下文
RetrievalContext 包含本次检索的上下文信息:
python
class RetrievalContext(pydantic.BaseModel):
"""知识检索上下文"""
query: str
"""查询文本,用户的检索问题"""检索结果
检索结果需要转换为 RetrievalResultEntry 对象列表,每个对象代表一个检索到的知识块:
python
class RetrievalResultEntry(pydantic.BaseModel):
"""单个检索结果条目"""
id: str
"""结果 ID,唯一标识此条目"""
content: list[ContentElement]
"""结果内容,使用 ContentElement.from_text() 创建文本内容"""
metadata: dict[str, Any]
"""结果元数据,可以包含任意键值对,如来源、分数等"""
distance: float
"""距离分数,表示与查询的相关度(越小越相关)
通常通过 1.0 - similarity_score 计算"""获取配置参数
通过 self.config.get(参数名, 默认值) 获取用户配置的参数值:
python
# 获取字符串参数
api_base_url = self.config.get('api_base_url', 'http://localhost:3000')
# 获取数字参数
limit = self.config.get('limit', 5000)
similarity = self.config.get('similarity', 0.0)
# 获取布尔参数
using_rerank = self.config.get('using_rerank', False)
# 获取 select 参数
search_mode = self.config.get('search_mode', 'embedding')测试检索器
创建完成后,在插件目录执行命令 lbp run,启动调试。然后在 LangBot 中:
- 进入"知识库"页面
- 添加外部知识库
- 选择您的插件提供的知识检索器并填写配置

保存后即可在 LangBot 流水线中选用该知识库。
