Danswer 快速指南:不到15分钟打造您的企业级开源知识问答系统

本文介绍了开源项目Danswer,一个强大的企业知识库系统,支持自然语言提问和可靠答案,具有本地部署、数据隐私保护和多种LLM模型集成的特点。重点讨论了其Connectors连接器的优势及实现原理,包括使用DistilBert微调和双编码器模型进行搜索和生成答案的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、写在前面

至于为什么需要做企业知识库,知识问答检索系统,以及现有GPT模型在企业应用中存在哪些劣势,今天在这里就不再赘述了,前面介绍其他构建知识库案例的文章中基本上都有讲过,如果您有兴趣可以去翻翻历史文章来了解。

今天就直接进入主题,介绍一款还不错的开源项目 Danswer,相较于其他开源的产品来说,从 Danswer 的设计上来来看确实存在一定的优势和可以参考的地方,其中最值得一提的还属 Connectors 连接器。目前官方已经提供了 12 中内置的连接器,连接器可以很方便的将任何你需要加入知识检索和问答的文档资料添加到向量数据库中进行索引。

二、Danswer 基本介绍

Danswer 允许您针对内部文档提出自然语言问题,并获得由源材料中的引用和参考文献支持的可靠答案,以便您始终可以信任您得到的结果。您可以连接到许多常用工具,例如 Slack、GitHub、Confluence 等。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=NWIyMDlhZjVjNTI0NzJlNGYxMTFjZDUzYmUyMGZiZDRfcnZ4c3RCM0hVUWVxSXpNSmdOVVhkdXZQWlhpWFdVNWtfVG9rZW46SGJyc2I5ckJpb09Lc1p4cGpRMWNHZFNwbmVoXzE2OTIzNDgzOTg6MTY5MjM1MTk5OF9WNA

2.1、Danswer 有哪些优势 ?

  • 它是完全开源的(MIT 许可证)并且免费使用,完全可以本地部署,数据隐私安全。

  • 允许您即插即用不同的 LLM 模型,例如 GPT、HuggingFace、GPT4All、Llama cpp,甚至自定义自托管模型

  • 具有开箱即用的关键功能,如文档访问控制、前端 UI、管理仪表板、轮询文档更新和灵活的部署选项。

  • Slack、GitHub、GoogleDrive 等12种其他工具的连接器的不错列表。

  • 直接提问,无需打开任何文档即可解答您的问题,由GPT-4(或您选择的自托管模型)提供支持的答案,每个答案均附有引文和参考资料,因此您始终可以相信您得到的答复。

  • Danswer 使用最新的大语言模型来查找最相关的文档。

  • 自定义深度学习模型根据用户意图优化搜索。智能文本分块甚至可以防止细则丢失。

默认设置下,Danswer 使用 OpenAI 的 GPT 系列模型,你也可以根据需要在Danswer中使用开源模型,比如最近很火的Llama 2模型。

三、Danswer 实现原理

Danswer 是开源 NLP 和生成人工智能的最新技术的结合,Danswer 在执行用户查询请求到反馈结果的流程和原理如下:

1)、当用户提交查询时,首先通过用户意图模型进行处理,该模型确定是使用关键字搜索还是语义搜索。该模型是使用DistilBert检查点微调而成,使用由GPT提示生成的数据集,并手动过滤掉不良示例。

2)、语义搜索流程分为两个步骤:检索和重新排序。

  • 检索是通过使用双编码器模型对文本进行嵌入来完成的。向量存储在Qdrant向量数据库中,然后在查询时通过以相同方式投影用户查询来获取。在进行检索时会执行一些操作包括:上下文感知分块文档,包括跨块的重叠,并在不同尺度上多次嵌入块。一次使用512个标记进行更大的上下文,然后使用128个标记进行更精细的细节。

  • 对于重新排序,使用了一组不同的模型作为集合。通过组合在不同数据集上表现更好的多个模型,可以获得最佳的重新排序结果,甚至可以使用较小的模型,从而使步骤整体更快。

3)、最后,最相关的文档部分被传递给生成模型,该模型被提示也提供其答案的引用。然后将引用与源文档匹配,并将其与答案一起呈现给用户。

四、Danswer 快速部署

Danswer 提供了 Docker 容器,可以轻松部署在任何云上,无论是在单个实例上还是通过 Kubernetes。在本演示中,我们将使用 Docker Compose 在本地运行 Danswer。

  • 首先拉取代码:
git clone https://github.com/danswer-ai/danswer.git
  • 接下来导航到部署目录:
cd danswer/deployment/docker_compose
  • [可选] 默认的 Danswer 模型是 GPT-3.5-Turbo,因此如果您想使用它,则无需进行任何更改。

如果想使用开源的如Llama 2 模型API,可以通过创建 .env 文件来覆盖一些默认值,将 Danswer 配置为使用新的 Llama 2 端点:

INTERNAL_MODEL_VERSION=request-completion  # 将Danswer设置为使用requests而不是客户端库与LLM进行接口交互
GEN_AI_HOST_TYPE=colab-demo  # 将请求的头/主体设置为模型端点所期望的格式
GEN_AI_ENDPOINT=<REPLACE-WITH-YOUR-NGROK-PUBLIC-URL>/generate  # 设置模型端点URL
  • 启动Danswer(使用docker版本≥= 1.13.0):
docker compose -f docker-compose.dev.yml -p danswer-stack up -d --pull always --force-recreate
  • 完成后,Danswer 将在http://localhost:3000上可用访问。

有关 Danswer 的更多文档,请访问Quickstart - Danswer Documentation

五、Danswer 应用实践

5.1、添加文档到 Danswer

Danswer 提供了12种 Connectors 连接器用于将 Danswer 连接到你的数据源,以便答案基于你组织的知识来回答,如果目前内置的所有连接器不满足你的要求,也可以给官方提需求,或者自己基于开源代码来实现。将不同的数据源连接到 Danswer 是通过管理页面完成的,在右上角点击[Admin Panel]菜单即可进行设置。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=OTVhNDQzMTQyNDYwMzhlNDkyMjQwYmUzY2Y0NTNiYzRfYlc0cXRsWkQ4UWJTZGRWYVpNZ1JOT2dSb2kyQVlPRWVfVG9rZW46V04zdmJka0Y4b0FlcnJ4RjRYSWNBc3Z3bnpoXzE2OTIzNDgzOTg6MTY5MjM1MTk5OF9WNA

关于每个 Connectors 连接器具体的配置使用可以在官网文档中找到详细的介绍。

这里我们添加一个Web连接器数据源来演示,只需要将一个公开可访问的网址URL加入到Web连接器即可,Danswer会爬去该文档的内容来存储到向量数据库中。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=ZWQxZWZjNjIwZWM5YTU2ZWZlYzczZmQwMGVmNTNjNTNfNTFoQWJabFk0dkV4M3pWMGVlQ0hCT0ZMbDNScm9VRklfVG9rZW46RkRuc2JlOW0xb2RjU3p4TVRtWmM4bDI2bkVnXzE2OTIzNDgzOTg6MTY5MjM1MTk5OF9WNA

5.2、从 Danswer 获取答案

添加完数据源之后,我们就可以单击 Danswer 图标返回主页,现在就可以直接输入你文档相关的问题来索引了。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=NzIzY2E0OTBkOTFjZDM1YWFhM2Q2Y2MwY2E3MGM3YzVfcHZzamRlUXZQWkg1MGlGS0FwdzNKUEFaa2VGNE9GYktfVG9rZW46RWNSU2JCTWdIb1FKWUl4SmhiMGNNQTZVbnhIXzE2OTIzNDgzOTg6MTY5MjM1MTk5OF9WNA

六、结束语

Danswer 是一款优秀的开源企业知识问答系统,通过使用连接器,可以方便地将各种文档资料添加到向量数据库中进行索引。它允许用户针对内部文档提出自然语言问题,并获得可靠、有参考价值的答案。Danswer 的优势包括完全开源、免费使用、数据隐私安全以及支持即插即用不同的 LLM 模型。它还可以与许多常用工具(如 Slack、GitHub、Confluence 等)无缝连接,为企业提供高效且可靠的知识检索和问答解决方案。

七、References

  • Danswer GitHub:

  • https://github.com/danswer-ai/danswer

  • Danswer Docs:

  • Overview - Danswer Documentation

  • Dnaswer Connectors:

  • https://github.com/danswer-ai/danswer/blob/main/backend/danswer/connectors/README.md

def get_answers_by_page(topic_id, page_no): global db, answer_ids, maxnum limit = 10 offset = page_no * limit url = "https://www.zhihu.com/api/v4/topics/" + str( topic_id) + "/feeds/essence?include=data%5B%3F(target.type%3Dtopic_sticky_module)%5D.target.data%5B%3F(target.type%3Danswer)%5D.target.content%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%3Bdata%5B%3F(target.type%3Dtopic_sticky_module)%5D.target.data%5B%3F(target.type%3Danswer)%5D.target.is_normal%2Ccomment_count%2Cvoteup_count%2Ccontent%2Crelevant_info%2Cexcerpt.author.badge%5B%3F(type%3Dbest_answerer)%5D.topics%3Bdata%5B%3F(target.type%3Dtopic_sticky_module)%5D.target.data%5B%3F(target.type%3Darticle)%5D.target.content%2Cvoteup_count%2Ccomment_count%2Cvoting%2Cauthor.badge%5B%3F(type%3Dbest_answerer)%5D.topics%3Bdata%5B%3F(target.type%3Dtopic_sticky_module)%5D.target.data%5B%3F(target.type%3Dpeople)%5D.target.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics%3Bdata%5B%3F(target.type%3Danswer)%5D.target.annotation_detail%2Ccontent%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%3Bdata%5B%3F(target.type%3Danswer)%5D.target.author.badge%5B%3F(type%3Dbest_answerer)%5D.topics%3Bdata%5B%3F(target.type%3Darticle)%5D.target.annotation_detail%2Ccontent%2Cauthor.badge%5B%3F(type%3Dbest_answerer)%5D.topics%3Bdata%5B%3F(target.type%3Dquestion)%5D.target.annotation_detail%2Ccomment_count&limit=" + str( limit) + "&offset=" + str(offset) headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", } try: r = requests.get(url, verify=False, headers=headers) except requests.exceptions.ConnectionError: return False content = r.content.decode("utf-8") data = json.loads(content) is_end = data["paging"]["is_end"]
最新发布
03-29
<think>好的,我现在需要帮用户解决如何通过API实现知乎话题分页加载答案的Python代码示例。首先,我得回忆一下之前用户提供的参考引用,特别是引用[1]里提到的知乎API的结构和基本请求方法。用户已经有一个获取单个问题答案的示例,现在需要扩展到分页加载。 首先,分页通常是通过参数控制,比如offset和limit,或者page参数。我需要确认知乎API的分页机制。根据常见的REST API设计,可能使用offset和limit,或者类似的分页方式。查看引用[1]中的示例URL:https://www.zhihu.com/api/v4/questions/1000733/answers,推测可能需要添加查询参数如offset和limit来实现分页。 接下来,需要构造循环请求,每次获取一页的数据,直到没有更多数据为止。通常,API会在返回的数据中包含一个字段,比如paging中的is_end来指示是否还有更多页。用户需要解析这个字段来决定是否继续请求。 然后,处理请求头。知乎可能有反爬机制,需要添加User-Agent和可能的Authorization头,比如引用[1]中的示例没有提到,但实际中可能需要处理登录或使用cookie,或者使用API key。但用户的问题中没有提到登录,可能需要模拟浏览器请求的头部信息。 另外,分页参数的具体名称需要确定。比如,可能使用offset和limit,或者start和count。需要查阅知乎API文档,但用户可能没有权限,只能通过示例推断。在引用[1]的示例中,URL结构是固定的,所以可能需要通过参数来控制分页。假设参数是offset和limit,那么每次请求增加offset的值,直到返回的数据为空或者is_end为True。 编写代码时,需要循环发送请求,每次更新offset参数,并处理返回的JSON数据。同时,需要处理可能的错误,比如网络问题或API限制。代码结构可能包括一个循环,使用while True,在每次迭代中构造新的URL,发送请求,解析数据,并检查是否还有更多页。 还需要注意频率限制,知乎可能有请求频率限制,所以在代码中添加适当的延时,比如time.sleep(1)来避免被封IP。 最后,整合这些思路,写出示例代码,并解释关键步骤,比如URL构造、分页参数处理、循环终止条件等。确保代码符合用户的要求,使用requests库,处理分页,并能够正确解析数据。</think>以下是通过Python实现知乎话题分页加载答案的代码示例及分步说明: ### 分页请求实现步骤 1. **基础URL构造** 知乎答案接口格式为:`https://www.zhihu.com/api/v4/questions/{question_id}/answers`,通过`limit`和`offset`参数控制分页[^1]。 2. **添加请求头** 需设置`User-Agent`模拟浏览器访问,避免触发反爬机制。 3. **循环分页逻辑** 根据返回的`paging`字段判断是否到达最后一页(`is_end: true`)。 ### Python代码示例 ```python import requests import time def fetch_zhihu_answers(question_id, max_pages=5): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } base_url = f'https://www.zhihu.com/api/v4/questions/{question_id}/answers' offset = 0 page_count = 0 while page_count < max_pages: params = { 'include': 'data[*].content', 'limit': 5, # 每页数量 'offset': offset, 'platform': 'desktop', 'sort_by': 'default' } response = requests.get(base_url, headers=headers, params=params) if response.status_code != 200: print(f'请求失败,状态码:{response.status_code}') break data = response.json() answers = data.get('data', []) if not answers: break # 处理答案数据(示例:打印前20字符) for answer in answers: content = answer['content'][:20] + '...' print(f"答案ID:{answer['id']},内容片段:{content}") # 更新分页参数 paging = data.get('paging', {}) if paging.get('is_end'): break offset = paging.get('next').split('offset=')[-1].split('&')[0] page_count += 1 time.sleep(1) # 避免高频请求 # 使用示例:获取问题ID为1000733的前5页答案 fetch_zhihu_answers(question_id='1000733') ``` ### 关键参数说明 1. **`limit`** 控制每页返回的答案数量(最大值由知乎接口限制,通常为20) 2. **`offset`** 分页偏移量,表示从第几条答案开始获取 3. **`include`** 指定返回字段,`data[*].content`包含答案正文 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值