How JD’s Young AI Engineers Tackle Real-World Model Challenges

Young JD algorithm engineers share how they solve tough AI problems—from optimizing large‑model training and reward‑model design for ad image generation, to building LLM‑based query expansion, agent evaluation, and model pruning with FFT and RDP—illustrating practical breakthroughs and personal growth in cutting‑edge AI research.

JD Cloud Developers
JD Cloud Developers
JD Cloud Developers
How JD’s Young AI Engineers Tackle Real-World Model Challenges

In JD Retail's technology team, many post‑95 algorithm engineers have quickly taken on tough AI problems, proving that doing difficult but correct work accelerates growth.

Technical Challenge: Advertising Image Evaluation

Evaluating whether an ad image meets quality standards is highly subjective; existing reward models cannot precisely guide AI to understand complex aesthetic and commercial requirements. The proposed solution combines multiple small reward models—each focusing on a specific issue such as shape, placement, or color—to replace a single large model. During training, a generative model creates ad images, which are scored by the ensemble of reward models; reinforcement learning fine‑tunes the generator. In inference, the same ensemble decides if an image can be published without human review, achieving 98% usable image rate and a 30% recall improvement.

Technical Challenge: Query Expansion in Search

Traditional neural‑machine‑translation‑based query expansion struggles with novel user intents, leading to low recall for searches like “wellness gadget.” The team adopted a large‑model‑plus‑reinforcement‑learning approach, pre‑training a LLM on e‑commerce data, fine‑tuning it on high‑quality query‑expansion pairs, and finally applying RL with multi‑granularity rewards simulated from a search engine. This pipeline boosted conversion rates in online experiments.

Technical Challenge: Agent Full‑Chain Evaluation

To evaluate AI agents across diverse tasks, the team built an end‑to‑end assessment framework that applies different scoring criteria for closed‑answer and open‑ended problems, separating model‑generated quality from environment feedback. The system can distinguish “AI thought correct but execution failed” from “AI thought wrong,” enabling precise diagnosis and targeted optimization.

Technical Challenge: Model Pruning for Efficient AIGC

Large text‑to‑image models consume excessive compute in e‑commerce scenarios. The engineers used Fast Fourier Transform (FFT) to analyze frequency‑domain differences between useful and redundant model components, then applied the Ramer‑Douglas‑Peucker (RDP) algorithm to detect critical change points in the spectrum. This combined method removed unnecessary blocks, increasing training throughput by 40% without harming performance.

def rdp(points, epsilon):
    """Ramer‑Douglas‑Peucker algorithm for curve simplification.
    points: sequence of points on the curve
    epsilon: tolerance, larger values yield more simplification
    """
    def perpendicular_distance(pt, line_start, line_end):
        if np.array_equal(line_start, line_end):
            return np.linalg.norm(pt - line_start)
        else:
            return np.abs(np.cross(line_end - line_start, line_start - pt)) / np.linalg.norm(line_end - line_start)
    def rdp_recursion(points, epsilon):
        dmax = 0.0
        index = 0
        end = len(points)
        for i in range(1, end - 1):
            d = perpendicular_distance(points[i], points[0], points[-1])
            if d > dmax:
                index = i
                dmax = d
        if dmax > epsilon:
            results1 = rdp_recursion(points[:index+1], epsilon)
            results2 = rdp_recursion(points[index:], epsilon)
            return results1[:-1] + results2
        else:
            return [points[0], points[-1]]
    return rdp_recursion(points, epsilon)
def get_token_prob(prompt, target_token):
    # Encode input and locate prediction position
    inputs = tokenizer(prompt, return_tensors="pt")
    input_ids = inputs.input_ids
    target_len = len(tokenizer.encode(target_token, add_special_tokens=False))
    # Get model output logits
    with torch.no_grad():
        outputs = model(**inputs)
    next_token_logits = outputs.logits[:, -1, :]  # last position
    # Convert to probability distribution
    probs = F.softmax(next_token_logits, dim=-1)
    # Get target token id (handle multi‑token case)
    target_ids = tokenizer.encode(target_token, add_special_tokens=False)
    # Return probability of the token
    return probs[0, target_ids[0]].item()

My Growth Notes: I continuously reflect on each project, summarizing successes and failures into reusable methodologies, tracking top‑conference papers, and staying active in open‑source communities. This habit accelerates problem identification and solution design, turning technical challenges into opportunities for innovation.

Team photo
Team photo
Ad image example
Ad image example
Reward model diagram
Reward model diagram
Query expansion flow
Query expansion flow
Agent evaluation diagram
Agent evaluation diagram
FFT analysis illustration
FFT analysis illustration
Team discussion
Team discussion
Search scenario
Search scenario
Model training pipeline
Model training pipeline
Growth illustration
Growth illustration
AIlarge language modelsreinforcement learningalgorithm engineeringmodel pruningQuery Expansionreward modeling
JD Cloud Developers
Written by

JD Cloud Developers

JD Cloud Developers (Developer of JD Technology) is a JD Technology Group platform offering technical sharing and communication for AI, cloud computing, IoT and related developers. It publishes JD product technical information, industry content, and tech event news. Embrace technology and partner with developers to envision the future.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.