RAG(Retrieval-Augmented Generation,检索增强生成)可以让大模型根据我们的行业专有数据生成内容,从而减少大模型的“幻觉”,关于RAG的原理网上介绍了不少了,这里介绍一种基于Agentscope的RAG简单实现。

一、embeding模型部署

1.1.ollama模型部署

RAG需要使用embeding模型将知识库中文字转化为特征向量的模型,这里使用ollama进行的本地部署,也可以用其他模型实现。相关的部署代码如下:

# 1. 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh

# 2. 启动服务
sudo systemctl enable ollama
sudo systemctl start ollama

下载embeding模型

# 3. 拉取 embedding 模型
ollama pull mxbai-embed-large

模型下载结果:

下载完毕后可以通过ollama list查看模型:

测试模型:

# 4. 测试
curl http://localhost:11434/api/embed -d '{
  "model": "mxbai-embed-large",
  "input": "奶牛行为识别系统"
}'

可以看到模型可以将中文转化为向量

1.2.agentscope调用

使用agentscope关于Ollama Embedding模型的调用模块:

from agentscope.embedding import OllamaEmbedding
self._embedding_model = OllamaEmbedding(
    model_name="mxbai-embed-large",
    base_url=ollama_base_url,
    dimensions=1024,
)

二、RAG的实现

2.1.小型知识库构建

这里在我们自己定义的RAG服务中,搭建了一个小型的奶牛知识数据库,其文件结构如下:

knowledge_base/
├── diseases/              # 疾病类知识
│   ├── fever_infection.md         # 发热与感染
│   ├── limping.md                 # 跛行诊断
│   ├── mastitis.md                # 乳房炎
│   └── respiratory_problem.md     # 呼吸道问题
│
├── sop/                   # 标准操作流程(Standard Operating Procedures)
│   ├── isolation_observation.md   # 隔离观察流程
│   ├── manual_review.md           # 人工复核流程
│   └── recheck_priority.md        # 复检优先级
│
└── symptoms/              # 症状类知识
    ├── abnormal_behavior.md       # 异常行为
    ├── loss_of_appetite.md        # 食欲减退
    └── respiratory_symptom.md     # 呼吸道症状

2.2.知识向量库构建

embeding 模型部署好后,使用Agentscope提供的专门的RAG实现库,其封装了RAG实现的复杂逻辑,方便快速实现功能。

这里textreader的作用是进行文档切分,其会对文档按照512长度单位进行切分,分为一个个小的chunk,随后embedding模型会对每一个chunk进行特征提取

from agentscope.rag import TextReader
# 创建文本读取器
reader = TextReader(chunk_size=512, split_by="paragraph")

这里设定了使用内存存储知识向量库,SimpleKnowledge用于构建知识库。

from agentscope.rag import InMemoryStore
from agentscope.rag import QdrantStore, SimpleKnowledge

    self._vector_store = InMemoryStore(
        dimensions=1024,
    )
    self._store = SimpleKnowledge(
        embedding_model=self._embedding_model,
        embedding_store=self._vector_store,
        )

2.3.知识向量库使用

通过retrieve方法进行检索增强,其会输出与用户query最相关的文档内容,将这部分内容与用户输入一起输入大模型中,实现了检索增强生成

results = self._store.retrieve(
    query=query.question,
    limit=self.top_k,
)

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐