当前位置: 首页 > backend >正文

openai agents sdk实战-基于Ollama+qwen2.5+milvus+bge-large-zh-v1.5实现本地知识库

目录

0 环境准备

1 开发环境准备

1.1 创建项目python环境

1.2 在pycharm创建项目

1.3 安装项目依赖

2 资源准备

3 程序逻辑实现

3.1 导入相关依赖包

3.2 加载配置文件

3.3 获取milvus集合

3.4 定义查询工具

3.5 定义获取openai client

3.6 定义获取大模型

3.7 定义agent

3.8 定义程序主流程

3.9 定义main方法

4 完整代码

5 测试

5.1 调用流程

5.2 测试结果

 附录

配置文件.env


0 环境准备

  • ollama已部署推理模型qwen:7b
  • ollama已部署嵌入模型bge-large-zh-v1.5
  • 已安装miniconda环境

1 开发环境准备

1.1 创建项目python环境

通过conda命令创建项目的python开发环境

 conda create -n mcp_demo python=3.10

1.2 在pycharm创建项目

​​

  • 解释器类型:选择自定义环境
  • 环境:选择现有
  • 类型:选择conda
  • 环境:选择上一步创建的环境

1.3 安装项目依赖

安装openai、openai-agents openai mivlus相关依赖

 pip install openai python-dotenv openai-agents pymilvus

2 资源准备

        本项目中需要读取本地搭建的milvus向量数据库存储的内容,回答相关问题,因此需要先构建好本地milvus数据库服务。可参考以下内容搭建:

milvus实战-基于Ollama+bge-large-zh搭建嵌入模型,fastAPI提供http服务将PDF文件写入milvus向量库_bge milvus-CSDN博客

构建完成后请求上传pdf文件http接口,将pdf文件存储至milvus服务器后,此时milvus库中pdf-documents队列已存在数据,后续章节的查询基于以上博客的内容完成。

        知识库和问答系统拆开构建是大规模部署的解决方案,也能节省问答过程中构建向量库的时间,提高问答系统效率,也避免了重复构建向量库。

3 程序逻辑实现

        程序主要逻辑是先接收输入的问题,去milvus数据库中查询相关内容,定义agent只能根据定义的工具获取查询的结果,再调用大模型基于查询结果回答输入的问题。

3.1 导入相关依赖包

import logging
import osfrom agents import set_default_openai_client, Runner, OpenAIChatCompletionsModel, Agent, function_tool, FileSearchTool
from dotenv import load_dotenv
from openai import AsyncOpenAI, OpenAI
from pymilvus import connections, Collection

3.2 加载配置文件

load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
base_url = os.getenv('BASE_URL')
logging.getLogger("openai").setLevel(logging.CRITICAL)   # 屏蔽INFO/WARNING级别日志

3.3 获取milvus集合

def get_milvus_collection():connections.connect(alias="default", host="localhost", port="19530")collection = Collection("pdf_documents")  # 加载已存在的Milvus集合return collection

3.4 定义查询工具


@function_tool
def milvus_retriever(query, top_k=3):"""查询知识库,获取数据库选型技术指导:param query: 必要参数,字符串类型,用于表示查询的具体内容。:param top_k: 可选参数,整数类型,用于表示返回的结果数量,默认为3。:return:返回一个包含查询结果的列表,每个结果是一个字典,包含文本和来源信息。"""client = OpenAI(base_url=base_url, api_key=api_key)collection = get_milvus_collection()embeddings_model = os.getenv('EMBEDDINGS_MODEL')# 将查询文本向量化response = client.embeddings.create(input=query, model=embeddings_model)query_vector = response.data[0].embeddingsearch_params = {"search_type":"similarity"}results = collection.search(data=[query_vector],anns_field="vector",param=search_params,limit=top_k,output_fields=["content", "source"])return [{"text": hit.entity.get("content"),  "source": hit.entity.get("source")}  for hit in results[0]]

3.5 定义获取openai client

def get_openai_client():return AsyncOpenAI(api_key=api_key,base_url=base_url)

3.6 定义获取大模型

def get_chat_model(external_client):model_name = os.getenv('MODEL')return OpenAIChatCompletionsModel(model=model_name,openai_client=external_client)

3.7 定义agent

def get_agent(model):return Agent(name = "知识库",instructions = "你是一名一个知识库助手,只能调用本地定义的工具,查询知识库的内容回答问题,如果没有相关内容,回答不知道。",tools = [milvus_retriever],model = model)

3.8 定义程序主流程

async def run_request():external_client = get_openai_client()set_default_openai_client(external_client)agent = get_agent(get_chat_model(external_client))result = await Runner.run(agent,"爱奇艺选用了哪些数据库?")return result.final_output

3.9 定义main方法

if __name__ == "__main__":import asyncioprint(asyncio.run(run_request()))

4 完整代码

import logging
import osfrom agents import set_default_openai_client, Runner, OpenAIChatCompletionsModel, Agent, function_tool, FileSearchTool
from dotenv import load_dotenv
from openai import AsyncOpenAI, OpenAI
from pymilvus import connections, Collectionload_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
base_url = os.getenv('BASE_URL')
logging.getLogger("openai").setLevel(logging.CRITICAL)   # 屏蔽INFO/WARNING级别日志def get_milvus_collection():connections.connect(alias="default", host="localhost", port="19530")collection = Collection("pdf_documents")  # 加载已存在的Milvus集合return collection@function_tool
def milvus_retriever(query, top_k=3):"""查询知识库,获取数据库选型技术指导:param query: 必要参数,字符串类型,用于表示查询的具体内容。:param top_k: 可选参数,整数类型,用于表示返回的结果数量,默认为3。:return:返回一个包含查询结果的列表,每个结果是一个字典,包含文本和来源信息。"""client = OpenAI(base_url=base_url, api_key=api_key)collection = get_milvus_collection()embeddings_model = os.getenv('EMBEDDINGS_MODEL')# 将查询文本向量化response = client.embeddings.create(input=query, model=embeddings_model)query_vector = response.data[0].embeddingsearch_params = {"search_type":"similarity"}results = collection.search(data=[query_vector],anns_field="vector",param=search_params,limit=top_k,output_fields=["content", "source"])return [{"text": hit.entity.get("content"),  "source": hit.entity.get("source")}  for hit in results[0]]def get_openai_client():return AsyncOpenAI(api_key=api_key,base_url=base_url)def get_chat_model(external_client):model_name = os.getenv('MODEL')return OpenAIChatCompletionsModel(model=model_name,openai_client=external_client)def get_agent(model):return Agent(name = "知识库",instructions = "你是一名一个知识库助手,只能调用本地定义的工具,查询知识库的内容回答问题,如果没有相关内容,回答不知道。",tools = [milvus_retriever],model = model)async def run_request():external_client = get_openai_client()set_default_openai_client(external_client)agent = get_agent(get_chat_model(external_client))result = await Runner.run(agent,"爱奇艺选用了哪些数据库?")return result.final_outputif __name__ == "__main__":import asyncioprint(asyncio.run(run_request()))

5 测试

5.1 调用流程

5.2 测试结果

 附录

配置文件.env

http://www.xdnf.cn/news/2731.html

相关文章:

  • 在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战
  • 动态规划
  • 在g2o中,顶点(Vertex)和边(Edge)插入到概率图的流程
  • 迈瑞医疗:国际业务增长21.28% 发展中国家成重要增长引擎
  • 如何修复卡在恢复模式下的 iPhone:简短指南
  • 配置管理平台Nacos01:基础安装教程和启动运行
  • 第十五届中国国际道路交通安全产品博览会回顾
  • 2025年ISA Trans SCI2区TOP:超级哈里斯鹰算法Super-HHO+高功率机车悬挂载荷偏差控制,深度解析+性能实测
  • 5G育种技术之植物性状订制
  • 智慧健康养老实训室建设方案:科技引领养老健康服务人才培养
  • 第十六节:开放性问题-Vue与React Hooks对比
  • 使用阿里云 CDN 保护网站真实 IP:完整配置指南
  • Wireshark快速入门--对启动的后端程序进行抓包
  • 杰里芯片 7083G 之通话数据dump
  • Java基础361问第16问——枚举为什么导致空指针?
  • GPU虚拟化实现(五)
  • LeetCode热题100--560.和为K的子数组(前缀和)--中等
  • 自动化测试的三种等待方式
  • 算法笔记.染色法判断二分图
  • mitt 事件发布-订阅库在 react 中的使用
  • 简单理解https与http
  • 邮件分类特征维度实验分析
  • 软件测试全流程与主流测试方法详解:从理论到实战
  • 快乐数(双指针解法)
  • 1.57g 五一优选 = 雨晨 26100.3915 Windows 11 IoT 企业版 LTSC 2025 极速版(轻)
  • Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
  • 【JAVAFX】controller中反射调用@FXML的点击事件失败
  • el-table 自定义列、自定义数据
  • 【学习笔记】RL4LLM(三)
  • 【设计模式】GOF概括