Terviklik lahendus AMD Ryzen AI Max+ 395 (Ryzen AI 9 HX 370?) platvormil Linuxis teadustööks PDF-töötlusega
Arvestades teie võimsat uut AI-protsessorit (mis sisaldab spetsiaalseid NPU kiirendiid), Linuxi kasutamist ja vajadust isoleeritud LLM-i järele, on oluline valida rakendused, mis:
Sinu Ryzen AI Max+ toetab kohalikku AI-töötlust NPU kaudu (XDNA2). Soovitan järgmisi valikuid:
Llama 3.2, Mistral, Qwen2.5 (vali ~7B parameetrit, et mahutada mälupiirangutesse).docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama.pdftotext), saad seda tekstifaili Ollama API kaudu analüüsida. Võid kirjutada lihtsa skripti (Pythonis requests teek), mis saadab teksti sinu isoleeritud LLM-ile ja tagastab kokkuvõtte.ryzenai GitHubi lehelt).pdftotext).See süsteem on tasakaalustatud, võimas ja keskendunud, kasutades ära teie riistvara AI-potentsiaali, säilitades samas lihtsuse ja isoleerituse.
llama.cpp vs Ollama: põhjalik võrdlus Linuxi AI-töövoogude jaoks
| Aspekt | llama.cpp | Ollama |
|---|---|---|
| Olemus | C++ raamistik LLM-de jooksutamiseks | Kõrgetasemeline rakendus/majutaja LLM-de jaoks |
| Liides | Primäärselt CLI, API, C++ teek | CLI + REST API + kergem GUI (Ollama WebUI) |
| Paigaldus | Käsitsi kompileerimine või eelkoostatud binaar | Üks käsk (curl või Docker), automaatne |
| Mudelid | GGUF formaat (väga lai valik) | Modelfile süsteem (kasutajasõbralik) |
| Riistvara tugi | CPU, CUDA, ROCm, Metal, Vulkan | CPU, CUDA, ROCm (NPU tugi areneb) |
| Isoleerimine | Käsitsi Docker/singularity | Sisseehitatud Docker tugi, lihtsam isoleerida |
| Seadistamine | Palju parameetreid, täpsem kontroll | Lihtsam, vähem seadistusi |
Tugevused:
-ngl parameetri--server võimaldab REST API-d, sarnaselt OllamaleNõrkused:
Tugevused:
ollama run llama3.2 ja kohe töötabNõrkused:
Kasuta mõlemat, erinevatel eesmärkidel:
Ollama - Peamine LLM-i kasutajaliides
llama.cpp - Spetsiaalsed/jõudluskriitilised ülesanded
Ollama (Dockeris isoleeritud):
docker run -d -v ollama_data:/root/.ollama -p 11434:11434 --name ollama --restart always ollama/ollama
docker exec ollama ollama pull llama3.2:7b
# API päring: curl http://localhost:11434/api/generate -d '{"model":"llama3.2:7b", "prompt":"..."}'
llama.cpp (otsene seadistus):
# Kompileeri ROCm toega
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make LLAMA_HIPBLAS=1
# Laadi GGUF mudel
./server -m models/llama-3.2-7b.Q4_K_M.gguf --port 8080
NPU tugi:
GPU (ROCm) tugi:
Praegune soovitus: Kuna NPU tugi on veel arenevas staadiumis Linuxis, alusta Ollamaga, mis pakub:
Kui NPU tugi stabiliseerub, hinnaku uuesti - llama.cpp võib saada esivalikuks NPU kasutamiseks.
Kasuta Ollamat järgmistel põhjustel:
llama.cpp hoidke varuvariandina juhuks, kui:
Minimaalne seadistus: Alusta Ollamaga Dockeris. Kui jõudlus ei rahulda, proovi llama.cpp ROCm toega.
Täielikult piisavad - täpselt see, mida vajad! Weaviate integreerimine muudab sinu süsteemi tõeliselt võimsaks teadustööks. Siin on terviklik lahendus sinu eesmärgiks:
PDF-d → Tekstiekstraktor → Chunking → Embeddings → Weaviate → RAG → LLM → Vastus
# Weaviate + tekstivektoriseerimise moodul
docker run -d \
--name weaviate \
-p 8080:8080 \
-p 50051:50051 \
-e QUERY_DEFAULTS_LIMIT=25 \
-e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
-e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
-e ENABLE_MODULES=text2vec-transformers \
-e TRANSFORMERS_INFERENCE_API=http://t2v-transformers:8080 \
--volume weaviate_data:/var/lib/weaviate \
semitechnologies/weaviate:1.24.0
# Transformers konteiner embeddingute jaoks
docker run -d \
--name t2v-transformers \
-p 8081:8080 \
-e ENABLE_CUDA=1 \
semitechnologies/transformers-inference:sentence-transformers-all-MiniLM-L12-v2
# Paigalda: pip install pymupdf python-multipart weaviate-client
import fitz # PyMuPDF
def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path)
text = ""
for page in doc:
text += page.get_text()
return text
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = text_splitter.split_text(extracted_text)
import weaviate
from weaviate.embedded import EmbeddedOptions
client = weaviate.Client(
embedded_options=EmbeddedOptions()
)
# Skema loomine
class_obj = {
"class": "ResearchPaper",
"vectorizer": "text2vec-transformers",
"properties": [
{
"name": "title",
"dataType": ["string"]
},
{
"name": "content",
"dataType": ["text"]
},
{
"name": "chunk_index",
"dataType": ["int"]
},
{
"name": "source_pdf",
"dataType": ["string"]
}
]
}
client.schema.create_class(class_obj)
# Andmete lisamine
for i, chunk in enumerate(chunks):
client.data_object.create(
data_object={
"title": pdf_title,
"content": chunk,
"chunk_index": i,
"source_pdf": pdf_filename
},
class_name="ResearchPaper"
)
import ollama
import weaviate
class ResearchAssistant:
def __init__(self):
self.weaviate = weaviate.Client("http://localhost:8080")
self.model = "llama3.2:7b"
def search_papers(self, query, limit=5):
# Vektorotsing Weaviates
result = self.weaviate.query.get(
"ResearchPaper", ["content", "title", "source_pdf"]
).with_near_text({
"concepts": [query]
}).with_limit(limit).do()
return result
def ask_question(self, question):
# 1. Otsi relevantseid lõike
relevant_chunks = self.search_papers(question)
# 2. Koosta kontekst
context = "\n\n".join([
f"[{chunk['title']}]: {chunk['content']}"
for chunk in relevant_chunks
])
# 3. Saada LLM-ile
prompt = f"""Vastad teaduslikule küsimusele alloleva konteksti põhjal.
Kontekst:
{context}
Küsimus: {question}
Vasta täpselt ja viita allikatele."""
response = ollama.chat(model=self.model, messages=[
{"role": "user", "content": prompt}
])
return {
"answer": response['message']['content'],
"sources": relevant_chunks
}
#!/bin/bash
# import_papers.sh
for pdf in ./papers/*.pdf; do
echo "Töötlen: $pdf"
python3 -c "
import sys
from paper_importer import PaperImporter
importer = PaperImporter()
importer.import_paper('$pdf')
print(f'Lisatud: {sys.argv[1]}')
"
done
# app.py
import streamlit as st
from research_assistant import ResearchAssistant
st.title("Teaduslik Uurimisassistent")
assistant = ResearchAssistant()
question = st.text_input("Esita küsimus oma artiklite kohta:")
if question:
with st.spinner("Otsin vastust..."):
result = assistant.ask_question(question)
st.markdown("### Vastus:")
st.write(result["answer"])
st.markdown("### Allikad:")
for source in result["sources"]:
with st.expander(f"{source['title']}"):
st.write(source['content'])
Sinna süsteem:
┌─────────────────┐
│ 1000+ PDF-d │
└────────┬────────┘
│
┌────────▼────────┐
│ PyMuPDF ekstrak│
└────────┬────────┘
│
┌────────▼────────┐
│ Text Splitter │
│ (chunking) │
└────────┬────────┘
│
┌────────▼────────┐
│ Weaviate Client │
│ + embeddings │
└────────┬────────┘
│
┌────┴────┐
│Weaviate │
│VektorDB │
└────┬────┘
│
┌────────▼────────┐
│ RAG Süsteem │
│ (Ollama API) │
└────────┬────────┘
│
┌────────▼────────┐
│ Vastus │
└─────────────────┘
Paralleelne importimine:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(import_paper, pdf_files)
Vahemälu embeddingutele - väldi dubleerivaid arvutusi
Indekseerimise ajastamine - cron job ööseseks importimiseks
# Viidete ekstraheerimine
def extract_citations(text):
# Kasuta regex või spetsiaalseid teeke
pass
# Autorite ja institutsioonide tuvastamine
def extract_authors(text):
pass
# Kokkuvõtete automaatne genereerimine
def generate_summaries(papers):
pass
# 1. Paigalda Docker
sudo apt install docker.io docker-compose
# 2. Käivita Weaviate
docker-compose up -d
# 3. Paigalda Pythoni teegid
pip install weaviate-client pymupdf langchain ollama streamlit
# 4. Seadista Ollama
docker run -d -p 11434:11434 ollama/ollama
docker exec ollama ollama pull llama3.2:7b
# 5. Importi andmed
python import_all_papers.py /path/to/pdf/folder
Jah, sinu tööriistad on täielikult piisavad! Weaviate integreerimine:
Eelised sinu praeguse süsteemi peal:
Soovitan alustada väiksema testkoguga (50-100 artiklit), et optimeerida chunking ja embedding parameetreid enne kogu 1000+ artikli importimist.
Kas soovid konkreetsemat koodinäidet mõne etapiga?