生物黑客你的健康:构建基于科学的补充剂顾问,使用 Qdrant 与 PubMed 🧪
Source: Dev.to
如果你曾经花费数小时在 Reddit 或健身论坛上滚动,想弄清楚 NMN 或 Creatine 是否真的有效,你就会明白这种挣扎。bro‑science 与经过同行评审的临床数据之间存在巨大的鸿沟。在 Biohacking 的世界里,信息就是力量,但前提是它必须准确。
今天,我们将构建一个生产级 RAG architecture(检索增强生成)来弥合这一鸿沟。我们将使用 Vector Database 来存储来自 PubMed 的高保真嵌入,从而能够在数千篇医学摘要中执行 Semantic Search。在本指南结束时,你将拥有一个本地知识库,能够用真实的科学引用来回答你的补剂问题。🚀
The Architecture 🏗️
为了构建一个可靠的生物黑客工具,我们需要一个能够处理数据摄取、嵌入和检索的流水线。下面展示了数据从 PubMed 研究论文流向终端的过程:
graph TD
A[PubMed Search Query] --> B[BeautifulSoup Scraper]
B --> C[Text Chunking - LangChain]
C --> D[Sentence Transformers - Embeddings]
D --> E[(Qdrant Vector DB)]
F[User Question] --> G[Query Embedding]
G --> H{Similarity Search}
E --> H
H --> I[Context + Prompt]
I --> J[LLM Response with Citations]
前置条件 🛠️
确保你的 tech_stack 中包含以下内容:
- Python 3.9+
- Qdrant – 高性能向量数据库
- Sentence Transformers – 用于生成本地嵌入
- LangChain – 我们 RAG 流程的粘合剂
- BeautifulSoup – 用于解析 PubMed 的 HTML
pip install qdrant-client sentence-transformers beautifulsoup4 langchain langchain-community
第一步:抓取 PubMed 研究 📄
PubMed 是医学研究的黄金标准。虽然它提供了 API(Entrez),但有时我们需要抓取特定的元数据或处理动态查询。下面是一段强大的示例代码,帮助我们入门。
import requests
from bs4 import BeautifulSoup
def fetch_pubmed_abstracts(query: str, max_results: int = 10):
base_url = f"https://pubmed.ncbi.nlm.nih.gov/?term={query}"
response = requests.get(base_url)
soup = BeautifulSoup(response.text, "html.parser")
# 抓取文章链接(限制为 max_results 条)
links = [
f"https://pubmed.ncbi.nlm.nih.gov{a['href']}"
for a in soup.select('.docsum-title', limit=max_results)
]
abstracts = []
for link in links:
page = requests.get(link)
page_soup = BeautifulSoup(page.text, "html.parser")
abstract_div = page_soup.find('div', id='eng-abstract')
if abstract_div:
abstracts.append({
"source": link,
"content": abstract_div.get_text().strip()
})
return abstracts
# 示例:获取 NMN 相关数据
data = fetch_pubmed_abstracts("NMN supplement longevity", max_results=5)
print(f"Fetched {len(data)} abstracts!")
第2步:使用 Qdrant 对证据进行向量化 🧠
仅存储原始文本是不够的;我们需要存储文本的含义。这正是 Qdrant 发挥作用的地方。我们将使用 Sentence Transformers 将摘要转换为 384 维向量。
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain.schema import Document
# Initialise (or use :memory: for testing)
client = QdrantClient(path="./qdrant_db")
# Create a collection for our supplements
client.recreate_collection(
collection_name="biohacking_science",
vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)
# Initialise embeddings
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
# Prepare documents for LangChain
docs = [
Document(page_content=item["content"], metadata={"source": item["source"]})
for item in data
]
# Upload to Qdrant
vectorstore = Qdrant(
client=client,
collection_name="biohacking_science",
embeddings=embeddings,
)
vectorstore.add_documents(docs)
print("Vector database is ready! 🥑")
第3步:RAG 实现 🤖
现在我们可以查询数据库。与关键词搜索不同,我们进行语义搜索。如果你询问“肌肉恢复”,系统会找到关于“肌酸单水合物”的论文,即使标题中没有出现 recovery 这个词。
from langchain.chains import RetrievalQA
from langchain_community.llms import OpenAI # or use a local model like Llama3
# Setup the retriever
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# Example query
query = "What are the benefits of NMN for mitochondrial health?"
found_docs = retriever.get_relevant_documents(query)
for i, doc in enumerate(found_docs, start=1):
print(f"Source {i}: {doc.metadata['source']}")
print(f"Snippet: {doc.page_content[:200]}...\n")
超越基础 🚀
虽然这个脚本是一个很好的起点,但面向生产的生物黑客工具需要更高级的模式——比如 混合搜索(结合关键词搜索和向量搜索)和 重新排序,以确保最具临床相关性的论文首先出现。
💡 开发者专业提示: 欲获取更多面向生产的示例和 AI 驱动的医疗数据工程高级模式,请查看原文中链接的工程资源。
深入探讨
查看 WellAlly Blog 以获取关于在真实医疗应用中扩展这些架构的详细文章。
结论
通过摆脱静态书签,转向 基于 Qdrant 的 RAG 系统,你已经把一堆混乱的 PDF 和 URL 库变成了可查询的、智能的研究助理。生物黑客本质上是一个数据工程挑战——你能够检索到的越多干净、基于证据的数据,决策就会越好。
接下来怎么办?
- 基于向量距离添加置信分数。
- 集成 cron 任务,每周自动更新你的 PubMed 数据库。
- 部署为 FastAPI 接口,接入你的移动健康仪表盘。
祝你玩得开心!保持科学精神。 🧬💻
本教程对你有帮助吗?在下方留下你下一个要研究的补剂评论吧! 👇